[UMN_MAPSERVER-USERS] Question re: PostGIS and MapScript
getExtent() function
Paul Ramsey
pramsey at REFRACTIONS.NET
Tue Jul 12 14:37:24 EDT 2005
Steve,
Try it on a 20M record table in Oracle. Both implementations,
Oracle's and your uncommented PostGIS one, do the same functional
thing, which is a full table scan. It is possible that Oracle is
slightly smarter about reading the index for the AGGR_MBR case, which
might make it work better on large tables: one for the testing range.
I think your tuppence might be right on the money:
- Enable ms*GetLayerExtent() to provide the "right" answer in all
cases, even if it is expensive.
- Add a ms*GetLayerExtentFast() that for the easy data sources just
calls GetLayerExtent, and for the hard data sources does whatever
combination of fast hacks and cop-outs are required.
WMS GetCapabilities should call GetLayerExtentFast and mapscript
should call GetLayerExtent.
Unrelated question for the gurus: does GetLayerExtent respect filters
for all data sources?
Paul
On 12-Jul-05, at 11:30 AM, Steve Hall wrote:
> Thanks Paul,
>
> This all sounds very reasonable to me.... I'll keep this to myself
> for now then.
>
> I'm curious about the fact that this is implemented for Oracle
> which is performing a very similar operation (i.e a spatial
> aggregate, SDO_AGGR_MBR). Is Oracle more efficient than PostGIS in
> this area or is there a difference in approach that i'm missing...?
>
> For my two-pennorth a function like this is very useful, as it
> allows me to change the filter for a layer, and alter the map
> extent to match the extent of the "new" layer, without needing to
> do any "dirty" SQL on the back-end database manually to find the
> new extent. Perhaps if it can't / shouldn't be done via these
> msXXXLayerGetExtent() functions there is another way, or could it
> be listed as an enhancement?
>
> Thanks again, i'm new to the contributing side of Open Source so
> forgive my early mistakes!
>
> Steve
>
>
>
> ----- Original Message ----- From: "Paul Ramsey"
> <pramsey at refractions.net>
> To: "Steve Hall" <steve.hall at mercatorgeosystems.co.uk>
> Cc: <MAPSERVER-USERS at LISTS.UMN.EDU>; <MAPSERVER-DEV at LISTS.UMN.EDU>
> Sent: Tuesday, July 12, 2005 6:09 PM
> Subject: Re: [UMN_MAPSERVER-USERS] Question re: PostGIS and
> MapScript getExtent() function
>
>
>
>> Steve,
>>
>> If you grep through the source, you'll see the calls, which are
>> mainly in the WMS code (pulling extents for capabilities). The
>> problem is that the return time for the call can be very large
>> for very large tables. Which is not really acceptable for a
>> capabilities return. Maybe it is acceptable for your
>> application. This is the real problem. We want something with
>> very low return times (as a shapefile extents call is) but we
>> cannot get it with the extent() function, because that requires a
>> sequence scan.
>>
>> So basically, we cannot simply stick in your implementation, or
>> we are building a big obscure "gotcha" into mapserver. ("Why does
>> it take forever to return a capabilities file for my PostGIS
>> backed WMS? Everything else is fast.")
>>
>> Perhaps the folks on -DEV can return some zen wisdom on the
>> correct approach to this.
>>
>> Paul
>>
>> On 12-Jul-05, at 9:52 AM, Steve Hall wrote:
>>
>>
>>> Hi Paul,
>>>
>>> Exactly right - it definitely needs reviewing by those that know
>>> more about MapServer internals than I do. (which is most of you
>>> I expect).
>>>
>>> How is this function used my MapServer itself then? The context
>>> in which I am using it is via an explicit $layerObj->getExtent()
>>> call from PHP/MapScript, so in this respect the current
>>> implementation is not much use, but I suspect there is more to
>>> this function than just an implementation for this call. The
>>> main issue I had was that this function worked as I expected for
>>> Oracle, yet not for PostGIS, meaning I'd need some ugly code in
>>> my app to deal with the inconsistency...
>>>
>>> Anyway, i've attached my version of the function for you to take
>>> a look at. My implemenation is basically the version that was
>>> commented out, with the compilcation errors & warning resolved,
>>> added support for the FILTER expression and support for either
>>> BOX or BOX3D return clauses from PostGIS extent().
>>>
>>> Many thanks,
>>>
>>> Steve
>>>
>>>
>>>
>>> ----- Original Message ----- From: "Paul Ramsey"
>>> <pramsey at refractions.net>
>>> To: "Steve Hall" <steve.hall at MERCATORGEOSYSTEMS.CO.UK>
>>> Cc: <MAPSERVER-USERS at LISTS.UMN.EDU>
>>> Sent: Tuesday, July 12, 2005 3:49 PM
>>> Subject: Re: [UMN_MAPSERVER-USERS] Question re: PostGIS and
>>> MapScript getExtent() function
>>>
>>>
>>>
>>>
>>>> msPOSTGISLayerGetExtent() is potentially extremely inefficient,
>>>> depending on how it is implemented, so I would have to see your
>>>> patch to judge if it does more harm than good. It may be doing
>>>> good things for you and bad things for others. One thing it
>>>> *could* do without harm is read the wms_extent meta-parameter
>>>> and use that if it is provided by the user. There are also a
>>>> few version specific fast extent functions available in
>>>> PostGIS, but they are not guaranteed to work in all cases, at
>>>> all times, correctly.
>>>>
>>>> On 12-Jul-05, at 2:58 AM, Steve Hall wrote:
>>>>
>>>>
>>>>
>>>>> Hi All,
>>>>>
>>>>> I'm using MapServer 4.6.0 with Oracle Spatial and PostGIS data
>>>>> sources via PHP/MapScript. Part of my application code looks
>>>>> like this pseudo-code :
>>>>>
>>>>> $map->setLayerFilter("ThematicData", "REQUEST_ID=121");
>>>>> $map->zoomToLayer("ThematicData");
>>>>> Here i'm setting a specific FILTER expression for a layer, and
>>>>> then zooming to the extent of the (now filtered) layer. I use
>>>>> the layerObj->getExtent() and then mapObj->setExtent()
>>>>> functions to achieve this behind the scenes. This works great
>>>>> for Oracle, the query is fast and makes for nice, tidy code in
>>>>> my application without the need for Oracle specific SQL
>>>>> statements to derive the new extent.
>>>>>
>>>>> However when I try this on PostGIS I just get a massive
>>>>> (useless) extent returned. Digging into the code I can see
>>>>> that the msPOSTGISLayerGetExtent() function in mappostgis.c
>>>>> is effectively doing nothing although a lot of code is
>>>>> commented out.
>>>>>
>>>>> Working on my local code I have re-enabled this code, fixed the
>>>>> compilation errors and changed it so that when a FILTER is
>>>>> applied to the layer this is used as part of the SQL call to
>>>>> PG. It seems to work great (from PHP/MapScript) and
>>>>> performance is fine and is really useful for me meaning I
>>>>> don't need to calculate the extents for a map myself -
>>>>> MapServer can supply the information in a generic and
>>>>> abstract fashion.
>>>>>
>>>>> Ideally I would like to get this code fed back into MapServer,
>>>>> but of course only if it's acceptable to you all. So,
>>>>> should I instead post this to mapserver-dev or can I pass on
>>>>> the new code to someone from here?
>>>>>
>>>>> There may be good, historical, reasons why this wasn't ever
>>>>> implemented though so please let me know!
>>>>>
>>>>> Many thanks,
>>>>>
>>>>> Steve Hall
>>>>>
>>>>>
>>>>> <msPOSTGISLayerGetExtent.c>
>>>>>
>
>
More information about the mapserver-dev
mailing list