gdal / ogr을 사용하여 CSV 파일을 shapefile에 결합 하시겠습니까?


11

나는 예를 들어, 여러 속성을 가진 shape 파일을 가지고 YEAR, COUNTY하고 AREA. 또한 shapefile에 원하는 필드가 더 많은 CSV 파일이 있습니다 (예 :) POPULATION. shapefile과 CSV 파일에는 모두 필드가 GISJOIN있습니다. QGIS에 참여하는 방법을 알고 있습니다. 그러나 ogr2ogrGDAL / OGR의 다른 도구 중 하나를 사용하여 어떻게 쉐이프 파일에 영구적으로 결합하고 쓸 수 있습니까?


GDAL / OGR 빌드에 공간적 또는 sqlite 지원이 있습니까?
BradHards 2014 년

@ BradHards : 그것은 보이지 않습니다. Ubuntu 14.04의 패키지 GDAL / OGR 빌드입니다.
링컨 멀린

답변:


24

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 – 당신은 나를 놀라게하는 것을 결코 멈추지 않습니다 ..
radek

@luke 이것은 훌륭하지만 shapefile과 csv가 PC의 폴더에있는 경우 어떻게해야합니까? 해당 폴더의 경로를 어디에 포함해야합니까?

@Luke, 그러나 나는 확실히 그것을 올바르게하지 않았다. ogr2ogr -sql "C : \ Path \ inshape. *, C : \ Pathjoincsv. * from C : \ Path \ inshape left join 'C : \ Path \ joincsv .csv'.joincsv on C : \ Path \ inshape.GISJOIN = joincsv.GISJOIN "shape_join.shp inshape.shp

4
ogr2ogr -sql "inshape. *, joincsv. * inshape.joinsv on inshape.GISJOIN = joincsv.GISJOIN"shape_join.shp 경로 /to/inshape.shp
user2856

다음과 같은 오류가 발생합니다. "경고 1 : 피처 86의 필드 inshape.MA의 값 1060008100이 성공적으로 작성되지 않았습니다. 필드 너비와 관련하여 너무 큰 숫자로 인해"이 문제를 해결하는 방법이 있습니까?
RutgerH

7

허용 된 답변은 실제로 유용하지만 큰 데이터베이스에서는 느리다는 것을 알았습니다. 데이터 가입시 귀하의 옵션도 제한한다고 생각합니다.

내 방법은 이제 csvkit 과 ogr2ogr 의 조합을 사용하여 모든 것을 SQLite로 가져 오는 것입니다 .

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가 이미 존재한다는 오류가 발생합니다. 그 두 번째 줄 db의 이름이 first와 같아야합니까?
GIS Danny

두 번째 줄 에는 기존 SQLite DB를 열고 추가 -append할 수있는 ogr2ogr권한을 부여하기 위해 in 을 추가하고 싶을 것입니다. 이것을 보여주기 위해 답변을 편집했습니다.
eric brelsford

감사! 잘 작동합니다. 한 가지 더 질문이 있길 바랍니다. 첫 번째 줄에는 필드 지오이드가있어 음수 부동으로 이상하게 변환됩니다. 문자열로 취급하고 싶은 인구 조사 ID입니다. 문자열을 따옴표로 감싸려고했지만 작동하지 않았습니다. 다음과 같은 명령이 csvsql --db sqlite:///myjoindb.db --insert myjoincsv.csv geoid.map(str)있습니까?
GIS Danny

이상한 점은 조인이 지오이드에서 올바르게 발생 하지만 출력에 지오이드 가 -2147184982 인 것이 있다는 것입니다.
GIS Danny

같은 소리 geoid가 숫자로 변환되고 있지만 숫자가 너무 커서 오버플로되어 음수가됩니다. csvsql 문서를 확인하십시오. geoid문자열 이라고 명시 적으로 나타내는 테이블을 지정하려고하면 --no-inference도움 이 될 수 있습니다.
eric brelsford
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.