gdal / ogrを使用してCSVファイルをシェープファイルに結合しますか?


11

私は、例えば、いくつかの属性を持つシェープファイルを持っているYEARCOUNTYAREA。また、シェープファイルに必要なフィールドを含むCSVファイルもありますPOPULATION。シェープファイルとCSVファイルの両方にフィー​​ルドがありますGISJOIN。QGISで参加する方法を知っています。しかしogr2ogr、GDAL / OGRのツールまたは他のツールを使用して、永続的な結合を作成し、シェープファイルに書き込むにはどうすればよいですか?


GDAL / OGRビルドは、spatialiteまたはsqliteをサポートしていますか?
BradHards

@BradHards:似ていない。Ubuntu 14.04からパッケージ化されたGDAL / OGRビルドです。
リンカーンミューレン

回答:


23

ogr2ogrユーティリティがサポートしている限られたSQL構文を。次のようなものを使用して、CSVをシェープファイルに結合できます。

ogr2ogr -sql "select inshape.*, joincsv.* from inshape left join 'joincsv.csv'.joincsv on inshape.GISJOIN = joincsv.GISJOIN" shape_join.shp inshape.shp

8
Oh gdal / ogr-あなたは決して私を驚かせるのをやめない..
ラデク

@lukeこれは素晴らしいですが、私のシェイプファイルとcsvが私のPCのフォルダにある場合、どうすればいいですか...そのフォルダへのパスをどこに含める必要がありますか?

@Luke私が持っていますが、私は間違いなく正しくしませんでした、ogr2ogr -sql "C:\ Path \ inshape。*、C:\ Pathjoincsv。*をC:\ Path \ inshape左結合 'C:\ Path \ joincsvから選択してください.csv'.joincsv on C:\ Path \ inshape.GISJOIN = joincsv.GISJOIN "shape_join.shp inshape.shp

4
ogr2ogr -sql "inshapeからのinshape。*、joincsv。*を選択します。inshape.GISJOIN= joincsv.GISJOINの 'path / to / joincsv.csv'.joincsvからshape_join.shp path / to / inshape.shp
user2856

次のエラーが表示されます。「警告1:フィールド86のフィールドinshape.MAの値1060008100が正常に書き込まれていません。フィールド幅に関して数値が大きすぎる可能性があります」これを解決する方法はありますか?
RutgerH

7

受け入れられた答えは本当に便利ですが、大規模なデータベースでは遅いことがわかりました。データに参加する際の選択肢も制限されると思います。

私の方法は、すべてをSQLiteに取り込むことです(csvkitとogr2ogrの組み合わせを使用):

csvsql --db sqlite:///myjoindb.db --insert myjoincsv.csv
ogr2ogr -append -f "SQLite" myjoindb.db myjoinshp.shp

次に、すべてを結合して、シェープファイルを作成します。

ogr2ogr -f "ESRI Shapefile" -sql "SELECT csv.*, shp.* FROM myjoinshp shp INNER JOIN myjoincsv csv ON csv.joinfield = shp.joinfield" joined_output.shp myjoindb.db

こんにちはEric、myjoindb.dbが既に存在するというエラーが表示されます。そのsecondline dbはfirstと同じ名前になっているはずですか?
GISダニー

良い点です。2行目には、既存のSQLite dbを開いて追加する許可を-append与えるために、そこにa ogr2ogrを追加します。これを示すために回答を編集しました。
エリックbrelsford

ありがとう!すばらしい。もう1つ質問があります。最初の行には、フィールドジオイドがあり、それが不意に負の浮動小数点数に変換され続けています。これは国勢調査のIDで、文字列として扱いたいので、引用符で文字列をラップしようとしましたが、うまくいきませんでした。次のようなコマンドはありcsvsql --db sqlite:///myjoindb.db --insert myjoincsv.csv geoid.map(str)ますか?
GISダニー

奇妙なことに、結合はジオイドで正しく発生しますが、出力にはジオイドが含まれており、代わりに-2147184982が含まれています。
GISダニー

geoidが数字に変換されているように聞こえますが、数字が非常に大きいため、オーバーフローして負になります。csvsqlドキュメントを確認してgeoid、文字列であると明示的に言っているテーブルを指定してみてください--no-inference
エリックbrelsford
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.