Nhập một shapefile để postgis với ogr2ogr cung cấp: Không thể mở nguồn dữ liệu


12

Tôi muốn sử dụng ogr2ogr để nhập shapefile trong cơ sở dữ liệu postgis. Tôi đã cài đặt thành công ogr2ogr và tôi chạy từ lệnh pssql sau đây:

ogr2ogr -f "PostgreSQL" PG:"host=localhost user=user_1 password=***** dbname=imports" world_boundaries.shp

Những gì tôi nhận được là một thông báo lỗi:

Unable to open datasource `world_boundaries.shp' with the following drivers: --a list of drivers follows (ESRI Shape File etc.)

Tôi cũng đã cố gắng xác định đường dẫn đầy đủ của shapefile nhưng tôi nhận được thông báo tương tự.

Ngoài ra tôi đã cố gắng để chạy:

ogrinfo world_boundaries.shp

Điều tương tự.


Sau khi sửa các vấn đề với quyền của tập tin, tôi gặp lỗi sau:

  ERROR 1: AddGeometryColumn failed for layer world_boundaries, layer creation has failed.
  ERROR 1: Terminating translation prematurely after failed
  translation of layer world_boundaries (use -skipfailures to skip errors)

Tôi cũng đã cố gắng nhập nó thông qua GUI shp2pgsql và tôi gặp lỗi sau:

ALTER TABLE "public".""
Failed in pgui_exec(): ERROR:  permission denied for relation spatial_ref_sys
 CONTEXT:  SQL statement "SELECT SRID         FROM spatial_ref_sys WHERE SRID = new_srid"
PL/pgSQL function addgeometrycolumn(character varying,character   varying,character varying,character varying,integer,character varying,integer,boolean) line 50 at SQL statement
 SQL statement "SELECT AddGeometryColumn('',$1,$2,$3,$4,$5,$6,$7)"
 PL/pgSQL function addgeometrycolumn(character varying,character  varying,character varying,integer,character varying,integer,boolean) line 5 at     SQL statement

Shapefile import failed.

Vấn đề lần này là người dùng cơ sở dữ liệu này không có đủ quyền. Điều này đã sửa nó:

GRANT ALL ON TABLE spatial_ref_sys TO my_user_name;

Thông báo lỗi tiếp theo là:

  Warning 1: Geometry to be inserted is of type 3D Multi Polygon, whereas the layer geometry type is 3D Polygon.
 Insertion is likely to fail
 ERROR 1: INSERT command for new feature failed.
 ERROR:  Geometry type (MultiPolygon) does not match column type (Polygon)

Vì vậy, có vẻ như tôi cần sử dụng tham số: -nlt MULTIPOLYGON Nhưng khi tôi làm như vậy tôi gặp một lỗi khác, điều này không có ý nghĩa gì với tôi:

ERROR 1: PostgreSQL driver doesn't currently support database creation.
Please create database with the `createdb' command.
PostgreSQL driver failed to create PG:host=localhost user=my_user_name dbname=my_database password=password -nlt POLYGON

Nhưng nó được tải bằng GUI shp2pgsql.


Nhận xét của @elrobis cho phép điều này cuối cùng hoạt động. Dữ liệu được tải trong db chính xác!

ogr2ogr -f "PostgreSQL" PG:"host=localhost user=geonode dbname=geonode_imports password=geonode" -nlt GEOMETRY wld_bnd_adm0_gaul_2015.shp

Có vẻ như shapefile của bạn không hợp lệ. Nó có hoạt động trong phần mềm khác không?
Evil Genius

1
Đúng. Nó được tải chính xác trong QGIS.
dùng1919

1
Ngoài ra, giả sử DB của bạn đã tồn tại và nó được viết đúng chính tả trong hướng dẫn ogr2ogr của bạn và người dùng postgres trong lệnh có bổ sung đầy đủ các đặc quyền cần thiết (CHỌN, CHERTN, CẬP NHẬT, TẠO .. vv), hãy thử thêm -nln layernameđối số, có lẽ cùng với -overwriteđể xem nếu nó đến với cuộc sống. Ngoài ra, nếu tôi là bạn, tôi sẽ chạy ogr2ogr sudocùng với siêu người dùng postgres của tôi để trở nên siêu chắc chắn để loại trừ các quyền và đặc quyền. Khi tập lệnh của bạn đã ổn định, thì bạn có thể bỏ qua các quyền và đặc quyền phiền phức. :)
elrobis

3
Cảm ơn. Thêm -nlt GEOMETRY thay vì -nlt POLYGON đã thực hiện thủ thuật này.
dùng1919

1
Vui mừng nó đã làm việc. Tôi sẽ tiếp tục và đưa ra câu trả lời thích hợp trong câu trả lời cũng mô tả lý do tại sao tôi nghĩ rằng nó hoạt động.
elrobis

Câu trả lời:


17

Như bạn đã phát hiện bằng thử nghiệm và lỗi, có một vài vấn đề dai dẳng mà bạn cần khắc phục, vấn đề cuối cùng đã được giải quyết bằng cách sử dụng đối số ogr2ogr -nlt GEOMETRY* .

* Lưu ý đề xuất trong nhận xét của @ LeeHachadoorian -nlt PROMOTE_TO_MULTIđược sử dụng làm giải pháp mặc định, thay vì nlt GEOMETRY, trước đây khuyến khích thực hành tốt nhất bên cạnh các lợi ích phụ trợ.

Quyền và thông báo lỗi của người dùng

Đầu tiên, ogr2ogr không thể mở shapefile của bạn và bạn nhận ra rằng các vấn đề về quyền thực tế đã ảnh hưởng đến người dùng HĐH truy cập vào shapefile của bạn. Nhưng có một bài học quan trọng ở đây cho những người khác, cụ thể là thông báo lỗi của ogr2ogr về điểm này là sai lệch! Thật vậy, một trong những người bình luận đầu tiên nghĩ rằng shapefile của bạn không hợp lệ và phải thừa nhận, suy đoán đầu tiên của tôi là có thể có lỗi / lỗi đánh máy trong đường dẫn / tên tệp hoặc có thể có một ký tự không theo quy tắc trong đường dẫn tệp Không gian mà đã phá vỡ khả năng của ogr2ogr để chỉ vào shapefile. Như bạn đã khám phá, nó thực sự chỉ là một vấn đề với quyền của người dùng. Bởi vì thông báo lỗi tạo ra một cá trích đỏ, đây là một khả năng mà những người khác cần phải giữ trong đầu họ. :)

Đặc quyền người dùng SQL và thất bại bí ẩn

Tôi đã bị cản trở bởi lỗi thứ hai của bạn trong một thời gian, nhưng bằng cách kiểm tra người dùng SQL của bạn với một tiện ích nhập khác (shp2pgsql), thông minh, bạn đã nhận được thông báo lỗi chính xác hơn và cung cấp cho người dùng SQL các đặc quyền cần thiết của bạn trên spatial_ref_sysbảng. Vì vậy, ai đó gặp khó khăn khi hướng dẫn nhập ogr2ogr của họ hoạt động chính xác, hãy đảm bảo rằng người dùng SQL của họ có đủ đặc quyền trên cả cơ sở dữ liệu bảng 'spatial_Vf_sys'.

Các loại hình học hỗn hợp và thực tiễn tốt nhất

Rào cản cuối cùng mà bạn gặp phải dường như liên quan đến thực tế là các shapefile cho phép cả hình học đơn và đa hình cùng tồn tại trong cùng một tập dữ liệu / tệp. Nó được coi là thực tiễn xấu khi trộn các loại hình học trong cùng một bảng, ngay cả đối với một / nhiều nhóm cùng loại tính năng và theo mặc định, các trình phát nguồn mở trong chuỗi công cụ của bạn sẽ cố gắng bảo vệ bạn khỏi việc trộn các loại hình học. May mắn thay, mặc dù, họ cung cấp cho bạn một số tùy chọn. Ban đầu, tôi khuyên bạn nên đặt đối số -nlt GEOMETRY* trên hướng dẫn ogr2ogr của mình, cho phép bạn nhập tập dữ liệu đa giác của mình bất chấp quy ước lỏng hơn của ESRI. Mặc dù vậy, điều này có nghĩa là bạn có thể có cả hình học một phần và đa phần trong bảng của mình và điều đó có thể tạo ra những vấn đề đau đầu khác cho bạn sau này!

Điều đáng nói là ogr2ogr có một -nltlựa chọn khác mà bạn nên xem xét, đó là PROMOTE_TO_MULTI. Để trích dẫn tài liệu ..

Bắt đầu với GDAL 1.10, có thể sử dụng PROMOTE_TO_MULTI để tự động quảng bá các lớp trộn đa giác hoặc đa chuỗi thành đa chuỗi và các lớp trộn chuỗi linestrings hoặc multilinestrings thành multilinestrings. Có thể hữu ích khi chuyển đổi shapefiles sang PostGIS và các trình điều khiển đích khác thực hiện kiểm tra nghiêm ngặt cho các loại hình học.

Nói cách khác, nếu bạn sử dụng PROMOTE_TO_MULTIcờ, thì TẤT CẢ các tính năng của bạn sẽ được chuyển đổi thành các tính năng nhiều phần, ngay cả khi chúng chỉ bao gồm một phần. Theo ghi nhận của @LeeHachadoorian trong các bình luận, và tôi chắc chắn rằng hầu hết mọi người sẽ đồng ý với việc bạn khuyên nên ưu PROMOTE_TO_MULTItiên hơn GEOMETRYcờ lỏng lẻo , vì nó phù hợp với thông lệ tốt nhất, thống nhất các hình học đặc trưng trong bảng của bạn. Về cơ bản, bất kỳ mã nào bạn viết chỉ nên mong đợi nhiều hình học. Phải thừa nhận rằng, điều này có thể sạch hơn và đơn giản hóa một số phát triển.

Lời khuyên chung cho ai đó gặp rắc rối với SHP khi đăng nhập

  1. Đảm bảo rằng các đường dẫn của bạn không có bất kỳ ký tự nào trong đó và không có lỗi chính tả hoặc lỗi chính tả trong đường dẫn hoặc tên tệp
  2. Khi @ user1919 được phát hiện, hãy đảm bảo người dùng HĐH của bạn có đủ đặc quyền để truy cập vào shapefile! Như họ đã chứng minh, có thể giúp thử mở shapefile trong một phần mềm khác, như QGIS, nếu nó hoạt động trong một phần mềm, thì nó không bị hỏng và nó sẽ hoạt động trong phần mềm khác.

Đầu tiên, hãy xem xét thực thi lệnh ogr2ogr của bạn sudođể loại trừ các vấn đề về quyền cho đến khi bạn biết chắc chắn tập lệnh của bạn hoạt động như dự định.

  1. Cũng như @ user1919 nhận ra, hãy đảm bảo rằng người dùng SQL của bạn có đủ đặc quyền trên cả cơ sở dữ liệu được nhắm mục tiêu bởi tập lệnh của bạn, cũng như spatial_ref_sysbảng.

Một lần nữa, trước tiên, hãy xem xét sử dụng siêu người dùng PostGRESql tại đây để loại trừ các vấn đề đặc quyền SQL cho đến khi tập lệnh của bạn hoạt động. Nếu tập lệnh của bạn hoạt động với siêu người dùng thì không thành công với người dùng tự động hóa ưa thích, bạn biết vấn đề có liên quan đến người dùng SQL chứ không phải dữ liệu hoặc môi trường của bạn (cài đặt gdal / ogr, v.v.)

  1. Hãy thử thiết lập các -nltcờ để một trong hai PROMOTE_TO_MULTIhoặc GEOMETRY. Vì các shapefiles cho phép quy ước loại tính năng lỏng lẻo hơn, đôi khi bạn phải hướng dẫn các tiện ích nguồn mở của mình trở nên phù hợp hơn :)

  2. Nếu bạn đang nhập để PostgreSQL hoặc MySQL, hãy thử thiết lập -lco PRECISION=nocảnh báo ..fair, tôi không hiểu chính xác những gì lập luận này không, nhưng đây là những gì tôi đã có kinh nghiệm .. Như bạn đã biết, shapefile thường bao gồm các SHAPE_LENGTHSHAPE_AREAcác lĩnh vực, và tôi Đôi khi tôi nhận thấy khi tôi gặp phải những thất bại bí ẩn, nếu tôi xóa các trường đó, tôi có thể lấy dữ liệu để nhập chính xác. Tuy nhiên, nếu tôi sử dụng -lco PRECISION=no, tôi có thể lấy dữ liệu để nhập mà không phải xóa các trường đó. Đề nghị của tôi là sử dụng tham số này làm bước khắc phục sự cố, nhưng để hiểu vấn đề nào thực sự giải quyết trước khi bạn chấp nhận nhập khẩu trong một giải pháp sản xuất.

  3. Cuối cùng, nếu bạn đang sử dụng MySQL, hãy lưu ý rằng một số hình học tính năng rất lớn có thể xúc phạm max_allowed_packettham số của MySQL . Bạn có thể đọc thêm về điều này trong tài liệu cho trình điều khiển MySQL .. nhưng giải pháp là thay đổi cấu hình MySQL của bạn để cho phép giá trị lớn hơn giá trị mặc định.

Ví dụ SHP cho Lệnh nhập PostGIS cho ogr2ogr

Vì lợi ích của bất kỳ người mới nào có thể đi lang thang qua đây, đây là điều mà hầu hết SHP để đăng nhập của tôi trông giống như sử dụng ogr2ogr. Lưu ý rằng tôi bọc các đường dẫn / tên tệp trong dấu ngoặc kép, điều này bảo vệ chống lại khoảng trắng, ký tự lạ và ngắt dòng trên thiết bị đầu cuối .. ngoài ra tôi đã bao gồm hầu hết các đối số được thảo luận ở trên, ngoài việc ghi đè cho trường tên hình học, Trường FID và tên lớp:

ogr2ogr -f "PostgreSQL" "PG:host=127.0.0.1 user=myuser dbname=mydb password=mypassw0rd" "C:/path/to/some_shapefile.shp" -lco GEOMETRY_NAME=the_geom -lco FID=gid -lco PRECISION=no -nlt PROMOTE_TO_MULTI -nln new_layername -overwrite


3
Về -nlt PROMOTE_TO_MULTI, đây thực sự là một thực tiễn tốt nhất cho hình học đa giác. Tôi sẽ đề nghị thay đổi câu trả lời của bạn để khuyên đây là một lựa chọn mặc định mạnh mẽ, chỉ bị vi phạm sau khi xem xét cẩn thận. Tôi cũng khuyên bạn không nên sử dụng loại chung geometryđể xử lý đa giác / đa giác hỗn hợp, trừ khi người dùng / nhà phát triển thực sự biết họ đang làm gì và cần trộn các loại đa giác, đường và điểm.
Lee Hachadoorian

1
@LeeHachadoorian, đồng ý. Tôi chỉnh sửa câu trả lời theo khuyến nghị. Trong phòng thủ của tôi, PROMOTE_TO_MULTIlà đủ mới (GDAL 1.10) mà tôi vẫn mặc định cho giải pháp ban đầu có sẵn khi tôi bắt đầu trong tất cả điều này. :) ..in tất cả sự công bằng, tuy nhiên, một shapefile sẽ chỉ kết hợp các loại duy nhất và nhiều phần dữ liệu, do đó sẽ không bao giờ là một kịch bản mà ogr2ogr sẽ đẩy một shp qua -nlt GEOMETRYvà xây dựng một bảng với điểm, đường polys :))))) Tuy nhiên tôi hoàn toàn đồng ý với vị trí của bạn về vấn đề này.
elrobis

1
Shapefiles cho phép nhiều đa giác trong loại Đa giác của họ. Họ thậm chí không có loại MultiPolygon. Vì vậy, ngay cả khi chỉ gặp loại tập tin hình dạng này, người ta cần sử dụng -nlt PROMOTE_TO_MULTIđể làm cho công việc này.
CMCDragonkai
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.