Question re: PostGIS and MapScript getExtent() function
Steve Hall
steve.hall at MERCATORGEOSYSTEMS.CO.UK
Tue Jul 12 11:52:04 PDT 2005
In my experience with Oracle it too can be pretty slow getting an MBR on a
table that big ;-)
I don't know much about other data sources, but Oracle's spatial metadata
registry (USER_SDO_GEOM_METADATA) does maintain layer extent data in the
DIMINFO column so could be retrieved without needing to perform a spatial
aggregate, and hence would be a suitable candidate for the *Fast function
you descibe here.
Like you say PostGIS also has a couple of choices in this area.
I guess by definition the *Fast functions would just ignore, (or fail?) if a
filter was specified...? Or perhaps if a filter is specified, the *Fast
functions could call the non-Fast functions to get the answer in the
(blind?) hope that the filter makes them sufficiently performant.
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>; <MAPSERVER-DEV at LISTS.UMN.EDU>
Sent: Tuesday, July 12, 2005 7:37 PM
Subject: Re: [UMN_MAPSERVER-USERS] Question re: PostGIS and MapScript
getExtent() function
> 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-users
mailing list