Leaflet 反向地理编码

5

我想使用Leaflet地图和函数,可以传递Lat/Lng并收到包含地址的文本消息。

我正在尝试使用Esri插件,但是我做错了什么。 目前我能够在函数内获取地址,但我不知道如何将其正确传递给变量。

以下是我的代码:

var map = L.map('map').setView([40.725, -73.985], 7);

L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
  attribution: '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);

var geocodeService = L.esri.Geocoding.geocodeService();

map.on('click', function(e) {
  geocodeService.reverse().latlng(e.latlng).run(function(error, result) {
    L.marker(result.latlng).addTo(map).bindPopup(result.address.Match_addr).openPopup();
  });
});

var message;

message = geocodeService.reverse().latlng([40.725, -73.985]).run(function(error, result) {
  //alert(result.address.Match_addr); //this alert works here ok and can retur addrress
  return result.address.Match_addr;
});

//this alert won't work, why I can get the address here outside the function
alert(message); 

这里有一个完整的例子: https://jsfiddle.net/5aq6z1vL/

如何像函数一样使用地理编码:

var address = convertToAddress([40.725, -73.985]);

function convertToAddress(]lat,lon])
{
  // here return address after geocoding
}
2个回答

1

你可以通过以下方式更改函数:

var geocodeService = L.esri.Geocoding.geocodeService();


geocodeService.reverse().latlng([36.2933693, 7.9388789]).run(function (error, result) {
  if (error) {
    return;
  }

  L.marker(result.latlng).addTo(map).bindPopup(result.address.Match_addr).openPopup();
});

简单提示:只需将代码格式添加到此行代码 var geocodeService = L.esri.Geocoding.geocodeService(); 即可。谢谢。 - Ahmed C

0

这是因为message将会被HTTP响应从run函数中填充。

由于run函数需要一些时间来执行,所以alert(message)将在run函数完成之前执行。

这里有一个可能解决您问题的fiddle: JSFiddle

编辑:

好的,你要找的是Promises。 您的代码需要等待插件获取地址。 不幸的是,我不知道如何使用vanilla JS实现这一点,所以我导入了jQuery(使用方法$.whenthen以及对象$.Deferred)。

这是新的Fiddle

如果您需要使用vanilla JS,请让我研究一下Promises。


谢谢,这部分有所帮助。但是如何将其作为函数使用,例如:var address = convertToAddress([40.725, -73.985]);function convertToAddress(lat, lon) { // 在此处进行地理编码后返回地址 } - Tikky
注释正在破坏代码,所以请查看修改后的问题。 - Tikky
抱歉,我仍然无法在变量中获取解码地址。您可以看一下这个fiddle: https://jsfiddle.net/c71ndrhv/1/ Lin 16 - Tikky
每次你想解码一个地址并使用你的变量时,你必须这样做: var result= convertToAddress([lat,lon]); $.when(result).done(function(r){ result=r; //在这里编写使用地址的其余代码 }) - H. Figueiredo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接