Ich versuche, das OS OpenData Strategi-Shapefile-Dataset in eine PostGIS-Datenbank zu laden. Ich hatte keine Probleme mit den Polylinien- und Polygon-Shapefiles, aber ich kann die Punkt-Shapefiles nicht laden.
Ich verwende die folgende shp2pgsql-Befehlszeile, um die Tabelle zu erstellen und die Daten zu laden:
shp2pgsql -c -I -s 27700 admin_font_point strategi_point | psql -d opendata
Der Fehler, den ich bekomme, ist:
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
Der letzte Fehler wird nur für jede Einfügung wiederholt. Das generierte SQL sieht folgendermaßen aus:
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');
und dann noch viel mehr Beilagen, die alle gleich aussehen.
Ich habe alle möglichen Variationen ausprobiert. mit und ohne SRID; mit und ohne PRJ-Datei; eine neue Testdatenbank ohne andere Daten erstellt; mit einfachen Geometrien; aber alles ohne Wirkung.
Ich habe eine Zip-Datei mit Shapefile zur Verfügung gestellt, wenn jemand die Zeit hat, dies selbst zu versuchen:
http://www.passback.org.uk/tmp/admin_font_point.zip
Ich verwende eine vollständig aktuelle Fedora 14, Postgres 8.4.6, PostGIS 1.5.1.
Einige aktualisierte Hinweise basierend auf dem Vorschlag, SPIT zu verwenden:
Wenn ich shp2pgsql im Modus "Nur Tabelle erstellen" verwende, erhalte ich eine Tabelle mit den folgenden Einschränkungen:
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)
Wenn ich mir die von SPIT erstellte Tabelle ansehe, erhalte ich etwas andere Einschränkungen:
Check constraints:
"enforce_dims_the_geom" CHECK (st_ndims(the_geom) = 2)
"enforce_srid_the_geom" CHECK (st_srid(the_geom) = 27700)
Ich denke, ich könnte shp2pgsql -p verwenden, um die Tabelle zu erstellen, und dann psql verwenden, um die Einschränkung erzwingen_geotype_the_geom zu entfernen, und mein Massenimport von der Befehlszeile mit shp2pgsql -a sollte funktionieren.
Ich möchte immer noch verstehen, warum diese Einschränkung ein Problem verursacht.
Vielen Dank,
Keith.