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.