如何按城市或​​bbox限制Leaflet-control-geocoder结果?

时间:2019-07-31 08:42:14

标签: javascript leaflet geocoding

我试图通过使用geocodingQueryParamsLeaflet geocoder(使用Nominatim提供程序)的结果限制在一个城市。但是建议和结果仍然适用于整个世界。我尝试了几种修改(geocodingQueryParams:'liberec' / geocodingQueryParams:'city=liberec' / geocodingQueryParams:'q=liberec'),但没有成功。你有什么建议吗?还是可以在此插件中按bbox进行过滤?

我的代码:

var geocoder=L.Control.geocoder({
    placeholder: 'Hledej...',
    errorMessage: 'Nenašli jsme :(',
    defaultMarkGeocode: false,
    geocoder: new L.Control.Geocoder.Nominatim({
        geocodingQueryParams:'liberec'
        })
})
.on('markgeocode', function(e) {
    var bbox = e.geocode.bbox;
    var poly = L.polygon([
         bbox.getSouthEast(),
         bbox.getNorthEast(),
         bbox.getNorthWest(),
         bbox.getSouthWest()
    ]);
    map.fitBounds(poly.getBounds());
}).addTo(map);

我使用的是Leaflet 1.5.1。版本。

1 个答案:

答案 0 :(得分:2)

让我引用Nominatim's documentation

  

结果限制

     

[...]

viewbox=<x1>,<y1>,<x2>,<y2>
     

查找搜索结果的首选区域。框的任何两个角点都可以以任何顺序接受,只要它们跨越一个真实的框即可。

还要注意,the geocodingQueryParams option from Leaflet-control-geocoder's Nominatim providerObject,而不是String; URL查询参数通常以一组键值对的形式给出,其中参数名称为键,参数值为值。

因此,您可以执行以下操作:

var geocoder=L.Control.geocoder({
    geocoder: new L.Control.Geocoder.Nominatim({
        geocodingQueryParams: {
            "viewbox": "14.07,49.02,24.02,54.85"
        }
    })
});

如果您有L.LatLngBounds实例而不是<x1>,<y1>,<x2>,<y2> 字符串,则可以利用toBBoxString()

var bbox = L.latLngBounds(/* stuff */);

var geocoder=L.Control.geocoder({
    geocoder: new L.Control.Geocoder.Nominatim({
        geocodingQueryParams: {
            "viewbox": bbox.toBBoxString()
        }
    })
});

Nominatim还允许使用countrycity参数,但是它们是structured query parameters,仅在没有查询字符串时使用。以下将按预期工作:

var geocoder=L.Control.geocoder({
    geocoder: new L.Control.Geocoder.Nominatim({
        geocodingQueryParams: {
            "country": "FR",
            "city": "Paris"
        }
    })
});
相关问题