Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Leaflet 如何向传单地理编码器添加预定义的位置/标记_Leaflet_Geocoder_Leaflet Routing Machine_Esri Leaflet Geocoder - Fatal编程技术网

Leaflet 如何向传单地理编码器添加预定义的位置/标记

Leaflet 如何向传单地理编码器添加预定义的位置/标记,leaflet,geocoder,leaflet-routing-machine,esri-leaflet-geocoder,Leaflet,Geocoder,Leaflet Routing Machine,Esri 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

我正在使用带有地理编码器(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();
下面是一个小提琴的例子:

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


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

我不知道这是否是最佳解决方案,但它正在工作: 创建一个自定义地理编码器类,该类将覆盖
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);
    }
  })
然后您必须使用新的Geocoder类:

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

var control = L.Routing.control({
  waypoints: [],
  router: new L.Routing.osrmv1({
    language: 'en',
    profile: 'car'
  }),
  geocoder: geocoder
}).addTo(map);
最后,您可以在标记上添加建议,并在标记(标记)或设置建议(arr)上添加标题选项:

更新,使用标记参考而不是固定板条

更改这两个函数,则标记将被引用,并始终从标记的当前位置进行搜索:


    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;
    },
拖动标记时,可以在演示中对此进行测试


您只需传递用于添加标记的同一坐标,
航路点上的标记将自动添加到第一个问题中。@kboul但如何才能按标记名称搜索?是否要使用标记弹出文本作为右面板上的开始/结束名称?@kboul在我的实际情况中,我有很多标记是gps跟踪系统中的汽车。我想做的是能够通过汽车名称(标记名称)搜索并导航,例如从我的“汽车A”到“柏林”或“柏林”,我不知道如何做到这一点,但还有另一种可能的替代解决方案。您只需单击位置/标记,即汽车位置,然后设置起点或终点的位置。谢谢您的贡献。我想检查您的解决方案,但JSFIDLE似乎没有保存。你能检查一下或者更新一下吗?现在是working@falkie-设计很好,这实际上解决了我的问题,但我有一件事没有解决。当我的车移动时,我可以更新标记位置,但如何更新建议(例如,在建议中使我的工作成为新的lat/lon而不重复)?我的意思是更新建议,有可能吗?如果您能提供帮助,我将不胜感激,但我会将您的问题标记为已解决。谢谢我更新了答案。现在它被引用到标记,并使用当前位置。如果您需要更新建议条目,则需要使用标识或标记的
\u传单\u id
使其成为唯一条目,然后您可以根据标识进行搜索并更新对象。您好@falke design,谢谢,这很有效。我仍在努力做的一件事是如何使搜索不区分大小写。我可以用小写字母表示所有建议,但如何允许搜索任何大小的标题(大写、小写、混合)

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