Saya mencoba memuat dataset shapefile Strategi OpenData OS ke dalam database PostGIS. Saya tidak punya masalah dengan polyline dan poligon shapefile, tetapi saya tidak bisa mendapatkan titik shapefile untuk dimuat.
Saya menggunakan baris perintah shp2pgsql berikut untuk membuat tabel dan memuat data:
shp2pgsql -c -I -s 27700 admin_font_point strategi_point | psql -d opendata
Kesalahan yang saya dapatkan adalah:
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
Kesalahan terakhir hanya mengulangi untuk setiap sisipan. SQL yang dihasilkan terlihat seperti:
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');
dan kemudian banyak lagi sisipan yang semuanya tampak sama.
Saya telah mencoba segala macam variasi; dengan dan tanpa SRID; dengan dan tanpa file .prj; membuat database pengujian baru tanpa data lain; menggunakan geometri sederhana; tetapi semua tidak berpengaruh.
Saya telah menyediakan file zip shapefile jika ada yang punya waktu untuk mencobanya sendiri:
http://www.passback.org.uk/tmp/admin_font_point.zip
Saya menggunakan Fedora 14 yang sepenuhnya terkini, Postgres 8.4.6, PostGIS 1.5.1.
Beberapa catatan yang diperbarui berdasarkan saran untuk menggunakan SPIT:
Jika saya menggunakan shp2pgsql dalam mode "buat tabel saja" saya mendapatkan tabel dengan batasan berikut:
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)
Melihat tabel yang dibuat oleh SPIT saya mendapatkan batasan yang sedikit berbeda:
Check constraints:
"enforce_dims_the_geom" CHECK (st_ndims(the_geom) = 2)
"enforce_srid_the_geom" CHECK (st_srid(the_geom) = 27700)
Saya kira saya bisa menggunakan shp2pgsql -p untuk membuat tabel dan kemudian menggunakan psql untuk menghapus batasan menegakkan_geotype_the_geom dan impor massal saya dari baris perintah menggunakan shp2pgsql -a harus bekerja.
Saya masih ingin memahami mengapa kendala itu menyebabkan masalah?
Terima kasih,
Keith.