1

I have a Leaflet map with WMS layers from GeoServer. I want to click on a determinate location and make a GetFeature request to GeoServer so that I can show a GeoJSON on Leaflet of the features clicked.

I've been able to make it request the data and show it in Leaflet, however there's been a problem with the bounding box of the request and how GeoServer is dealing with it.

This is my map with a loaded WMS layer, I want to select the polygon represented by the blue bounding box. When I click on location 2 I get my desired polygon, however, when I click on location 1 I get both my desired polygon and the polygon with the red bounding box.

enter image description here

If I click on a polygon that does not share bounding boxes with other features everything works ok.

This is my request, made by my application server to GeoServer:

myserver.com.br/geoserver/wms?
service=WFS&
version=2.0.0&
request=GetFeature&
typeNames=gianetti:CAD_Lote&
outputformat=application/json&
srsName=EPSG:4326&
bbox=-20.75447104737565,-42.87179304096168,-20.754466022047144,-42.87178801563317,urn:ogc:def:crs:EPSG:4326&
count=1

I added count = 1 to limit results to only one feature, if I remove this parameter my results are both polygons or even more polygons, which I do not want.

I generated my bounding box dynamically on Leaflet, using the click event latlng object plus or minus the pixel size. I've tried to make a bounding box with minY=maxY and minX=maxX, but the error persists.

Below is the code that makes the request in Leaflet:

map.addEventListener('click',getFeature);

selectedLayers = L.geoJSON().addTo(map);

function getFeature(e) {

    if (select) { // Switcher to check if the selection tool is enabled

        selectedLayers.clearLayers() // Clear previous selection
        // Backend address to request a WFS geojson: /select/:layer/:lat1/:lng1/:lat2/:lng2/:srs
    
        pixelSize = (40075016.686 * Math.abs(Math.cos(map.getCenter().lat / 180 * Math.PI)) / Math.pow(2, map.getZoom()+8))/111120 // Calculates pixelSize in GMS
    
        for (i=0;i<activeLayers.length;i++){
            params = {  
                layers: activeLayers[i],       
                lat1: e.latlng.lat-0.5*pixelSize,
                lng1: e.latlng.lng-0.5*pixelSize,
                lat2: e.latlng.lat+0.5*pixelSize,
                lng2: e.latlng.lng+0.5*pixelSize, 
                srs: 'urn:ogc:def:crs:EPSG:4326'
            }
            url = '/select/' + Object.values(params).join('/');
            console.log(params)
            $.ajax({ // Making request to backend server
                url: url,
                success: function (data, status, xhr) {
                    loadFeatureAsLayer(data)
                },
                error: function (xhr, status, error) {
                    console.log(error)
                }
            }); 
        }      
    } 
}

Then, on my backend server, built with node.js, I make the request using some custom authentication headers:

app.get('/select/:layer/:lat1/:lng1/:lat2/:lng2/:srs',(req,res) => {

    params = {  
        service: 'WFS',
        version: '2.0.0',
        request: 'GetFeature',
        typeNames: req.params.layer,         
        outputformat: 'application/json',
        srsName:'EPSG:4326',
        bbox: req.params.lat1+','+req.params.lng1+','+req.params.lat2+','+req.params.lng2+','+req.params.srs,
        count: 1
    }

    url = 'myserver.com.br/geoserver/wms?' + Object.entries(params).map(e => e.join('=')).join('&');

    fetch(url, {method : 'GET', headers: headers})
    .then(res => res.text())
    .then(data => {
        console.log('WFS requisition sent: ' + url)
        res.send(data)
    })
    .catch(error => res.send(error))
})

I searched though SE for an answer and found something similar here, in this problem @user30184 elucidated that GeoServer makes the search for features in a determinate location by comparing ir with envelopes of searched features, which might explain why I'm having this issue. Is there any way to disable this behavior in GeoServer or is there any way around this problem to get what I want?

EDIT

Below is my Geoserver URL when I click location 2:

    https://mapas.genteufv.com.br/geoserver/gianetti/wms?
service=WFS&
version=2.0.0&
request=GetFeature&
typeNames=gianetti:CAD_Lote&
outputformat=application/json&
srsName=EPSG:4326&
bbox=-20.75447104737565,-42.87179304096168,-20.754466022047144,-42.87178801563317,urn:ogc:def:crs:EPSG:4326&
count=1

And then my response with the polygon from the red bounding box:

{"type":"FeatureCollection","features":[{"type":"Feature","id":"CAD_Lote.fid--570a0915_178376a904f_1ea0","geometry":{"type":"Polygon","coordinates":[[[-42.87537308,-20.75358136],[-42.87534321,-20.75341135],[-42.87402867,-20.75354788],[-42.87378353,-20.75355822],[-42.87359681,-20.75357227],[-42.8732492,-20.75356351],[-42.87300616,-20.75353671],[-42.87272261,-20.75346778],[-42.87237809,-20.75335052],[-42.87193077,-20.75312494],[-42.87168515,-20.75300035],[-42.87155135,-20.75290428],[-42.87148458,-20.75286198],[-42.87147999,-20.75285923],[-42.87147534,-20.75285656],[-42.87147064,-20.75285397],[-42.8714659,-20.75285145],[-42.87146111,-20.75284901],[-42.87145628,-20.75284665],[-42.87145141,-20.75284437],[-42.87144649,-20.75284216],[-42.87144153,-20.75284004],[-42.87143654,-20.752838],[-42.87143151,-20.75283604],[-42.87142644,-20.75283417],[-42.87142134,-20.75283237],[-42.87141621,-20.75283066],[-42.87141104,-20.75282904],[-42.87140585,-20.7528275],[-42.87140063,-20.75282604],[-42.87139538,-20.75282467],[-42.87139011,-20.75282339],[-42.87138482,-20.75282219],[-42.8713795,-20.75282107],[-42.87137417,-20.75282005],[-42.87136881,-20.75281911],[-42.87136344,-20.75281826],[-42.87135806,-20.7528175],[-42.87135266,-20.75281682],[-42.87134725,-20.75281624],[-42.87134183,-20.75281574],[-42.8713364,-20.75281533],[-42.87133097,-20.75281501],[-42.87132553,-20.75281477],[-42.87132009,-20.75281463],[-42.87131464,-20.75281457],[-42.8713092,-20.75281461],[-42.87130375,-20.75281473],[-42.87129831,-20.75281494],[-42.87129288,-20.75281524],[-42.87128745,-20.75281563],[-42.87128202,-20.75281611],[-42.87127661,-20.75281667],[-42.87127121,-20.75281733],[-42.87126582,-20.75281807],[-42.87126045,-20.7528189],[-42.87125138,-20.75282047],[-42.87124234,-20.75282219],[-42.87123333,-20.75282405],[-42.87122436,-20.75282606],[-42.87121543,-20.75282822],[-42.87120653,-20.75283052],[-42.87119768,-20.75283296],[-42.87118888,-20.75283555],[-42.87118012,-20.75283827],[-42.87117142,-20.75284114],[-42.87116277,-20.75284415],[-42.87115418,-20.7528473],[-42.87114564,-20.75285059],[-42.87113717,-20.75285402],[-42.87112876,-20.75285758],[-42.87112042,-20.75286128],[-42.87111214,-20.75286511],[-42.87110394,-20.75286908],[-42.87109581,-20.75287317],[-42.87108776,-20.7528774],[-42.87107978,-20.75288176],[-42.87107189,-20.75288625],[-42.87106408,-20.75289087],[-42.87105636,-20.75289561],[-42.87104872,-20.75290047],[-42.87104117,-20.75290546],[-42.87103372,-20.75291057],[-42.87102636,-20.7529158],[-42.8710191,-20.75292115],[-42.87101194,-20.75292661],[-42.87100487,-20.75293219],[-42.87099792,-20.75293788],[-42.87099106,-20.75294369],[-42.87098432,-20.7529496],[-42.87097768,-20.75295563],[-42.87097093,-20.75296111],[-42.87096429,-20.7529667],[-42.87095775,-20.7529724],[-42.87095131,-20.7529782],[-42.87094498,-20.75298411],[-42.87093876,-20.75299012],[-42.87093266,-20.75299623],[-42.87092666,-20.75300243],[-42.87092078,-20.75300874],[-42.87091502,-20.75301514],[-42.87090937,-20.75302163],[-42.87090385,-20.75302821],[-42.87089845,-20.75303488],[-42.87089317,-20.75304164],[-42.87088801,-20.75304848],[-42.87088298,-20.7530554],[-42.87087808,-20.75306241],[-42.87087331,-20.75306949],[-42.87086867,-20.75307665],[-42.87086416,-20.75308389],[-42.87085979,-20.7530912],[-42.87085555,-20.75309857],[-42.87085145,-20.75310602],[-42.87084748,-20.75311353],[-42.87084365,-20.7531211],[-42.87083996,-20.75312874],[-42.87083642,-20.75313643],[-42.87083301,-20.75314418],[-42.87082975,-20.75315198],[-42.87082663,-20.75315984],[-42.87082365,-20.75316774],[-42.87082082,-20.7531757],[-42.87081814,-20.75318369],[-42.87081474,-20.75319318],[-42.87081152,-20.75320271],[-42.87080846,-20.7532123],[-42.87080558,-20.75322193],[-42.87080287,-20.75323161],[-42.87080033,-20.75324133],[-42.87079797,-20.75325109],[-42.87079579,-20.75326088],[-42.87079378,-20.75327071],[-42.87079195,-20.75328057],[-42.8707903,-20.75329045],[-42.87078882,-20.75330036],[-42.87078753,-20.7533103],[-42.87078641,-20.75332025],[-42.87078547,-20.75333022],[-42.87078471,-20.7533402],[-42.87078413,-20.75335019],[-42.87078373,-20.75336019],[-42.87078351,-20.7533702],[-42.87078347,-20.7533802],[-42.87078361,-20.75339021],[-42.87078393,-20.75340021],[-42.87078443,-20.75341021],[-42.87078511,-20.7534202],[-42.87078597,-20.75343017],[-42.87078701,-20.75344013],[-42.87078822,-20.75345007],[-42.87078962,-20.75345999],[-42.87079119,-20.75346989],[-42.87079294,-20.75347976],[-42.87079487,-20.7534896],[-42.87079613,-20.75349737],[-42.87079753,-20.75350512],[-42.87079908,-20.75351284],[-42.87080077,-20.75352054],[-42.8708026,-20.7535282],[-42.87080457,-20.75353584],[-42.87080668,-20.75354344],[-42.87080893,-20.75355101],[-42.87081133,-20.75355854],[-42.87081386,-20.75356603],[-42.87081653,-20.75357347],[-42.87081933,-20.75358087],[-42.87082228,-20.75358823],[-42.87082535,-20.75359553],[-42.87082857,-20.75360279],[-42.87083191,-20.75360999],[-42.87083539,-20.75361713],[-42.870839,-20.75362421],[-42.87084275,-20.75363124],[-42.87084662,-20.7536382],[-42.87085062,-20.7536451],[-42.87085474,-20.75365193],[-42.87085899,-20.7536587],[-42.87086337,-20.75366539],[-42.87086787,-20.75367201],[-42.87087249,-20.75367856],[-42.87087723,-20.75368503],[-42.87088209,-20.75369142],[-42.87088707,-20.75369773],[-42.87089217,-20.75370396],[-42.87089737,-20.7537101],[-42.8709027,-20.75371616],[-42.87090813,-20.75372213],[-42.87091367,-20.75372801],[-42.87091932,-20.75373379],[-42.87095694,-20.75376386],[-42.8709652,-20.75377104],[-42.87097359,-20.75377809],[-42.87098211,-20.753785],[-42.87099075,-20.75379177],[-42.87099952,-20.7537984],[-42.8710084,-20.75380489],[-42.8710174,-20.75381124],[-42.87102651,-20.75381744],[-42.87103574,-20.75382349],[-42.87104507,-20.75382939],[-42.87105451,-20.75383515],[-42.87106406,-20.75384074],[-42.8710737,-20.75384619],[-42.87108344,-20.75385148],[-42.87109328,-20.75385661],[-42.87110321,-20.75386158],[-42.87110664,-20.75386322],[-42.87110781,-20.75385989],[-42.87119382,-20.75361446],[-42.87126258,-20.75341826],[-42.87128221,-20.75334683],[-42.87127725,-20.75327046],[-42.87122446,-20.75320432],[-42.87123759,-20.75316736],[-42.87136624,-20.75321845],[-42.87204214,-20.75349082],[-42.87198494,-20.75365912],[-42.87218148,-20.75371838],[-42.87235979,-20.753773],[-42.87253426,-20.75381298],[-42.87277251,-20.75386646],[-42.87291634,-20.75390804],[-42.87311537,-20.75396558],[-42.87330441,-20.7540102],[-42.8731459,-20.75447844],[-42.87322647,-20.75449866],[-42.87322802,-20.7544969],[-42.87323116,-20.75449344],[-42.87323437,-20.75449003],[-42.87323764,-20.75448668],[-42.87324098,-20.75448337],[-42.87324437,-20.75448013],[-42.87324782,-20.75447694],[-42.87325133,-20.7544738],[-42.8732549,-20.75447073],[-42.87325852,-20.75446771],[-42.8732622,-20.75446475],[-42.87326594,-20.75446185],[-42.87326972,-20.75445902],[-42.87327356,-20.75445624],[-42.87327745,-20.75445353],[-42.87328139,-20.75445089],[-42.87328538,-20.75444831],[-42.87328941,-20.75444579],[-42.87329349,-20.75444334],[-42.87329761,-20.75444095],[-42.87330178,-20.75443864],[-42.87330599,-20.75443639],[-42.87331024,-20.75443421],[-42.87331453,-20.75443211],[-42.87331886,-20.75443007],[-42.87332322,-20.7544281],[-42.87332763,-20.7544262],[-42.87333206,-20.75442438],[-42.87333653,-20.75442263],[-42.87334103,-20.75442095],[-42.87334556,-20.75441935],[-42.87335012,-20.75441782],[-42.8733547,-20.75441636],[-42.87335932,-20.75441498],[-42.87336395,-20.75441368],[-42.87336861,-20.75441245],[-42.8733733,-20.7544113],[-42.873378,-20.75441022],[-42.87338272,-20.75440922],[-42.87338746,-20.7544083],[-42.87339222,-20.75440746],[-42.87339699,-20.75440669],[-42.87340177,-20.754406],[-42.87340657,-20.75440539],[-42.87341138,-20.75440486],[-42.87341619,-20.75440441],[-42.87342102,-20.75440404],[-42.87342585,-20.75440374],[-42.87343068,-20.75440352],[-42.87343552,-20.75440339],[-42.87344036,-20.75440333],[-42.8734452,-20.75440335],[-42.87345004,-20.75440345],[-42.87345488,-20.75440363],[-42.87345971,-20.75440388],[-42.87346454,-20.75440422],[-42.87346936,-20.75440463],[-42.87347417,-20.75440513],[-42.87347897,-20.7544057],[-42.87348376,-20.75440635],[-42.87348854,-20.75440708],[-42.8734933,-20.75440788],[-42.87349805,-20.75440877],[-42.87350278,-20.75440973],[-42.87350749,-20.75441077],[-42.87351219,-20.75441188],[-42.87351686,-20.75441308],[-42.87352151,-20.75441434],[-42.87352613,-20.75441569],[-42.87353073,-20.75441711],[-42.8735353,-20.7544186],[-42.87353985,-20.75442017],[-42.87354436,-20.75442181],[-42.87354885,-20.75442352],[-42.8735533,-20.75442531],[-42.87355771,-20.75442717],[-42.8735621,-20.75442911],[-42.87356644,-20.75443111],[-42.87357075,-20.75443318],[-42.87357502,-20.75443533],[-42.87357925,-20.75443754],[-42.87358344,-20.75443983],[-42.87358758,-20.75444218],[-42.87358774,-20.75444227],[-42.87346292,-20.75418652],[-42.87381933,-20.75408469],[-42.87399927,-20.75402744],[-42.87417392,-20.75397137],[-42.87435558,-20.75391764],[-42.87454629,-20.75385827],[-42.87472511,-20.75381062],[-42.87495,-20.75374154],[-42.87494181,-20.7537148],[-42.87504912,-20.7536816],[-42.87537308,-20.75358136]]]},"geometry_name":"geom","properties":{"id":21,"distrito":1,"setor":1,"quadra":4,"lote":282,"inscricao_lote":"01.01.0004.0282"}}],"totalFeatures":3,"numberMatched":3,"numberReturned":1,"timeStamp":"2021-03-18T17:27:00.453Z","crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:EPSG::4326"}}}

EDIT 2

In this case scenario I won't have overlapping features in the same layer, this is a constraint on the conceptual model of the application. I might have overlapping features from different layers which is not a problem, since I make an individual requisition for each layer displayed on the map.

I believe it is important to clarify that I won't be querying only polygons, but also points and lines. When querying lines by this method I am getting the same problem of the bounding box queried inside the line envelop. Points are working fine.

That said, and as the application aims to be an all purpose framework for spatial data sharing I believe that using some attribute of the layer (like the id) to select instead of only a location based method would be a problem since: 1 - ID's might not be available, since data comes from Geoserver and the users might hide the ID's as they are primary keys; 2 - users might use funny names for ID's, like 'id_0' or 'id_1' which are common since in my area people usually uploads tables with existing ID's to PostGIS, which is used as my database.

8
  • Can you just show us the URL you use to make the request and the response sent by GeoServer? - the easiest solution is probably to use a point in polygon filter.
    – Ian Turton
    Mar 18 '21 at 16:38
  • Do you have some attribute/property by which you could differentiate between wanted and unwanted features?
    – TomazicM
    Mar 18 '21 at 18:37
  • @TomazicM I could use the feature ID collected by the WMS method getFeatureInfo, however this is a little problematic since the purpose of the application is to be a framework for applications by unexperienced users, then, it's very common that: 1 - the users may not expose the id's at geoserver by mistake, since it is a pprimary key; 2 - the users may use funny names for the id field like 'id_0' or something. If possible, I would prefer to stick to some location-based method Mar 18 '21 at 18:44
  • @IanTurton Sure, just added the info on an edit. I'm not familiarized with this point in polygon filter tool, could you please give me more details or point to where could I get more information? thanks! Mar 18 '21 at 18:47
  • If there is no attribute/property by which you can differentiate between desired and undesired features, there is no way you can get only desired features. Desired feature can be outside undesired feature, partially overlapping or inside it, so no geometry based filtering would help, unless there is some geometry rule that would help in differentiation, like for example: undesired feature is always bigger than desired feature etc.
    – TomazicM
    Mar 19 '21 at 10:37

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.