如何将预定义的地点/标记添加到 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();

这是一个小提琴示例: https://jsfiddle.net/21nmk8so/1/

如何将此标记/点添加为 ControlGeocoder 的预定义位置? 我想在搜索中使用它们并用作路线计算的起点/终点。

同一问题的另一个示例:如何添加带有纬度/经度的自定义假城市,并能够搜索(查找路线)到/从该城市。

解决方法

我不知道这是否是最好的解决方案,但它正在起作用: 创建覆盖 geocode 函数的自定义地理编码器类。您可以在那里覆盖结果函数并将建议应用于结果。

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);
    }
  })

然后你必须使用新的地理编码器类:

var geocoder = new L.CustomGeocoder({});

var control = L.Routing.control({
  waypoints: [],router: new L.Routing.osrmv1({
    language: 'en',profile: 'car'
  }),geocoder: geocoder
}).addTo(map);

最后,您可以在标记上添加建议,并在 titlecreateSuggestionFromMarker(marker) 上添加 setSuggestions(arr) 选项:

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 而不是 fix 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;
    },

您可以在演示中进行测试,当您拖动标记时

https://jsfiddle.net/falkedesign/hu25jfd1/

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...