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_sys
bả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 và 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 -nlt
lự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_MULTI
cờ, 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_MULTI
tiên hơn GEOMETRY
cờ 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
- Đả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
- 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.
- 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_sys
bả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.)
Hãy thử thiết lập các -nlt
cờ để một trong hai PROMOTE_TO_MULTI
hoặ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 :)
Nếu bạn đang nhập để PostgreSQL hoặc MySQL, hãy thử thiết lập -lco PRECISION=no
cả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_LENGTH
và SHAPE_AREA
cá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.
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_packet
tham 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