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データを作成します。属性値とジオメトリとをまぜて書いちゃって下さい。
たとえば次のようになります。
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 が正しいかを確認して下さい。