[Mapserver-DE] getshape auf Postgis braucht oid?

Thomas Baschetti Thomas.Baschetti at gmx.de
Don Mar 2 10:54:26 CET 2006


Hallo,
> Hallo,
> 
> welche Versionen der beteiligten Komponenten werden eingesetzt?

PostgreSQL 8.1.3, postgis 1.1.1, Mapserver 4.6.1
MapServer version 4.6.1 OUTPUT=GIF OUTPUT=PNG OUTPUT=JPEG OUTPUT=WBMP
OUTPUT=PDF
 OUTPUT=SWF OUTPUT=SVG SUPPORTS=PROJ SUPPORTS=FREETYPE SUPPORTS=WMS_SERVER
SUPPO
RTS=WMS_CLIENT SUPPORTS=WFS_SERVER SUPPORTS=WFS_CLIENT SUPPORTS=WCS_SERVER
INPUT
=JPEG INPUT=POSTGIS INPUT=OGR INPUT=GDAL INPUT=SHAPEFILE DEBUG=MSDEBUG

das ganze unter Windows 2000 und XP Prof. getestet

> 
> * Thomas Baschetti <Thomas.Baschetti at gmx.de> [060228 16:12]:
> > Also, ich versuche gerade mit edbs2wkt erzeugte Postgislayer über
> > PHP/Mapscript abzufragen, stosse dabei aber auf folgende Schwierigkeit:
> > 
> > Die Tabellen in PostgreSQL sind ohne OID erzeugt (without oid).
> > Beim Abgreifen der Daten erhalte ich zwar eine Ergebnisanzahl,
> > der Zugriff auf die Objekte ist aber erfolglos:
> > 
> > $res = $lyr->queryByPoint($point_obj, MS_MULTIPLE,2);
> > echo "Gefunden:" . $lyr->getNumResults() . " Objekte <BR>";
> > //ergibt ein Ergebnis, es wird also etwas gefunden
> > $lyr->open();
> > for ($i=0;$i<$anzahl;$i++){
> >   $cmo = $lyr->getresult($i);
> >   $shp = $lyr->getshape(-1,$cmo->{shapeindex});
> 
> Ist das der tatsächliche Code? $anzahl ist gar nicht initialisert, bzw.
> zumindest nicht == getNumResults() aus der aktuellen Query.

Hoppla, stimmt, eine Zeile zuviel gelöscht, das sieht eigentlich so aus:
$lyr->open();
$anzahl = $lyr->getNumResults();
echo "<TABLE BORDER=1 CELLSPACING=2 CELLPADDING=2 SIZE='100%'>";
echo "<TR>";
echo "<TH ALIGN='left'>Flurst&uuml;ck:</TH><TH
ALIGN='left'>Eigent&uuml;mer</TH>";
echo "</TR>";
for ($i=0;$i<$anzahl;$i++){

usw.

> > die letzte Zeile liefert bei Postgis-Layern mit OID ein Ergebnis
> > (ebenso mit Shapefiles), bei Layer ohne OID aber nicht.
> > 
> > Was also mache ich hier falsch? Brauche ich hier unbedingt eine
> > OID oder einen numerischen unique-Wert? Die Objekte selber
> > werden ja gefunden (siehe getNumResults()), aber der Zugriff
> > auf die Objekte klappt dann nicht.
> > 
> > Die Data-Zeile der Layer:
> > 
> > DATA "the_geom from (select * from f001_e_fla) as foo using unique objnr
> > using SRID=31466"
> > (ohne OID)
> 
> Ja, MapServer braucht einen eindeutigen Key: 
> - Im ersten Schritt einer QueryByPoint / QueryByRect wird eine räumliche
>   Abfrage ausgeführt und nur die in Klassen/Expressions der
>   Layer-Definition benutzten Attribute, die Geometrien und der durch 
>   unique identifizierte eindeutige Schlüssel abgefragt.
>   Daher gibt es auch eine Anzahl an Treffern.
> - Werden nun mit getResult() einzelne Ergebnisse angefordert, so werden
>   diese in einzelnen Queries anhand des eindeutigen Keys aus der
>   Datenbank geholt.  
> 
> Wenn objnr im obigen Beispiel ein solcher ist, sollte es mit aktuellen 
> MapServer-Versionen (>= 4.6.0) funktionieren. Dann tauchen in den 
> Logs auch keine Bezüge auf OID auf.

Hm, Datenquelle im mapfile ist
DATA "the_geom from (select * from f001_e_fla) as foo using unique objnr
using SRID=31466"
 
wobei f001_e_fla folgendermaßen definiert ist:
---
CREATE OR REPLACE VIEW f001_e_fla AS 
 SELECT alkobj_e_fla.objnr, alkobj_e_fla.objart, alkobj_e_fla.bemerkung,
alkobj_e_fla.the_geom
   FROM alkobj_e_fla
  WHERE alkobj_e_fla.folie::text = '001'::text AND alkobj_e_fla.the_geom IS
NOT NULL;
ALTER TABLE f001_e_fla OWNER TO alkemsbueren;
---

und alkobj_e_fla:
---
CREATE TABLE alkobj_e_fla
(
  objnr varchar(7) NOT NULL DEFAULT ''::character varying, -- Objektnummer
(eindeutiger interner Schlüssel eines ALK-Objektes)
  folie varchar(3) NOT NULL DEFAULT ''::character varying, -- fachliche
Ebene, Folie
  objart int2 NOT NULL, -- Objektart laut OSKA (Objektschlüsselkatalog des
Bundeslandes)
  objgeom text, -- Geometrie des Objektes, WKT-Format
  bemerkung text, -- Besonderheiten bei der Konvertierung
  the_geom geometry, -- WKT Geometrie
  CONSTRAINT alkobj_e_fla_pkey PRIMARY KEY (objnr),
  CONSTRAINT "fkOBJNR_e_fla" FOREIGN KEY (objnr)
      REFERENCES alkobjekte (objnr) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE CASCADE,
  CONSTRAINT enforce_dims_the_geom CHECK (ndims(the_geom) = 2),
  CONSTRAINT enforce_geotype_the_geom CHECK (geometrytype(the_geom) =
'MULTIPOLYGON'::text OR the_geom IS NULL),
  CONSTRAINT enforce_srid_the_geom CHECK (srid(the_geom) = 31466)
) 
WITHOUT OIDS;
ALTER TABLE alkobj_e_fla OWNER TO alkemsbueren;
COMMENT ON TABLE alkobj_e_fla IS 'Objekte der ALK - Elementarobjekte:
Flaechen';
COMMENT ON COLUMN alkobj_e_fla.objnr IS 'Objektnummer (eindeutiger interner
Schlüssel eines ALK-Objektes)';
COMMENT ON COLUMN alkobj_e_fla.folie IS 'fachliche Ebene, Folie';
COMMENT ON COLUMN alkobj_e_fla.objart IS 'Objektart laut OSKA
(Objektschlüsselkatalog des Bundeslandes)';
COMMENT ON COLUMN alkobj_e_fla.objgeom IS 'Geometrie des Objektes,
WKT-Format';
COMMENT ON COLUMN alkobj_e_fla.bemerkung IS 'Besonderheiten bei der
Konvertierung';
COMMENT ON COLUMN alkobj_e_fla.the_geom IS 'WKT Geometrie';


-- Index: gist_e_fla

-- DROP INDEX gist_e_fla;

CREATE INDEX gist_e_fla
  ON alkobj_e_fla
  USING gist
  (the_geom);

-- Index: "ixOBJlay_e_fla"

-- DROP INDEX "ixOBJlay_e_fla";

CREATE INDEX "ixOBJlay_e_fla"
  ON alkobj_e_fla
  USING btree
  (folie);
---

(Das ganze aus EDBS2WKT)

Sobald ich eine Tabelle mit OID generiere (also WITH OIDS) funktioniert
das ganze.


> Wenn ansonsten nicht mehr als 2^32 (=4.294.967.296) Objekte in einer 
> Tabelle erwartet werden, könnten auch OIDs aktiviert werden. 

so habe ich es jetzt, dann läuft es auch...

Ich habe bisher aber noch keine logfiles (siehe mail von Martin) erzeugt,
werde ich mal testen wenn ich etwas Zeit habe.

Danke,
Thomas Baschetti
ITEBO GmbH

-- 
Bis zu 70% Ihrer Onlinekosten sparen: GMX SmartSurfer!
Kostenlos downloaden: http://www.gmx.net/de/go/smartsurfer




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