ogrでチャカチャカっとベクタデータを作成する

たとえば、ラスタデータの地理範囲が数字では分かってるけど、ベクタデータになっていなくて、GISのレイヤにできない、そういうことがたまにあるかも知れません。

…現に今直面してました。

WKT

数字として分かっている場合には WKT を使うとコピペとちょっと飾りをつけてやるだけで表現できます。

ポイント、ラインストリング、ポリゴンのWKTの例はそれぞれ次のようになります。

POINT(135 35)
LINESTRING(135 35, 135 36, 136 36, 136 35, 135 35)
POLYGON( (135 35, 135 36, 136 36, 136 35, 135 35) )

注意すべき点は次の通りです。

  • 点ごとの区切りはコンマで、座標値ごとの区切りは空白 (座標値もコンマ区切りをするとパーサがエラーと認識する)
  • 座標値は 東西、南北の順に固定されている (EPSGエントリに依存しない)

CSVデータの作成

CSVデータを作成します。属性値とジオメトリとをまぜて書いちゃって下さい。

  • 1行目はフィールド名
  • WKTはコンマを使うので、WKTの箇所はダブルクォートで括る

たとえば次のようになります。

code,geom
11,"LINESTRING(135 35, 136 35, 136 36, 135 36, 135 35)"
12,"LINESTRING(136 35, 132 35, 132 36, 136 36, 136 35)"
11,"LINESTRING(135 36, 136 36, 136 37, 135 37, 135 36)"
12,"LINESTRING(136 36, 132 36, 132 37, 136 37, 136 36)"

VRTファイルの作成

意味づけはVRTファイルで行います。基本的にはVRTがメインで、CSVはVRTからのリンクとなります。
詳細は、本家サイトの http://www.gdal.org/ogr/drv_vrt.html あたりを参照してください。

なお、さきほど作成したCSVファイルは "frame.csv" としています。


    
        frame.csv
        
        wkbLineString
        
    

  • GeometryTypeの値に "wkb" とついているのは、とりあえずそういうものと考えることにしています。
  • Field要素を入れているのは、ほうっておくとgeom要素をジオメトリフィールドと文字列フィールドとを兼用するからです (要調査)

LineStringでなくPointとする場合には、GeometryTypeの値を変えて下さい。

確認する

ogrinfo -ro -al frame.vrt

でファイルがどのようにogrに認識されているかが分かります。

INFO: Open of `frame.vrt'
      using driver `VRT' successful.
ERROR 1: Failed to open datasource `frame.csv'.

Layer name: frame
Geometry: Line String
Feature Count: 0
Layer SRS WKT:
(unknown)

>ogrinfo -ro -al frame.vrt
INFO: Open of `frame.vrt'
      using driver `VRT' successful.

Layer name: frame
Geometry: Line String
Feature Count: 4
Extent: (132.000000, 35.000000) - (136.000000, 37.000000)
Layer SRS WKT:
(unknown)
code: String (0.0)
OGRFeature(frame):1
  code (String) = 11
  LINESTRING (135 35,136 35,136 36,135 36,135 35)

OGRFeature(frame):2
  code (String) = 12
  LINESTRING (136 35,132 35,132 36,136 36,136 35)

OGRFeature(frame):3
  code (String) = 11
  LINESTRING (135 36,136 36,136 37,135 37,135 36)

OGRFeature(frame):4
  code (String) = 12
  LINESTRING (136 36,132 36,132 37,136 37,136 36)


なお、ジオメトリフィールドが表示されないまたは文字列フィールドと認識されている( "geom(String) =" が付く)場合には、パースエラーが起きています。
パースエラーのエラーメッセージは出ませんので、おかしいと思ったら WKT が正しいかを確認して下さい。

シェープファイルにする

md frame
ogr2ogr -f "ESRI Shapefile" frame frame.vrt

ここでは、frameフォルダをつくり、そこにシェープファイルを入れています。