Sự cố khi tải hệ điều hành đa điểm OpenData vào PostGIS


8

Tôi đang cố gắng tải bộ dữ liệu shapefile OS OpenData Strategi vào cơ sở dữ liệu PostGIS. Tôi không gặp vấn đề gì với các shapefile đa tuyến và đa giác, nhưng tôi không thể tải các shapefiles điểm.

Tôi đang sử dụng dòng lệnh shp2pgsql sau đây để tạo bảng và tải dữ liệu:

shp2pgsql -c -I -s 27700 admin_font_point strategi_point | psql -d opendata

Lỗi tôi nhận được là:

Shapefile type: MultiPoint
Postgis type: MULTIPOINT[2]
SET
SET
BEGIN
NOTICE:  CREATE TABLE will create implicit sequence "strategi_point_gid_seq" for serial column "strategi_point.gid"
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "strategi_point_pkey" for table "strategi_point"
CREATE TABLE
                         addgeometrycolumn                         
-------------------------------------------------------------------
public.strategi_point.the_geom SRID:27700 TYPE:MULTIPOINT DIMS:2 
(1 row)

ERROR:  new row for relation "strategi_point" violates check constraint "enforce_geotype_the_geom"
ERROR:  current transaction is aborted, commands ignored until end of transaction block

Lỗi cuối cùng chỉ lặp lại cho mỗi lần chèn. SQL được tạo trông như sau:

SET CLIENT_ENCODING TO UTF8;
SET STANDARD_CONFORMING_STRINGS TO ON;
BEGIN;
CREATE TABLE "strategi_point" (gid serial PRIMARY KEY,
"code" int4,
"legend" varchar(42),
"file_name" varchar(16),
"number" numeric(11,0),
"name" varchar(180),
"number0" varchar(64),
"admin_name" varchar(50),
"type" varchar(40),
"ferry_from" varchar(50),
"ferry_to" varchar(50),
"ferry_time" varchar(10),
"ferry_type" varchar(20),
"restrictio" varchar(20),
"access" varchar(30),
"amended" date,
"usage" varchar(64),
"location" varchar(30),
"gis" varchar(80),
"owner" varchar(60),
"north" varchar(60),
"south" varchar(60),
"east" varchar(60),
"west" varchar(60),
"clockwise" varchar(60),
"anticlockw" varchar(60),
"imperial" int4,
"metric" int4);
SELECT AddGeometryColumn('','strategi_point','the_geom','27700','MULTIPOINT',2);
INSERT INTO "strategi_point" ("code","legend","file_name","number","name","number0","admin_name","type","ferry_from","ferry_to","ferry_time","ferry_type","restrictio","access","amended","usage","location","gis","owner","north","south","east","west","clockwise","anticlockw","imperial","metric",the_geom) VALUES ('5734','Administrative Detached Attribute Point','gb_north','5307',NULL,NULL,'ISLE OF MAN',NULL,NULL,NULL,NULL,NULL,NULL,NULL,'20000413',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'-9999','-9999','0101000020346C000000000000302A0A4100000000304F1C41');

và sau đó rất nhiều chèn tất cả trông giống nhau.

Tôi đã thử tất cả các loại biến thể; có và không có SRID; có và không có tệp .prj; tạo ra một cơ sở dữ liệu thử nghiệm mới mà không có dữ liệu nào khác; sử dụng hình học đơn giản; Nhưng tất cả đều không có tác dụng.

Tôi đã tạo sẵn tệp zip của shapefile nếu có ai có thời gian tự thử:

http://www.passback.org.uk/tmp/admin_font_point.zip

Tôi đang sử dụng đầy đủ cập nhật Fedora 14, Postgres 8.4.6, PostGIS 1.5.1.

Một số ghi chú cập nhật dựa trên đề xuất sử dụng SPIT:

Nếu tôi sử dụng shp2pgsql trong chế độ "chỉ tạo bảng", tôi nhận được một bảng với các ràng buộc sau:

Check constraints:
    "enforce_dims_the_geom" CHECK (st_ndims(the_geom) = 2)
    "enforce_geotype_the_geom" CHECK (geometrytype(the_geom) = 'MULTIPOINT'::text OR the_geom IS NULL)
    "enforce_srid_the_geom" CHECK (st_srid(the_geom) = 27700)

Nhìn vào bảng được tạo bởi SPIT tôi nhận được các ràng buộc hơi khác nhau:

Check constraints:
    "enforce_dims_the_geom" CHECK (st_ndims(the_geom) = 2)
    "enforce_srid_the_geom" CHECK (st_srid(the_geom) = 27700)

Tôi đoán rằng tôi có thể sử dụng shp2pgsql -p để tạo bảng và sau đó sử dụng psql để loại bỏ ràng buộc execce_geotype_the_geom và nhập hàng loạt của tôi từ dòng lệnh sử dụng shp2pgsql -a sẽ hoạt động.

Tôi vẫn muốn hiểu tại sao sự hạn chế đó lại gây ra vấn đề?

Cảm ơn,

Keith.

Câu trả lời:


6

Theo đề xuất của các câu trả lời khác, vấn đề có liên quan đến các loại POINT và MULTIPOINT. shp2pgsql (và ogrinfo) phát hiện loại hình học là MULTIPOINT, nhưng sau đó, khi tạo biểu diễn EWKB của hình học (giá trị để chèn vào cột_geom), dường như nó đang tạo ra hình dạng POINT:

select geometrytype('0101000020346C000000000000302A0A4100000000304F1C41');
--POINT

(Tôi đã lấy bản ghi được tạo đầu tiên)

Theo trang man shp2pgsql, có một lá cờ buộc hình học mới được tạo đơn giản, nhưng rõ ràng, nó không hoạt động trên các điểm:

   -S     Generate simple Geometries instead of MULTIgeometries. Shape files don't differ between LINESTRINGs and MULTILINESTRINGs, so shp2pgsql generates MUL
          TILINESTRINGs  by  default. This switch will produce LINESTRINGs instead, but shp2pgsql will fail when it hits a real MULTILINESTRING. The same works
          for POLYGONs vs. MULTIPOLYGONs.

Thay vì loại bỏ các ràng buộc vi phạm, tôi sẽ đề nghị thay đổi cột hình học trong tập lệnh SQL được tạo trước khi thực hiện nó với psql:

SELECT AddGeometryColumn('','strategi_point','the_geom','27700','POINT',2);

Bằng cách này, bạn sẽ tải được các bản ghi của mình, đồng thời giữ một ràng buộc có thể đảm bảo tính toàn vẹn dữ liệu của bạn trong tương lai.


3

Tôi không biết tại sao bạn lại gặp phải lỗi đó, nhưng tôi chỉ cố tải shapefile đã nén của bạn bằng cách sử dụng plugin SPIT trong QGIS và nó đã được nhập tốt. Điều này làm tôi ngạc nhiên khi tôi cho rằng SPIT chỉ là một gui cho shp2pgsql! Tôi đang sử dụng QGIS 1.6 trên windows nhưng nó cũng hoạt động tốt trên fedora.

Hi vọng điêu nay co ich

Jo


Plugin PostGIS Manager chắc chắn sử dụng shp2pgsql và nó không thành công với lỗi hiển thị ở trên. SPIT làm việc tốt cho tôi quá. Bây giờ phần thú vị sẽ là những gì nó làm khác nhau.
underdark

SPIT cũng hoạt động trên Fedora, phiên bản QGIS 1.6.0. Tôi đã cập nhật một số thông tin về cấu trúc bảng dựa trên quan điểm của @ underdark ở trên.
Keith Sharp

2
Chà, SPIT không sử dụng shp2pgsql. Nó tự làm tất cả. (Mã nguồn: svn.osgeo.org/qgis/trunk/qgis/src/plugins/spit )
underdark

2

Dựa trên các gợi ý từ @Archaogeek và @underdark Tôi đã đưa ra một giải pháp.

Sử dụng shp2pgsql để tạo cấu trúc bảng cơ bản:

shp2pgsql -p -s 27700 admin_font_point strategi_point | psql -d opendata

Bật psql và loại bỏ các ràng buộc vi phạm:

$ psql -d opendata
psql (8.4.6)
Type "help" for help.

opendata=# ALTER TABLE strategi_point DROP CONSTRAINT enforce_geotype_the_geom;
ALTER TABLE

Sau đó quay lại sử dụng shp2pgsql để tải số lượng lớn tất cả dữ liệu điểm của tôi (được điều khiển bởi tập lệnh shell):

shp2pgsql -a -s 27700 admin_font_point strategi_point | psql -d opendata

Tôi vẫn muốn hiểu vấn đề với sự ràng buộc đó.

Keith.


Tôi tự hỏi liệu rắc rối có thể là tất cả các MULTIPOINTS thực sự chỉ chứa một cặp tọa độ. Có thể tại một số điểm, chỉ được công nhận là ĐIỂM thay vì ĐA NĂNG.
underdark

2

Điều này hiện đã được sửa trên thân cây PostGIS, mặc dù tôi không chắc nó sẽ phát hành trong phiên bản nào.

-S hiện hoạt động cho MULTIPOINT -> POINT (http://trac.osgeo.org/postgis/ticket/779)

Và các điểm một đỉnh trong một shapefile đa điểm giờ tải chính xác dưới dạng các đa điểm của một đỉnh thay vì cố gắng chèn một ĐIỂM. (http://trac.osgeo.org/postgis/ticket/864)


1

Tôi nghĩ vấn đề là có lẽ có một số tính năng MULTIPOINT trong hình dạng và do đó, shp2pgsql phải sử dụng MULTIPOINT thay vì POINT. Sau đó, khi một ĐIỂM xuất hiện thay vì MULTIPOINT, có một vấn đề ràng buộc.

Tôi đã mong đợi một tùy chọn để buộc tất cả các điểm vào MULTIPOINT và tôi nghĩ ở đó, nhưng tôi không thể tìm thấy nó trong tài liệu. Có một chức năng để thực hiện nó tại những cái mà nó được tải trong cơ sở dữ liệu: ST_Multi , nhưng đó là rất ít giúp đỡ khi cố gắng tải nó.

Tôi đoán điều này phải được thảo luận trong danh sách PostGIS, nhưng tôi không thể tìm thấy nó dễ dàng.

/ Nicklas

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.