如何将预定义的 places/markers 添加到 Leaflet Geocoder
How to add predefined places/markers to Leaflet Geocoder
我正在使用带地理编码器 (ESRI) 和路由机的传单地图。
我添加了两个标记,比如说我的家和我的工作
var marker_work = L.marker([50.27, 19.03], { title: 'MyWork'}).addTo(map)
.bindPopup("work").openPopup();
var marker_home = L.marker([50.10, 18.4], { title: 'MyHome'}).addTo(map)
.bindPopup("home").openPopup();
这是一个例子fiddle:
https://jsfiddle.net/21nmk8so/1/
如何将此 markers/point 添加为 ControlGeocoder 的预定义位置?
我想在搜索中使用它们并用作路线计算的起点/终点。
同一问题的另一个示例:如何使用 lat/lon 添加自定义假城市并能够搜索(查找路线)to/from 该城市。
我不知道这是否是最佳解决方案,但它确实有效:
创建一个覆盖 geocode
函数的自定义 Geocoder Class。在那里您可以覆盖结果函数并对结果应用建议。
L.CustomGeocoder = L.Control.Geocoder.Nominatim.extend({
suggestions: [],
setSuggestions(arr){
this.suggestions = arr;
},
createSuggestionFromMarker(marker){
this.suggestions.push({name: marker.options.title, center: marker.getLatLng()});
},
getResultsOfSuggestions(query){
var results = [];
this.suggestions.forEach((point)=>{
if(point.name.indexOf(query) > -1){
point.center = L.latLng(point.center);
point.bbox = point.center.toBounds(100);
results.push(point);
}
});
return results;
},
geocode(query, resultFnc, context) {
var that = this;
var callback = function(results){
var sugg = that.getResultsOfSuggestions(query);
resultFnc.call(this,sugg.concat(results));
}
L.Control.Geocoder.Nominatim.prototype.geocode.call(that,query, callback, context);
}
})
那么你必须使用新的 Geocoder Class:
var geocoder = new L.CustomGeocoder({});
var control = L.Routing.control({
waypoints: [],
router: new L.Routing.osrmv1({
language: 'en',
profile: 'car'
}),
geocoder: geocoder
}).addTo(map);
最后,您可以在标记上添加建议,在 createSuggestionFromMarker(marker)
或 setSuggestions(arr)
上添加 title
选项:
var suggestions = [
{
name: 'Test Car 1',
center: [50.27, 19.03]
},
{
name: 'Test Car 2',
center: [50.10, 18.4]
}
];
geocoder.setSuggestions(suggestions);
var marker_work = L.marker([50.27, 19.03], { title: 'MyWork'}).addTo(map);
var marker_home = L.marker([50.10, 18.4], { title: 'MyHome'}).addTo(map);
geocoder.createSuggestionFromMarker(marker_work);
geocoder.createSuggestionFromMarker(marker_home);
更新,使用标记 Ref 而不是修复 latlng
改变这两个函数,然后标记被引用并且总是从标记的当前位置开始搜索:
createSuggestionFromMarker(marker){
this.suggestions.push({name: marker.options.title, marker: marker});
},
getResultsOfSuggestions(query){
var results = [];
this.suggestions.forEach((point)=>{
if(point.name.indexOf(query) > -1){
if(point.marker){
point.center = point.marker.getLatLng();
}
point.center = L.latLng(point.center);
point.bbox = point.center.toBounds(100);
results.push(point);
}
});
return results;
},
你可以在演示中测试这个,当你拖动标记时
我正在使用带地理编码器 (ESRI) 和路由机的传单地图。 我添加了两个标记,比如说我的家和我的工作
var marker_work = L.marker([50.27, 19.03], { title: 'MyWork'}).addTo(map)
.bindPopup("work").openPopup();
var marker_home = L.marker([50.10, 18.4], { title: 'MyHome'}).addTo(map)
.bindPopup("home").openPopup();
这是一个例子fiddle: https://jsfiddle.net/21nmk8so/1/
如何将此 markers/point 添加为 ControlGeocoder 的预定义位置? 我想在搜索中使用它们并用作路线计算的起点/终点。
同一问题的另一个示例:如何使用 lat/lon 添加自定义假城市并能够搜索(查找路线)to/from 该城市。
我不知道这是否是最佳解决方案,但它确实有效:
创建一个覆盖 geocode
函数的自定义 Geocoder Class。在那里您可以覆盖结果函数并对结果应用建议。
L.CustomGeocoder = L.Control.Geocoder.Nominatim.extend({
suggestions: [],
setSuggestions(arr){
this.suggestions = arr;
},
createSuggestionFromMarker(marker){
this.suggestions.push({name: marker.options.title, center: marker.getLatLng()});
},
getResultsOfSuggestions(query){
var results = [];
this.suggestions.forEach((point)=>{
if(point.name.indexOf(query) > -1){
point.center = L.latLng(point.center);
point.bbox = point.center.toBounds(100);
results.push(point);
}
});
return results;
},
geocode(query, resultFnc, context) {
var that = this;
var callback = function(results){
var sugg = that.getResultsOfSuggestions(query);
resultFnc.call(this,sugg.concat(results));
}
L.Control.Geocoder.Nominatim.prototype.geocode.call(that,query, callback, context);
}
})
那么你必须使用新的 Geocoder Class:
var geocoder = new L.CustomGeocoder({});
var control = L.Routing.control({
waypoints: [],
router: new L.Routing.osrmv1({
language: 'en',
profile: 'car'
}),
geocoder: geocoder
}).addTo(map);
最后,您可以在标记上添加建议,在 createSuggestionFromMarker(marker)
或 setSuggestions(arr)
上添加 title
选项:
var suggestions = [
{
name: 'Test Car 1',
center: [50.27, 19.03]
},
{
name: 'Test Car 2',
center: [50.10, 18.4]
}
];
geocoder.setSuggestions(suggestions);
var marker_work = L.marker([50.27, 19.03], { title: 'MyWork'}).addTo(map);
var marker_home = L.marker([50.10, 18.4], { title: 'MyHome'}).addTo(map);
geocoder.createSuggestionFromMarker(marker_work);
geocoder.createSuggestionFromMarker(marker_home);
更新,使用标记 Ref 而不是修复 latlng
改变这两个函数,然后标记被引用并且总是从标记的当前位置开始搜索:
createSuggestionFromMarker(marker){
this.suggestions.push({name: marker.options.title, marker: marker});
},
getResultsOfSuggestions(query){
var results = [];
this.suggestions.forEach((point)=>{
if(point.name.indexOf(query) > -1){
if(point.marker){
point.center = point.marker.getLatLng();
}
point.center = L.latLng(point.center);
point.bbox = point.center.toBounds(100);
results.push(point);
}
});
return results;
},
你可以在演示中测试这个,当你拖动标记时