使用gdal / ogr将CSV文件加入shapefile?


11

我有几个属性shape文件,例如YEARCOUNTYAREA。我还有一个CSV文件,其中包含我想要在shapefile中使用的更多字段,例如POPULATION。shapefile和CSV文件都有一个字段GISJOIN。我知道如何在QGIS中加入。但是,如何使用ogr2ogrGDAL / OGR中的一个或其他工具进行永久连接并写入shapefile ?


您的GDAL / OGR版本是否具有spacespaceite或sqlite支持?
BradHards

@BradHards:看起来不像。它是Ubuntu 14.04打包的GDAL / OGR版本。
林肯·马伦

Answers:


23

ogr2ogr工具支持有限的SQL语法。您可以使用类似以下的内容将CSV连接到shapefile:

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

8
gdal / ogr-您永不停止
惊叹

@luke这很棒,但是,如果我的shapefile和csv位于PC的文件夹中,该怎么办...我必须在哪里包含指向该文件夹的路径?

@Luke我有,但是我绝对做不到,ogr2ogr -sql“从C:\ Path \ inshape左选择C:\ Path \ inshape。*,C:\ Pathjoincsv。*加入'C:\ Path \ joincsv C:\ Path \ inshape.GISJOIN = joincsv.GISJOIN上的.csv'.joincsv” shape_join.shp inshape.shp

4
ogr2ogr -sql “选择inshape *,joincsv *从inshape左加入“路径/到/ joincsv.csv'.joincsv inshape.GISJOIN = joincsv.GISJOIN上” shape_join.shp路径/到/ 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

然后连接所有内容并从中创建一个shapefile:

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已经存在。该第二行数据库的名称应该与第一行相同吗?
GIS Danny

很好,在第二行中,您需要在其中添加一个-append,以授予ogr2ogr打开现有SQLite数据库并将其添加的权限。我已经编辑了答案以显示此内容。
eric brelsford 2015年

谢谢!工作很棒。还有一个问题,希望很快。第一行,我有一个字段大地水准面,一直怪异地转换为负浮点数。这是我想当作字符串处理的普查ID,我尝试用引号将字符串包装起来,但没有用。有没有这样的命令:csvsql --db sqlite:///myjoindb.db --insert myjoincsv.csv geoid.map(str)什么?
GIS Danny

有什么奇怪的是参加关于正确发生大地水准面,但输出具有大地水准面与-2147184982什么,而不是走进它。
GIS Danny

听起来好像geoid正在转换为数字,但是数字太大,以至于溢出并变为负数。检查文档csvsql,您可以尝试指定一个表,在该表中您明确地说这geoid是一个字符串,否则--no-inference可能会有所帮助。
eric brelsford 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.