基盤地図情報50m標高を変換してみた

まあ、仕様書とにらめっこして、データを取っていけばいいだけなので問題なし。読み飛ばしで問題があったんですが。

XPathを使ってみた

ファイルシステムよろしく "/" で要素を区切ってパスを表現して、このパス条件に合致する要素を引き出すというもの。ただし名前空間は自前で指定してやる必要があります。デフォルトの名前空間も厳密に指定してあげる必要があります。
次のような名前空間解決のためのオブジェクトを用意します。

        Dim xmlNameMgr As New System.Xml.XmlNamespaceManager(xpNav.NameTable)
        xmlNameMgr.AddNamespace("default", "http://fgd.gsi.go.jp/spec/2008/FGD_DLD_Schema")
        xmlNameMgr.AddNamespace("jps", "http://www.gsi.go.jp/GIS/jpgis/standardSchemas2.0_2008-03")

パスを見つけるのは次の通り。

 Dim xpVarsDem As System.Xml.XPath.XPathNodeIterator
xpVarsDem = xpNav.Select("/default:GI/default:dataset/default:DEM", xmlNameMgr)

基盤地図情報(JPGIS)の50m標高の場合です。他のデータでは別のパスやらになることと思います。
でも、なんか面倒くさい…。

50m標高でズレが生じたが仕様書ちゃんと見ろと何度も(以下略)

50m標高は2次メッシュで1ファイル、1ファイルごとに標高点が200*200の40000個あるというもの。標高点要素自体には位置情報が無く、メッシュコードとかで隅っこを計算して、左上(北西)から右下(南東)にシリアルに並べているのを前提に
…という認識に若干間違いが。
まず気づいたのが40000個無いというもの。末尾を切ってる場合があります。
40000個無いのを考慮しても、別のところで、サイクリックにずれた感じのものが出ました。
で仕様書読み返すと、開始メッシュ位置が 0 0 とは限らないです。
ていうかXMLみたいな冗長なもの使うんだったら、40000個でそろえてくれたらいいのに…。

出力は内緒というわけではないけど

読み込んだあとは、EWKBをhexで出すクラスを作っていたので、それを使用してPostGISダンプ形式で出力しました。これ載っけるのと大変長いのでパス。シェープで出すクラスを作ってたと思ったら、作ってなかったorz
そこで、いったんPostGISに出してpgsql2shpを使うという、とてつもなく回りくどい方法で出力しました。