ogr2ogr과 shapefile을 병합 할 때 파일 이름으로 필드를 추가 하시겠습니까?


14

일부 shapefile을 병합하고 있으며 QGIS 내부에서 문제가 발생하여 ogr2ogr을 직접 사용하고 있습니다. 나는 이것을 (배치로)하고있다 :

ogr2ogr -overwrite %destination% %n1%
ogr2ogr -update -append %destination% %n2% -nln all_new
ogr2ogr -update -append %destination% %n3% -nln all_new
ogr2ogr -update -append %destination% %n4% -nln all_new

잘 작동하지만 이제는 결과 셰이프 파일에 병합 한 원래 셰이프 파일의 이름이있는 필드가 있어야합니다. 그렇게 어렵지는 않지만 나는 그것을 할 수 없습니다.

누구든지 도울 수 있습니까? 감사합니다!

답변:


14

작은 스크립트를 사용하면 가능합니다. 다음과 같이 폴더의 모든 shapefile에있는 shapefile에 열을 추가하고 merged.shp 파일에 병합 할 수 있어야합니다.

for %f in (*.shp) do (
  ogrinfo %f -sql "ALTER TABLE %f ADD COLUMN filename character(15)"
  ogrinfo %f -sql "UPDATE TABLE %f filename = '%f'"
  ogr2ogr -update -append merged.shp %f -f esri shapefile -nln merge 
)

편집 : Bash 스크립트와 동일하며 약간 변경되어 작동합니다.

for f in *.shp
do 
  base=${f%.shp}
  ogrinfo $f -sql "ALTER TABLE $base ADD COLUMN filename character(15)"
  ogrinfo $f -dialect SQLite -sql "UPDATE $base SET filename = '$base'"
  ogr2ogr -update -append merged.shp $f
done

이 솔루션은 모든 레이어 / 셰이프 파일의 이름이 "CHEMIN"과 같은 동일한 이름을 가진 경우에만 작동합니다. 레이어 이름이 다른 파일을 스크립팅하는 솔루션을 찾고 있습니다.
oeon

CHEMIN을 % f로 바꾸면 shapefile 테이블 이름이 레이어 이름과 같이 모든 이름으로 작동해야합니다. 답변을 수정했습니다. 실제로 테스트 할 창이 없습니다
JaakL

9

-sql 옵션을 사용하고 다음과 같은 방법으로 shapefile을 가져옵니다.

ogr2ogr -update -append %destination% %n2% -sql 'SELECT "%n2%" as SHAPE_ORIG, field1, field2, ... FROM %n2%'

Paolo-이 기능을 사용하기 위해 고심하고 있습니다. ogrinfo가 아닌 ogr2ogr으로 만 수행 할 수 있습니까? 내 예제와 함께, 너무 GDAL-DEV에 올린 lists.osgeo.org/pipermail/gdal-dev/2012-November/034849.html .. 깡통 Windows 또는 배쉬에서 그것을하지
oeon

Joe, 단일 ogrinfo 행이 실패합니까, 아니면 루프 내에서 스크립트 컨텍스트에서만 실패합니까?
capooti

Paolo-아래에 저에게 맞는 답변을 추가하겠습니다. 따라와 주셔서 감사합니다, 친절한 선생님! :)
oeon December

7

쉐이프 파일을 병합하는 몇 가지 방법이 있습니다.

  • 레이어를 하나의 레이어로 병합하려면 MMqgis 도구를 사용하여 병합 할 수 있습니다 .

mmqgis

  • 모든 shapefile을 폴더 아래에 병합하려면 여기에서 DARREN COPE 간단한 코드를 사용할 수 있습니다.

mkdir merged
for %f in (*.shp) do (
if not exist merged\merged.shp (
ogr2ogr -f esri shapefile merged\merged.shp %f) else (
ogr2ogr -f esri shapefile -update -append merged\merged.shp %f -nln Merged )
)
  • 외에도 많은 파일을 병합 하기 위해 GeoMerge 무료 도구를 사용할 수 있지만 파일 크기를 고려하는 것을 잊지 마십시오.

그리고 shapefile @dango directon에 속성을 추가하는 것이 좋습니다. 채워진 새 열을 만들기 위해 layer.CreateField (field_name)을 사용할 수 있습니다.

import os
shapeFileName = os.path.splitext("your_shape_file_path")[0]

나는 그것이 당신에게 도움이되기를 바랍니다 ...


5

vascobnunes, 여기에 파이썬 스크립트를 사용하여 여러 ogr2ogr 명령어를 데이지 체인 방식으로 연결 하여이 문제를 해결 한 방법이 있습니다. 배치 스크립트로 쉽게 변환 할 수 있습니다. 기본적으로 ogr2ogr 명령 ( cmd)을 함께 연결 한 다음을 호출 os.system(cmd)하여 함께 연결 한 ogr2ogr 명령을 전달 하여 실행 하십시오.

비밀 무기는 ( capooti가 시연 한 것처럼 ) OGR_SQL 을 적용 하여 파일 이름을 병합 결과에 추가하는 소스 데이터 세트의 상수 값으로 적용하는 것입니다.

내 예제에서 -sql플래그는 다음과 같이 코드에서 처리합니다.

-sql "SELECT \'' + filename + '\' AS filename, * FROM ' + filenameNoExt + '"'

그러나 결과 연결에 작은 따옴표와 큰 따옴표를 적용해야하기 때문에 읽기가 혼란 스럽습니다. 그렇게하려면 작은 따옴표 (예 : \ ')를 이스케이프하여 "실제로"사용해야합니다. 따라서 가독성을 위해 변수없이 이스케이프 시퀀스를 보는 것이 좋습니다. 특정 반복에 대해 파일 이름이 "roads1"인 경우 결과 연결은 ogr2ogr 문장에서 다음과 같습니다.

-sql "SELECT 'roads1.shp' AS filename, * FROM roads1"

이 .py 스크립트는 matt wilkie (빈, shapefile의 복제본), j03lar50n (ogrinfo 및 ogr_sql을 사용하여 shapefile에 열 추가) 및 capooti (ogr_sql을 사용하여 고정 열 값 적용) 에서 훔친 세 가지 트릭의 융합입니다. shapefile의 모든 레코드에서). 전체 스크립트는 다음과 같습니다.


# merge_shps.py
import os    

path = "D:/GIS/01_tutorials/ND_Roads/extracted"  # path to your folder of .shp files
merge = "merge_filename"                         # this will be the name of your merged result

directory = os.listdir(path)

count = 0
for filename in directory:
    if ".SHP" in filename.upper() and not ".XML" in filename.upper():

        # On the first pass, create a clone and add the filename column.
        if count == 0:
            # Make a clone (matt wilkie)..
            cmd = 'ogr2ogr ' + path + '/' + merge + '.shp ' + path + '/' + filename + ' -where "FID < 0"'
            os.system(cmd)

            # Add the field (j03lar50n)..
            cmd = 'ogrinfo ' + path + '/' + merge + '.shp -sql "ALTER TABLE ' + merge + ' ADD COLUMN filename character(50)"'
            os.system(cmd)

        # Now populate the data (capooti)..
        print "Merging: " + str(filename)

        # You'll need the filename without the .shp extension for the OGR_SQL..
        filenameNoExt = filename.replace(".shp","")

        cmd = 'ogr2ogr -f "esri shapefile" -update -append ' + \
                path + '/' + merge + '.shp ' + \
                path + '/' + filename + \
                ' -sql "SELECT \'' + filename + '\' AS filename, * FROM ' + filenameNoExt + '"'

        # Uncomment this line to spit the ogr2ogr sentence to the terminal..
        #print "\n" + cmd + "\n"

        os.system(cmd)

        count += 1

4

shapefiles 폴더에서 소스 파일 이름이있는 열을 추가하십시오. .shp 확장명을 삭제하려는 시도는 작동하지 않지만 전체적으로 작동하는 GDAL 1.10dev가 필요합니다. -OGR과 병합하는 라인에 추가 될 수 있다고 생각합니다.

for f in *.shp;

do

name=${f%.shp}

/Users/you/gdal_src/bin/ogrinfo $f -sql "ALTER TABLE $name ADD COLUMN filename character(21)"
/Users/you/gdal_src/bin/ogrinfo $f -dialect SQLite -sql "UPDATE $name SET filename = '$f'"
done;

방언 사양의 경우 +1 OGR SQL이 업데이트를 수행하지 않아서 최상위 답변에 오류가 발생했습니다.
user15741

3

어쩌면이 링크 가 도움 이 될 것입니다. 파이썬 gdal 바인딩을 사용하여 shapefile에 feild를 추가하는 방법을 보여줍니다.


2

QGIS 내부에 Merge Shapefile 플러그인을 추가 할 수 있습니다. "파일 이름으로 열 추가"옵션이 있습니다여기에 이미지 설명을 입력하십시오


TypeError : 'NoneType'유형의 객체에 len ()이 없습니다
Hannes Ledegen

0

JaaKL의 답변이 약간 수정되었습니다. -append foo.shp 및 -nln foo가 일치해야합니다. 또한 SQLite 방언 사용 (GDAL은 키워드 '업데이트'를 허용하지 않으므로 SQLite 방언을 설치해야 함)과 'UPDATE'단어 뒤에 키워드 'TABLE'이 없음 (필요하지 않음) 또는 SQLite에 의해 승인 됨).

for %%f in (*.shp) do (
  if not "%%f" == "merge.shp" (
    ogrinfo %%f -sql "ALTER TABLE %%~nf ADD COLUMN fname character(15)"
    ogrinfo %%f -dialect SQLite -sql "UPDATE %%~nf SET fname = '%%~nf'"
    ogr2ogr -update -append merge.shp %%f -f "ESRI SHAPEFILE" -nln merge 
  )
)

0

토론에 조금 늦었지만 이제는 ogrmerge도 있습니다

ogrmerge.py -single -o merged.shp *.shp -src_layer_field_content {DS_BASENAME}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.