GPSで遊ぶ (2)ウェイポイント (2006.10.14)
ギャラリーのトップへもどる
平地では結構精度よく測位できるようですが、山では大したことないだろうと 意地悪なことを考えて高尾山に行ってきました。10年ほど昔のことですが、 トリンブルのGeoExplorerを借りて山へ持って行ったところ、稜線から数mでも 下ると山体の遮蔽で取れないし、稜線上でも樹林帯だと不安定になってとんでもない 場所にポイントが落ちたりした経験から、GPSで位置を記録しようというのは 林間での作業では実用的でないと思っていました。
ところが実際にログをマップに落としてみると、左図のように山道に沿って しっかり取れているではありませんか。これには正直なところたまげました。
コースは自然観察路6号路という沢沿いの山道を選び、途中から稲荷山コースの 稜線に出て山頂へ。上の図で青い旗が立っているところで取った写真を左に 示します。標高は低いのに山は深く、しかも樹高20mを超す杉が生えているという GPSにとっては劣悪な条件下でも、ログはほとんど山道を外れていません。
写真を撮ったり、沢を横切る地点や尾根に出たところなど、要所ゝゝで ウェイポイントを記録しています。これは「登録」というボタンを押すだけ なので簡単です。GPSmap60CSxではポイントの名称やコメントを日本語で (Shift-JISで)入力できるのですが、これは現場では実用的ではなく、 ポイント番号と作業内容を野帳にメモるのが現実的のように思います。
背景の地図には国土地理院の数値地図25000(地図画像) 「東京」の一部を使用しました。


USBで直読みできるGPXファイルにはトラックポイントしか記録されていません。 ウェイポイントのデータを取得するために、シリアルケーブルで接続して カシミールで読み出してから改めてGPX形式で保存しました。後からわかったの ですが、USBドライバをGARMINのサイト( http://www.garmin.com/)からダウンロードすれば シリアルケーブルを用意しなくてもカシミールからUSB経由でデータを 吸い上げられるので、これからトライしてみようという方は純正シリアルケーブル をこのためだけに購入しなくても大丈夫です。

ウェイポイントのシェープファイルを作成するには下記のAvenueスクリプトを 使っています。中で呼んでいるサブルーチン「extractValue」は10/6掲載の コード(多少修正しました)を参照してください。また、カシミールで トラックログをGPXに落としたときのために、10/6づけで 掲載したトラックログ変換のスクリプトにも修正を加えました。

'カシミールからGPX形式で出力したウェイポイントを
'シェープファイルに変換する
'
'2006/10/14 (C)雨宮 有/GIS Institute, Inc.

inFN = FileDialog.Show("*.gpx","GPSログファイル(*.gpx)","ログファイルを選択")
logDate = inFN.GetBaseName.Left(inFN.GetBaseName.count - 4)
logPath = inFN.ReturnDir.AsString
p_name = logPath + "\" + logDate + "_p.dbf"

'入力
inFile = LineFile.Make( inFN, #FILE_PERM_READ )

'出力:
pointFTab = FTab.MakeNew( p_name.AsFileName, point )
pShape = pointFTab.FindField("Shape")
pID    = Field.Make("Point_ID",  #FIELD_LONG,    8, 0)
pLAT   = Field.Make("Latitude",  #FIELD_DOUBLE, 12, 6 )
pLON   = Field.Make("Longitude", #FIELD_DOUBLE, 12, 6 )
pELV   = Field.Make("Elevation", #FIELD_DOUBLE, 12, 3 )
pDT    = Field.Make("DateTime",  #FIELD_CHAR,   20, 0 )
pName  = Field.Make("Name",      #FIELD_CHAR,   20, 0 )
pCmt   = Field.Make("Comment",   #FIELD_CHAR,   20, 0 )
pIdent = Field.Make("Ident",     #FIELD_CHAR,   20, 0 )
pIcon  = Field.Make("Icon",      #FIELD_CHAR,   20, 0 )
pointFTab.AddFields({pID,pLAT,pLON,pELV,pDT,pName,pCmt,pIdent,pIcon})

'二重引用符文字
quote = 34.AsChar

'ログの読み込みと変換
aLine = inFile.ReadElt '<?xml>
aLine = inFile.ReadElt '<gpx>
aLine = inFile.ReadElt.Trim

while (inFile.IsAtEnd.Not)
  
  if (aLine = "</gpx>") then 'ファイルをクローズして終了
    inFile.CLose
    pointFTab.SetEditable( false )
    exit
  end

  if (aLine.Contains("<wpt")) then '新しいウェイポイントの開始
    '座標を取得
    strArray = aLine.AsTokens(quote)
    vLat = strArray.Get(1).AsNumber
    vLon = strArray.Get(3).AsNumber
  end

  if (aLine.Contains("<ele>")) then elevation = av.Run("extractValue",{aLine}) end
  if (aLine.Contains("<time>")) then datetime = av.Run("extractValue",{aLine}) end
  if (aLine.Contains("<name>")) then trackName = av.Run("extractValue",{aLine}) end
  if (aLine.Contains("<cmt>")) then cmt = av.Run("extractValue",{aLine}) end
  if (aLine.Contains("<kashmir3d:ident>")) then ident= av.Run("extractValue",{aLine}) end
  if (aLine.Contains("<kashmir3d:icon>")) then icon_code = av.Run("extractValue",{aLine}) end
  if (aLine.Contains("</wpt>")) then
    'ポイントを作成
    pointRec = pointFTab.AddRecord
    pointFTab.SetValue( pID   , pointRec, pointRec )
    pointFTab.SetValue( pLAT,   pointRec, vLat )
    pointFTab.SetValue( pLON,   pointRec, vLon )
    pointFTab.SetValue( pShape, pointRec, Point.Make(vLon,vLat) )
    pointFTab.SetValue( pELV,   pointRec, elevation )
    pointFTab.SetValue( pDT ,   pointRec, datetime )
    pointFTab.SetValue( pName,  pointRec, trackName )
    pointFTab.SetValue( pCmt,   pointRec, cmt )
    pointFTab.SetValue( pIdent, pointRec, ident )
    pointFTab.SetValue( pIcon,  pointRec, icon_code )
  end
    
  '次の行を読む
  aLine = inFile.ReadElt.Trim
end '/while(inFile.IsAtEnd.Not)
ギャラリーのトップへもどる

©2003-2006, 有限会社GISインスティテュート. All rights reserved.
〒183-0035 東京都府中市四谷3-49-18
電話・FAX:042-405-3901
gis-i@nifty.com