[postgis-users] reusing MapServer query-string
heiko
heiko.kehlenbrink at vermes.fh-oldenburg.de
Mon Nov 11 06:27:48 PST 2002
Jan Hartmann wrote:
> Hello Heiko,
>
> I see three problems with your data statement:
>
> 1) A general SQL syntax error: table names should precede column names:
> ---> select flstk.the_geom, flstk.gm .... from flstk
>
> 2) A PostgreSQL requirement: subselects have to be given a name:
>
> ------> select the_geom from (select .... ) as foo
>
> 3) A PostGIS requirement: in a subselect the OID variable has to be
> added explicitly. This is the same problem Horst Düster put on the
> MapServer list a few weeks ago. I couldn't find it in the list
> archives; the MapServer site crashed some time ago, and the mailling
> list archive still seems to have problems. These is the posting from
> my own mail archive:
>
> In a subselect, you have to add explicitly the OID field (select oid,*
> from ...). OID is an invisible field in every table that is used by
> the PostGIS connector. It is not automatically included when you
> specify * in a select clause.
>
> So you data statement should be:
>
> DATA "the_geom from
> > (select flstk.the_geom, flstk.oid,flstk.gm, flstk.fl, flstk.fz,
> flstk.fn from flstk) as foo"
>
> For testing purposes, I don't use myself the HEADER/FOOTER/TEMPLATE
> method, but just try to display the PostGIS layer as a regular map
> with a global TEMPLATE. After you get a basic map on the screen you
> can always experiment further with more intricate MapFiles.
>
> Hope this solves at least part of the problem.
>
> Good luck,
>
> Jan Hartmann
> Department of Geography
> University of Amsterdam
> jhart at frw.uva.nl
>
> PS: Please use the newest version MapServer (3.6.3) It gives much
> better PostGIS error messages.
>
>
> heiko wrote:
>
>> Hi all,
>> I'm a GIS student working on a project using a Postgis/Postgresql
>> Database
>> connected with the UMN-MapServer
>>
>> Jan Hartmann wrote:
>>
>>> /
>>
>>
>> />/ Is it possible to reuse a PostGIS query for Mapserver within
>> PHP-MapScript,
>> />/ once the map has been created? The usual way to create a map
>> layer from
>> />/ Postgis is:
>> />/ />/ $layer->set("connectiontype","POSTGIS");
>> />/ $layer->set("connection","host = ... port=... etc");
>> />/ $layer->set("data","the_geom from table");
>> />/ />/ This works fine, even with complex subselects within the
>> DATA-step, like:
>> />/ "the geom from
>> />/ (select table1.the_geom, table1.datavar from table1,table2
>> />/ where (distance(table1.the_geom,table2.the_geom)) = 0
>> />/ and table1.linkvar = table2.linkvar
>> />/ )
>> />/ "
>> />/ />/ This wil produce a map with only the elements of table1 that
>> are overlapping
>> />/ with elements of table2 (very nice indeed!). I can even use the
>> values of
>> />/ "datavar" to create classes within Mapserver, like
>> />
>> / I've got a working mapfile containing:
>>
>> /LAYER
>> NAME "Flurstuecke"
>> STATUS ON
>> DATA "the_geom from flstk"
>> TYPE POLYGON
>> CONNECTIONTYPE POSTGIS
>> CONNECTION "user=gast dbname=mapserver host=127.0.0.1"
>> TOLERANCE 2
>> HEADER
>> "/usr/local/httpd/htdocs/mapserver_demos/koman/htdocs/flstk_header.html"
>> FOOTER
>> "/usr/local/httpd/htdocs/mapserver_demos/koman/htdocs/flstk_footer.html"
>> CLASS
>> NAME "Flurstuecke"
>> OUTLINECOLOR 0 0 255
>> TEMPLATE
>> "/usr/local/httpd/htdocs/mapserver_demos/koman/htdocs/flstk.html"
>> END
>> END
>>
>> Jan if i understand your posting right it should be possible to alter
>> the mapfile like this
>> (assuming the fields in the table were correct):
>>
>> LAYER
>> NAME "Flurstuecke"
>> STATUS ON
>> DATA "the_geom from
>> (select flstk.the_geom, gm.flstk, fl.flstk, fz.flstk, fz.flstk,
>> fn.flstk from flstk)"
>> TYPE POLYGON
>> CONNECTIONTYPE POSTGIS
>> CONNECTION "user=gast dbname=mapserver host=127.0.0.1"
>> TOLERANCE 2
>> HEADER
>> "/usr/local/httpd/htdocs/mapserver_demos/koman/htdocs/flstk_header.html"
>> FOOTER
>> "/usr/local/httpd/htdocs/mapserver_demos/koman/htdocs/flstk_footer.html"
>> CLASS
>> NAME "Flurstuecke"
>> OUTLINECOLOR 0 0 255
>> TEMPLATE
>> "/usr/local/httpd/htdocs/mapserver_demos/koman/htdocs/flstk.html"
>> END
>> END
>>
>> and getting the selected fields in a manner mapserver could
>> understand them.
>> Doing so i received following mapserver message:
>>
>>
>> msPOSTGISLayerWhichShapes(): Query error. prep_DB:Error executing
>> POSTGIS
>> DECLARE statement (0.6 failed - retried 0.5 and it failed too). DECLARE
>> mycursor BINARY CURSOR FOR SELECT
>> asbinary(force_collection(force_2d(the_geom
>> from (select flstk.the_geom, gm.flstk, fl.flstk, fz.flstk, fz.flstk,
>> fn.flstk)),'NDR'),OID::text
>> from flstk) WHERE the_geom from (select flstk.the_geom, gm.flstk,
>> fl.flstk,
>> fz.flstk, fz.flstk, fn.flstk && setSRID('BOX3D(3478900 6080400,3479700
>> 6081200)'::BOX3D, find_srid('','flstk)','the_geom from (select
>> flstk.the_geom,
>> gm.flstk, fl.flstk, fz.flstk, fz.flstk, fn.flstk') )
>>
>> any help welcome
>>
>> Best Regards
>>
>> Heiko Kehlenbrink
>>
>>
>> ,
>
Wow, that was a really fast response,
thank you!
I could solve my problem following your advise.
But I also had to install the newest cvs-tarball of postgis.
Best Regards
Heiko
More information about the postgis-users
mailing list