Thêm trường với tên tệp khi hợp nhất shapefiles với ogr2ogr?


14

Tôi đang hợp nhất một số shapefile và tôi đã gặp một số vấn đề khi thực hiện trong QGIS, vì vậy tôi đang sử dụng trực tiếp ogr2ogr. Tôi đang làm điều này (trong một đợt):

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

Nó hoạt động tốt, nhưng bây giờ tôi cần phải có trong shapefile kết quả, một trường có tên của các shapefile gốc mà tôi đã hợp nhất. Nghe có vẻ không khó lắm, nhưng tôi không quản lý để làm điều đó.

Có ai giúp được không? Cảm ơn bạn!

Câu trả lời:


14

Với kịch bản nhỏ, nó sẽ có thể thực hiện được. Với một cái gì đó như sau, bạn sẽ có thể thêm cột vào một shapefile trong tất cả các shapefile trong một thư mục và hợp nhất chúng vào tệp 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 
)

chỉnh sửa: Giống như tập lệnh Bash, với một số thay đổi để làm cho nó hoạt động:

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

Giải pháp này sẽ chỉ hoạt động nếu tất cả các lớp / shapefile của bạn có cùng tên, ví dụ "CHEMIN" đúng không? Tôi đang tìm một giải pháp cho các tập lệnh script với các tên lớp khác nhau.
oeon

Đúng, nếu bạn thay CHEMIN bằng% f thì nó sẽ hoạt động với bất kỳ tên nào, vì trong tên bảng shapefile là tên lớp. Tôi chỉnh sửa câu trả lời. Tôi không có cửa sổ để kiểm tra nó thực sự
JaakL

9

Tôi sẽ sử dụng tùy chọn -sql và nhập shapefile theo cách sau:

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

Paolo - Tôi đang đấu tranh để làm việc này. Nó chỉ có thể được thực hiện với ogr2ogr chứ không phải ogrinfo? Tôi cũng đã đăng lên gdal-dev, với các ví dụ của tôi liệt kê.osgeo.org/pipermail/ gdal-dev/ 2012-November/034849.html Không thể làm điều đó trong Windows hoặc Bash ..
oeon

Joe, dòng ogrinfo duy nhất có bị lỗi không, hay nó chỉ bị lỗi trong ngữ cảnh của tập lệnh (bên trong vòng lặp)?
capooti

Paolo - Tôi sẽ thêm câu trả lời phù hợp với tôi, bên dưới. Cảm ơn bạn đã theo dõi với tôi, thưa ngài! :)
oeon

7

có một số cách để hợp nhất shapefiles.

  • nếu bạn muốn hợp nhất các lớp thành một lớp, bạn có thể sử dụng các công cụ MMqgis để hợp nhất ...

mmqgis

  • nếu bạn muốn hợp nhất tất cả các shapefile trong một thư mục, bạn có thể sử dụng mã đơn giản DARREN COPE tại đây.

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 )
)
  • bên cạnh điều này có thể sử dụng công cụ miễn phí GeoMerge để hợp nhất nhiều tệp nhưng đừng quên xem xét kích thước tệp của bạn để làm việc với nó.

và thêm thuộc tính vào shapefile @dango directon là tốt. bạn có thể sử dụng layer.CreateField (field_name) để tạo một cột mới được điền từ

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

Tôi hy vọng nó sẽ giúp bạn...


5

vascobnunes, đây là cách tôi giải quyết vấn đề này bằng cách sử dụng tập lệnh Python để tạo chuỗi các hướng dẫn ogr2ogr cùng nhau. Bạn có thể dễ dàng chuyển đổi nó thành một tập lệnh bó, về cơ bản tôi chỉ cần ghép các lệnh ogr2ogr với nhau ( cmd), sau đó thực hiện chúng bằng cách gọi os.system(cmd), truyền lệnh ogr2ogr mà tôi ghép lại với nhau.

Vũ khí bí mật là ( như capooti đã trình diễn ) áp dụng OGR_Query để đặt tên tệp là giá trị không đổi của tập dữ liệu nguồn mà bạn đang thêm vào kết quả hợp nhất của mình.

Trong ví dụ của tôi, -sqlcờ xử lý điều này, trong mã nó giống như thế này:

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

Nhưng điều đó thật khó hiểu vì tôi cần phải áp dụng các trích dẫn đơn và trích dẫn kép trong phần kết quả. Để làm điều đó, tôi phải thoát các dấu ngoặc đơn (nghĩa là \ ') để sử dụng chúng "thực sự". Vì vậy, để dễ đọc, nó giúp nhìn thấy nó mà không có các biến và thoát các chuỗi. Nếu bạn giả vờ tên tệp là "đường1" cho một lần lặp cụ thể, kết quả kết quả sẽ giống như thế này trong câu ogr2ogr:

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

Kịch bản py Đây là một sự pha trộn của ba thủ thuật tôi đã đánh cắp từ mờ Wilkie (một trống, tạo bản sao của một shapefile), j03lar50n (thêm một cột vào một shapefile sử dụng ogrinfo và ogr_sql), và capooti (sử dụng ogr_sql để áp đặt một giá trị cột cố định trên tất cả các hồ sơ trong một shapefile). Vì vậy, đây là kịch bản đầy đủ:


# 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

Thêm cột với tên tệp nguồn từ thư mục của shapefiles. Yêu cầu GDAL 1.10dev, nỗ lực của tôi để thả phần mở rộng .shp không hoạt động - nhưng về tổng thể, hoạt động. - Tôi tưởng tượng nó có thể được thêm vào các dòng hợp nhất với 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 cho đặc tả phương ngữ. Tôi đã nhận được lỗi ở câu trả lời hàng đầu do OGR SQL không thực hiện cập nhật.
15741

3

Hi có thể liên kết này sẽ giúp. Nó cho thấy làm thế nào để thêm một điểm yếu vào một shapefile bằng cách sử dụng các ràng buộc gdal python.


2

Bên trong QGIS, bạn có thể thêm plugin Merge Shapefile. Có một tùy chọn để "Thêm cột với tên tệp"nhập mô tả hình ảnh ở đây


Tôi nhận được một TypeError: đối tượng của loại 'Không loại' không có len ()
Hannes Ledegen

0

Một phiên bản sửa đổi một chút của câu trả lời của JaaKL. Lưu ý rằng foo.shp và -nln foo cần khớp. Ngoài ra, lưu ý việc sử dụng phương ngữ SQLite (GDAL rõ ràng không chấp nhận từ khóa 'Cập nhật', do đó, phương ngữ SQLite phải được sử dụng ngay lập tức) và không có từ khóa 'BẢNG' sau từ 'CẬP NHẬT' (không cần thiết hoặc được chấp nhận bởi 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

Một chút muộn để thảo luận, nhưng bây giờ cũng có ogrmerge

ogrmerge.py -single -o merged.shp *.shp -src_layer_field_content {DS_BASENAME}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.