我试图通过使用geocodingQueryParams
将Leaflet 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。版本。
答案 0 :(得分:2)
让我引用Nominatim's documentation:
结果限制
[...]
viewbox=<x1>,<y1>,<x2>,<y2>
查找搜索结果的首选区域。框的任何两个角点都可以以任何顺序接受,只要它们跨越一个真实的框即可。
还要注意,the geocodingQueryParams
option from Leaflet-control-geocoder's Nominatim provider取Object
,而不是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还允许使用country
和city
参数,但是它们是structured query parameters,仅在没有查询字符串时使用。以下将不按预期工作:
var geocoder=L.Control.geocoder({
geocoder: new L.Control.Geocoder.Nominatim({
geocodingQueryParams: {
"country": "FR",
"city": "Paris"
}
})
});