[Mapserver-DE] getshape auf Postgis braucht oid?

Silke Reimer Silke.Reimer at intevation.de
Don Mar 2 14:56:03 CET 2006


Hallo!

On Thu, Mar 02, 2006 at 09:12:01AM +0000, Martin Spott wrote:
> Frank Koormann wrote:
> > * Martin Spott <Martin.Spott at mgras.net> [060301 18:25]:
> >> Setze den Parameter 'log_statement' in der 'postgresql.conf' auf "all",
> >> dann siehst Du im Log der Datenbank, dass PostGIS explizit eine Query
> >> formuliert, die das Vorhandensein einer OID erfordert. Ist keine
> >> Vorhanden, gibt's auch keine Ergebnismenge - obgleich die Daten
> >> eigentlich in der DB stehen,
> > 
> > Das kann ich mit einer Kombination PostgreSQL 8.1.3, PostGIS 1.1.1 und
> > MapServer 4.6/4.8 nicht bestätigen. Welche Versionen setzt Du ein?
> 
> PostgreSQL 8.1.3, PostGIS 1.1.1 und Mapserver 4.6.2. Ich hatte mir die
> Query mal aus dem Logfile gepflueckt nud zu Fuss ausgefuehrt: Das
> Ergebis war tatsaechlich leer. In der Map-Datei steht als Deklaration
> der Daten nur der standard-Text, z.B.:
> 
>   DATA "wkb_geometry from lakes_lake"
> 
> Dann sucht der Mapserver natuerlich nach
> 
>   asbinary(force_collection(force_2d(wkb_geometry)),'XDR')
> 
> aber auch nach:
> 
>   gid::text
> 
> Die 'gid' hab' ich nicht, aber das kann ich ihm beibringen, indem ich
> die Deklaration um:
> 
>   USING UNIQUE <irgendwas>
> 
> erweitere. Wirklich ein Ergebnis bekomme ich jedenfalls nur dann, wenn
> ich als UNIQUE die OID abgebe - gesetzt den Fall, sie ist vorhanden.

Richtig. Dabei ist der Nachsatz "gesetzt den Fall, sie ist
vorhanden" der entscheidenen Hinweis: Wenn das unter <irgendwas>
angegebene Attrbut nicht eindeutig ist, dann hilfe ein "USING
UNIQUE" an dieser Stelle nicht weiter.

Darüber hinaus gilt: Wenn ein Attribut als "Primary Key" eingetragen
ist, dann erkennt des MapServer das und benutzt dieses Attribut als
UNIQUE. shp2pgsql legt einen Primary Key an. Der heißt dann gid.
ogr2ogr legt zwar eine eindeutige Spalte an (die heißt dann meistens
ogc_fid), kennzeichnet diese aber nicht als primary key.

> 
> 
> Stoert es, wenn ich an dieser Stelle weiterfuehrende Probleme mit
> Mapserver und PostGIS schildere ? Ich haenge naemlich nun am naechsten
> Problem und habe noch keine Loesung dazu. Meistens, aber nicht immer
> bekomme ich beim Ausfuehren meiner Query, also diejenige, die der
> Mapserver zusammenbaut:
> 
>   BEGIN;
>   DECLARE mycursor BINARY CURSOR FOR SELECT asbinary(force_collection(force_2d(wkb_geometry)),'XDR'),oid::text from lakes_lake WHERE wkb_geometry && setSRID('BOX3D(8.09 46.57, 11.25 49)'::BOX3D, find_srid('','lakes_lake','wkb_geometry') );
>   FETCH ALL in mycursor;
>   COMMIT;
> 
> .... einen Fehler zurueck, und der sieht so aus:
> 
>   ERROR:  Operation on two geometries with different SRIDs
> 
> Ich habe die Daten zumindest in der Tabelle 'lakes_lake' alle fein mit
> einer SRID von '-1' importiert (mittels 'shp2pgsql' und dann in einen
> 'psql' gepfiffen). Lasse ich die SRID aus, sehe ich denselben Fehler.
> Der Fehler tritt nicht immer auf, aber ich habe noch nicht ermittelt,
> wann genau er nicht auftritt. Das Trial-and-Error braucht in diesem
> Fall so ewig viel Zeit ....
> Hast Du dazu eine flinke Idee ?

Der MapServer verwendet standardmäßig die SRID, die für die Geometry
eingetragen ist. Gefunden wird die SRID über
"find_srid('','lakes_lake','wkb_geometry')"
Für die BoundingBox, in der gesucht wird, wird sie gesetzt über 
"setSRID('BOX3D(8.09 46.57, 11.25 49)'::BOX3D, [...])"

Bei Dir scheint das manchmal nicht zu funktionieren. Das weist
darauf hin, dass unterschiedliche SRIDs für die Geometrien Deiner
Tabelle vorhanden sind. Das kann passieren, wenn kein Constraint
existiert, der dafür sorgt, dass nur Geometrien mit der gleichen
SRID eingetragen werden wie die anderen Geometrien auch. 
Die Ausgabe von "\d <tabellenname>" müsste dann so etwas wie die
folgende Zeile enthalten
"enforce_srid_the_geom" CHECK (srid(the_geom) = -1)

Ob mehr als eine SRID in der Tabelle eingetragen ist, findet man
heraus über
select distinct srid(<geom_column>) from <tabelle>;
Steht dort mehr als ein Ergebnis, liegt das Problem in der Tabelle.
In diesem Fall müssten dann die Geometrien so angepasst werden, dass
alle die selbe SRID enthalten - oder die MapServer-Konfiguration so,
dass pro SRID ein Layer existiert.

Ich hoffe das hilft weiter.

Viele Grüße,

    Silke

-- 
Silke Reimer   : www.intevation.de/~silke | GISpatcher: www.gispatcher.de
Intevation GmbH: www.intevation.de        | Thuban    : thuban.intevation.org
Georgstr.4     : 49074 Osnabrück          | FreeGIS   : www.freegis.org
-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : nicht verfügbar
Dateityp    : application/pgp-signature
Dateigröße  : 189 bytes
Beschreibung: Digital signature
URL         : http://www.intevation.de/pipermail/mapserver-de/attachments/20060302/5f4f16ef/attachment.bin


This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)