[OpenLayers-Users] Highlighting the selected geometry

Lehtonen, Mika mika at digikartta.net
Thu Sep 11 09:34:16 EDT 2008


I got it working. Not the highlighting, but GetFeature. Those of you who 
don't know what I have been up to, I've been trying to do what is done 
in http://www.openlayers.org/dev/examples/getfeatureinfo.html , but with 
GetFeature. With this code I get feature's data by clicking it like in 
that example. You can decode the filter e.g. in 
http://meyerweb.com/eric/tools/dencoder/ . What was wrong with other 
browsers than FF3, was that I forgot apostrophes off around the filter 
declaration. In FF3, I noticed that it doesn't care about URL encoding, 
just stick your staff into it as it is.

cheers,
mika

map.events.register('click', null, function (e) {
OpenLayers.Util.getElement('nodelist').innerHTML = "Please wait...";
	var hiiri = wfs.map.getLonLatFromPixel(e.xy);
	var hiirixy = (hiiri.lat+','+hiiri.lon);

	var url =  wfs.getFullRequestString({
			SERVICE: 'WFS',
			VERSION: '1.1.0',
			REQUEST: 'GetFeature',
			OUTPUTFORMAT: 'json',
			PROPERTYNAME: 'the_geom,LAYER',
			MAXFEATURES: 5,
			TYPENAME: 'dikanet:karsa_region',
			SRSNAME: 'EPSG:2393',
			FILTER:
'%3Cwfs%3AFeatureCollection%20xmlns%3Awfs%3D%22http%3A//www.opengis.net/wfs%22%3E%3Cgml%3AfeatureMember%20xmlns%3Agml%3D%22http%3A//www.opengis.net/gml%22%3E%3CFilter%3E%3CContains%3E%3CPropertyName%3Ethe_geom%3C/PropertyName%3E%3Cgml%3APoint%3E%3Cgml%3Acoordinates%3E%7Bhiirixy%7D%3C/gml%3Acoordinates%3E%3C/gml%3APoint%3E%3C/Contains%3E%3C/Filter%3E%3C/gml%3AfeatureMember%3E%3C/wfs%3AFeatureCollection%3E'
},"http://karsamaki.digikartta.net/asemakaavat/wfs"
                           );

			OpenLayers.loadURL(url,'',this,yourFunction);				
			Event.stop(e);
			});

function yourFunction(response) { // this will only zoom into selected feature..
					// alert(response.responseText);
					g =  new OpenLayers.Format.JSON();
					jsonni = g.read(response.responseText);
					var rajat = new OpenLayers.Bounds(jsonni.bbox[0],jsonni.bbox[1],jsonni.bbox[2],jsonni.bbox[3]);
					map.zoomToExtent(rajat);

                                                                 };

Lehtonen, Mika kirjoitti:
> Hi Brad,
>
> cool site you have!
>
> You know, I went on with my own style, as stubborn is my middle name.. I 
> got my code working so far; to get JSON out of the selected polygon 
> (nice thing to move on .. ;-) ), but...
> you don't happen to know how I'll get this working also in IE. Here is 
> the snippet. I guess it got something to do with the URL encoding ...? 
> Debugger blames the filter, which obviously is the guilty one. (IE excl. 
> :-) ).
>
> map.events.register('click', null, function (e) {
>        OpenLayers.Util.getElement('nodelist').innerHTML = "Odota hetki...";
>         var hiiri = wfs.map.getLonLatFromPixel(e.xy);
> var hiirixy = (hiiri.lat+','+hiiri.lon);
>
>         var url =  wfs.getFullRequestString({
>                 SERVICE: 'WFS',
>                 VERSION: '1.1.0',
>                 REQUEST: 'GetFeature',
>                 OUTPUTFORMAT: 'json',
>                 PROPERTYNAME: 'the_geom,LAYER',
>                 MAXFEATURES: 5,
>                 TYPENAME: 'dikanet:karsa_region',
>                 SRSNAME: 'EPSG:2393',
>                 FILTER: <wfs:FeatureCollection 
> xmlns:wfs="http://www.opengis.net/wfs"><gml:featureMember 
> xmlns:gml="http://www.opengis.net/gml"><Filter>
>             
> <Contains><PropertyName>the_geom</PropertyName><gml:Point><gml:coordinates>{hiirixy}</gml:coordinates></gml:Point></Contains>
>         </Filter></gml:featureMember></wfs:FeatureCollection>
> },
>                            "http://karsamaki.digikartta.net/asemakaavat/wfs"
>                            );
> ..............................................
>
> OpenLayers.loadURL(url,'',this,testJSON);
>                 Event.stop(e);
>                 });
>
> ............................................
>     function testJSON (response) {
>     //    alert(response.responseText);
>         g =  new OpenLayers.Format.JSON();
>         jsonni = g.read(response.responseText);
>         var rajat = new 
> OpenLayers.Bounds(jsonni.bbox[0],jsonni.bbox[1],jsonni.bbox[2],jsonni.bbox[3]);
>         map.zoomToExtent(rajat);
>  };
> ..........................................................
> Doesn't do anything else so far than zooms into the selected polygon.
>
> - mika -
>
>
> Brad Spencer kirjoitti:
>   
>> Mika,
>>
>> I typically use getFeature when I need the geometry as well and one way to
>> reduce the number of polygons returned is to set up a Shift-drag event that
>> can be used to reduce the BBox of the GetFeature request to be limited to
>> the user's discretion. However, this will be a rectangle and will probably
>> still return more or less polygons than you need. The request I use
>> typically looks something like this:
>>
>> &typename=MESHBLOCKS&datastore=ABS&service=wfs&request=GetFeature&filter=<Fi
>> lter><BBOX><Box><coordinates>151.042611,-33.947448%20151.043,-33.9</coordina
>> tes></Box></BBOX></Filter>&outputformat=BXFS
>>
>> This returns an GML file into DOM that I can parse to get all the
>> coordinates of the polygons returned.
>>
>> However, if you are interacting via a single clicking process and do not
>> need the geometry then all you need is a getFeatureInfo request. I have
>> built an application that does this see
>> http://demos.numaps.com.au/polypika.html. Just doubleclick any red polygon
>> and what happens in the background is the click generates a getFeatureInfo
>> request which looks something like:
>>
>> REQUEST=GetFeatureInfo&VERSION=1.1.3&SERVICE=WMS&SRS=EPSG:900913&BBOX=128495
>> 99.340828,-3816959.290073,12980306.659172,-3708418.709927&X=474&Y=369&QUERY_
>> LAYERS=INDIGENOUS_LOC:ABS&WIDTH=855&HEIGHT=710&RADIUS=0&FEATURE_COUNT=1&INFO
>> _FORMAT=text/xml
>>
>> This returns a an XML file into the DOM which I can parse to get the Polygon
>> Id. Then I do the SLD thing.
>>
>> Hope these suggestions help you.
>>
>> Cheers, Brad Spencer....
>>
>>
>>
>> -----Original Message-----
>> From: users-bounces at openlayers.org [mailto:users-bounces at openlayers.org] On
>> Behalf Of Lehtonen, Mika
>> Sent: Tuesday, September 09, 2008 10:43 PM
>> To: Openlayers Users List
>> Subject: Re: [OpenLayers-Users] Highlighting the selected geometry
>>
>> Yep,
>> thanks. I am using Geoserver so SLD approach is ok. One stupid question. 
>> I started to play around with GetFeature, but how can you get just the 
>> feature you clicked. I tried something similar like in OL example [1], 
>> but with GetFeature and WFS. So the following is what I tried:
>>
>>    map.events.register('click', null, function (e) {
>>       OpenLayers.Util.getElement('nodelist').innerHTML = "Odota hetki...";
>>           var url =  wfs.getFullRequestString({
>>                SERVICE: 'WFS',
>>                VERSION: '1.0.0',
>>                REQUEST: 'GetFeature',
>>                OUTPUTFORMAT: 'text/xml; subtype=gml/2.1.2',
>>                PROPERTYNAME: 'LAYER',
>>                MAXFEATURES: 3,
>>                TYPENAME: 'dikanet:karsa_region',
>>                SRSNAME: 'EPSG:2393',
>>                BBOX: wfs.map.getExtent().toBBOX()},
>>                           "http://karsamaki.digikartta.net/asemakaavat/wfs"
>>                           );
>>                OpenLayers.loadURL(url,'',this,setHTML);
>>                Event.stop(e);
>>                });
>>
>>    function setHTML(response) {
>>    OpenLayers.Util.getElement('nodelist').innerHTML = 
>> response.responseText;
>> };
>>
>> But this gives me all the feautures in the current viewport. How can I 
>> filter out the rest and just take the one I clicked?
>>
>> - mika -
>>
>> [1] http://www.openlayers.org/dev/examples/getfeatureinfo.html
>>
>> Brad Spencer kirjoitti:
>>   
>>     
>>> Mika,
>>>
>>> Does the map server support (style Layer descriptors) SLDs? If so this is
>>> the best way to highlight polygons in my experience. Vectors may misalign
>>> depending on browsers/projections. Also there are capacity limits on
>>>     
>>>       
>> vectors
>>   
>>     
>>> at the client which can be problematic. The easiest way to make sure this
>>> does not happen is to have the layer render again via a new SLD. What I do
>>> is run a GetFeatureinfo(WMS) or getfeaturte(WFS) bring back the list of
>>> polygons (must have unique identifiers) then I build an SLD on the fly via
>>>     
>>>       
>> a
>>   
>>     
>>> PHP script save it and then apply that to the current layer. Of course if
>>> you have the polygon names already accessible in the client (e.g. in a
>>> select box) then you can just jump to the SLD building part. Works a
>>>     
>>>       
>> treat.
>>   
>>     
>>> Cheers, Brad....
>>>
>>> -----Original Message-----
>>> From: users-bounces at openlayers.org [mailto:users-bounces at openlayers.org]
>>>     
>>>       
>> On
>>   
>>     
>>> Behalf Of Lehtonen, Mika
>>> Sent: Tuesday, September 09, 2008 5:02 PM
>>> To: Openlayers Users List
>>> Subject: [OpenLayers-Users] Highlighting the selected geometry
>>>
>>> Hi,
>>>
>>> is there any examples available which I could use with the following 
>>> task? Tried to google, but didn't find any good ones.
>>>
>>> I have two wms-layers in my map. The another one includes some polygons. 
>>> In order to get some info out when clicking the polygon, I built a 
>>> system which does that. But I would also like to get the selected 
>>> polygon to render with a different style, so that it'd be sort of 
>>> highlighted. I thought I could copy it into vector layer having 
>>> different style. But frankly said, I don't know how to do it. Just 
>>> learning OL.
>>>
>>> - mika -
>>> _______________________________________________
>>> Users mailing list
>>> Users at openlayers.org
>>> http://openlayers.org/mailman/listinfo/users
>>>   
>>>     
>>>       
>> _______________________________________________
>> Users mailing list
>> Users at openlayers.org
>> http://openlayers.org/mailman/listinfo/users
>>   
>>     
> _______________________________________________
> Users mailing list
> Users at openlayers.org
> http://openlayers.org/mailman/listinfo/users
>   




More information about the Users mailing list