[mapguide-users] Getting all object Enveloppe

Kenneth, GEOGRAF A/S ks at geograf.dk
Thu Jun 7 04:57:56 EDT 2007


Yes, you should be able to assign the query to the MgQueryOptions object.

I don't have a syntax sample, and the avalibility/performance would 
probally depend heavily on the provider.

If you have a lot of features/layers, I would probally be a perfomance 
killer doing it manually.

Regards, Kenneth, GEOGRAF A/S



David Hequet wrote:
> and about "Select Envelope(geometry) from datasource"
> I can do that with ExecuteSqlQuery ?
> do you have a syntaxe sample? i think i have to check if the fdoprovider has
> this "SpatialExtents" capability? 
> going through each object can be very slow on each map loading..
>
>
> Kenneth, GEOGRAF A/S wrote:
>   
>> Yes, you have to run through each feature in the feature reader.
>> Then on each feature, you have to use some of the obscure 
>> AgfReader/Bytereader stuff to get the actual object out of the geometry 
>> column.
>> When you have the object, it has a GetEnvelope() method.
>>
>> Regards, Kenneth, GEOGRAF A/S
>>
>>
>> David Hequet wrote:
>>     
>>> Arg, i was so close of my goal
>>>
>>> I think i have to take a look on your idea because of MGSelection seems
>>> to
>>> have a limit.
>>>
>>> here is my code:
>>>
>>> For i = 0 To aMgLayerCollection.GetCount() - 1
>>>     aLayer = aMgLayerCollection.GetItem(i)
>>>     aProvider = Me._getLayerSourceType(, aLayer)
>>>     If aProvider <> "Autodesk.Raster" And aProvider <> "DWF" Then
>>>
>>>         aLayerClassName = aLayer.GetFeatureClassName()
>>>         If aClassArray.IndexOf(aLayerClassName) = -1 Then
>>>             Me._log(aLayerClassName)
>>>             aLayerFeatureId = aLayer.GetFeatureSourceId()
>>>             aLayerResId = New MgResourceIdentifier(aLayerFeatureId)
>>>             aFeatureReader =
>>> Me._featureService.SelectFeatures(aLayerResId,
>>> aLayerClassName, aMGQueryOptions)
>>>             aMGSelection.AddFeatures(aLayer, aFeatureReader, 0)
>>>             aClassArray.Add(aLayerClassName)
>>>         End If
>>>     End If
>>> Next i
>>> aMgEnveloppe = aMGSelection.GetExtents(Me._featureService)
>>> I got an error:
>>> Une exception non classifiée s'est produite.Une exception non classifiée
>>> s'est produite.
>>> Une exception s'est produite dans la méthode
>>> MgServerSelectFeatures.SelectFeatures à  la ligne 217 dans le fichier
>>> c:\build_tux_area\mgdev\server\src\services\feature\ServerSelectFeatures.cpp
>>> In english "non classified error"
>>> When i use this method
>>> aMgEnveloppe = aMGSelection.GetExtents(Me._featureService)
>>>
>>> it didn't happen every time: 
>>> on a map with ~30 features dispatched on 4 layers it's ok
>>> on a map with ~1200 features on 2 layers it crash (if i try too much the
>>> mgserver service crash).
>>>
>>> i didn't see a getExtent method on the featurereader, i think i have to
>>> check enveloppe for each feature in the reader?
>>>
>>>
>>> Kenneth, GEOGRAF A/S wrote:
>>>   
>>>       
>>>> You don't have to use the selection part.
>>>> You can extract the object directly from the feature reader.
>>>> Once you have the object, you can also get the extent (aka bbox).
>>>> If you then construct an envelope object, you can add the features 
>>>> envelope to original envelope.
>>>>
>>>> Something like:
>>>>
>>>> create a new MgFeatureQueryOptions with an empty filter
>>>> create a new Envelope
>>>> For Each Layer
>>>> {
>>>>    Use a featureReader with the MgFeatureQueryOptions
>>>>    Add the feature's envelope to the outer Envelope
>>>> }
>>>> Get zoom extents from the Envelope
>>>>
>>>>
>>>> Other than this, I don't think you can optimize it anymore, as you need 
>>>> to execute the query on each layer.
>>>>
>>>> I think there is a "Get Extents" on the feature source, but I can't find 
>>>> it. And I don't think it works on filtered datasources.
>>>>
>>>> Perhaps you can execute the query with some SQL optimizations like 
>>>> "Select Envelope(geometry) from datasource".
>>>>
>>>> Hope it helps.
>>>>
>>>> Regards, Kenneth, GEOGRAF A/S
>>>>
>>>>
>>>>
>>>> David Hequet wrote:
>>>>     
>>>>         
>>>>> Hello,
>>>>>
>>>>> I'm trying to make a fonction that can return me the enveloppe of the
>>>>> entire
>>>>> visible map (no way with original map extent).
>>>>>
>>>>> Explain: I have a map "template" with a lot of layers, i have a
>>>>> function
>>>>> that change all the layer filter (basic filter, no spatial) to see
>>>>> different
>>>>> map based on that template. Doing that make the "zoom to original
>>>>> extent"
>>>>> useless, because data are not on the same area.
>>>>> I wan't to set the new map extent in the MapDefinition. 
>>>>> My ask is about getting the new extent.
>>>>>
>>>>> I thought to do it like that:
>>>>>
>>>>> create a new MgSelection
>>>>> create a new MgFeatureQueryOptions with an empty filter
>>>>> For Each Layer
>>>>> {
>>>>>    Use a featureReader with the MgFeatureQueryOptions
>>>>>    Add the selected feature to the MgSelection
>>>>> }
>>>>> Getting the MgSelection enveloppe
>>>>>
>>>>> It will work, but i don't think it's very optimized with a lot of
>>>>> Layer/Feature (and it will used at each map load, filter
>>>>> modification..)
>>>>>
>>>>> Did someone have a better way?
>>>>>
>>>>> Thank you!
>>>>>
>>>>> Ps: sorry for my poor english, ask i you want precision.
>>>>>   
>>>>>       
>>>>>           
>>>> _______________________________________________
>>>> mapguide-users mailing list
>>>> mapguide-users at lists.osgeo.org
>>>> http://lists.osgeo.org/mailman/listinfo/mapguide-users
>>>>
>>>>
>>>>     
>>>>         
>>>   
>>>       
>> _______________________________________________
>> mapguide-users mailing list
>> mapguide-users at lists.osgeo.org
>> http://lists.osgeo.org/mailman/listinfo/mapguide-users
>>
>>
>>     
>
>   
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.osgeo.org/pipermail/mapguide-users/attachments/20070607/63dd78dd/attachment.html


More information about the mapguide-users mailing list