如何使用地图进行反向地理编码?
How to reverse geocode with maps?
我正在使用 leaflet 在地图上显示标记,当我在 marker
上 click
时,我得到它的 lat
并且lng
,然后我将这些发送到 google 地图地理编码器 以检索地址名称:
var markerCoords = [];
circle.on('click', function (e) {
var curPos = e.target.getLatLng();
markerCoords.push(curPos.lng);
markerCoords.push(curPos.lat);
geocodeLatLng();
});
var geocoder = new google.maps.Geocoder;
function geocodeLatLng(geocoder) {
var latlng = {lat: parseFloat(markerCoords[1]), lng: parseFloat(markerCoords[0])};
geocoder.geocode({'location': latlng}, function(results, status) {
if (status === 'OK') {
if (results[0]) {
console.log(results[0].formatted_address);
} else {
window.alert('No results found');
}
} else {
window.alert('Geocoder failed due to: ' + status);
}
});
}
但它给了我:
Cannot read property 'geocode' of undefined
注意
这条线没问题
var latlng = {lat: parseFloat(markerCoords[1]), lng: parseFloat(markerCoords[0])};
就像我做的那样 console.log 我得到了正确的 lat
和 lng
这可能是因为google api还没有加载,你可以尝试在其他脚本之前加载它,以确保检查console.log("google api object is", geocoder)
并检查Geocode以验证是否google 在调用 api 之前已加载。
编辑:您不需要 geocoder 作为 geocodeLatLng 函数中的参数,正如@geocodezip 所指出的,如果您不传递它,它将是未定义的。因为当变量名相同时参数将优先于外部作用域。
下面的程序会给你用户当前位置的地址,你可以传递任何纬度,经度并得到它的地址:-
//getting location address from latitude and longitude with google api
navigator.geolocation.getCurrentPosition(success, error);
function success(position) {
var lat = position.coords.latitude;
var long = position.coords.longitude;
var geocoder = new google.maps.Geocoder;
console.log("google api object is", geocoder)
var latlng = { lat: lat, lng: long };
geocoder.geocode({ 'location': latlng }, function (results, status) {
if (status === 'OK') {
if (results[0]) {
console.log(results[0].formatted_address);// this will be actual full address
} else {
alert('No results found');
}
} else {
alert('Geocoder failed due to: ' + status);
}
});
}
function error(err) {
alert("Allow location services!");
}
您的代码中有错字。您没有将对地理编码器的引用传递给 geocodeLatLng
函数,因此它在函数内部是 null
:
var markerCoords = [];
circle.on('click', function (e) {
var curPos = e.target.getLatLng();
markerCoords.push(curPos.lng);
markerCoords.push(curPos.lat);
geocodeLatLng(geocoder); // <============================================== **here**
});
var geocoder = new google.maps.Geocoder;
function geocodeLatLng(geocoder) {
var latlng = {lat: parseFloat(markerCoords[1]), lng: parseFloat(markerCoords[0])};
geocoder.geocode({'location': latlng}, function(results, status) {
// ... code to process the result
});
}
我正在使用 leaflet 在地图上显示标记,当我在 marker
上 click
时,我得到它的 lat
并且lng
,然后我将这些发送到 google 地图地理编码器 以检索地址名称:
var markerCoords = [];
circle.on('click', function (e) {
var curPos = e.target.getLatLng();
markerCoords.push(curPos.lng);
markerCoords.push(curPos.lat);
geocodeLatLng();
});
var geocoder = new google.maps.Geocoder;
function geocodeLatLng(geocoder) {
var latlng = {lat: parseFloat(markerCoords[1]), lng: parseFloat(markerCoords[0])};
geocoder.geocode({'location': latlng}, function(results, status) {
if (status === 'OK') {
if (results[0]) {
console.log(results[0].formatted_address);
} else {
window.alert('No results found');
}
} else {
window.alert('Geocoder failed due to: ' + status);
}
});
}
但它给了我:
Cannot read property 'geocode' of undefined
注意
这条线没问题
var latlng = {lat: parseFloat(markerCoords[1]), lng: parseFloat(markerCoords[0])};
就像我做的那样 console.log 我得到了正确的 lat
和 lng
这可能是因为google api还没有加载,你可以尝试在其他脚本之前加载它,以确保检查console.log("google api object is", geocoder)
并检查Geocode以验证是否google 在调用 api 之前已加载。
编辑:您不需要 geocoder 作为 geocodeLatLng 函数中的参数,正如@geocodezip 所指出的,如果您不传递它,它将是未定义的。因为当变量名相同时参数将优先于外部作用域。
下面的程序会给你用户当前位置的地址,你可以传递任何纬度,经度并得到它的地址:-
//getting location address from latitude and longitude with google api
navigator.geolocation.getCurrentPosition(success, error);
function success(position) {
var lat = position.coords.latitude;
var long = position.coords.longitude;
var geocoder = new google.maps.Geocoder;
console.log("google api object is", geocoder)
var latlng = { lat: lat, lng: long };
geocoder.geocode({ 'location': latlng }, function (results, status) {
if (status === 'OK') {
if (results[0]) {
console.log(results[0].formatted_address);// this will be actual full address
} else {
alert('No results found');
}
} else {
alert('Geocoder failed due to: ' + status);
}
});
}
function error(err) {
alert("Allow location services!");
}
您的代码中有错字。您没有将对地理编码器的引用传递给 geocodeLatLng
函数,因此它在函数内部是 null
:
var markerCoords = [];
circle.on('click', function (e) {
var curPos = e.target.getLatLng();
markerCoords.push(curPos.lng);
markerCoords.push(curPos.lat);
geocodeLatLng(geocoder); // <============================================== **here**
});
var geocoder = new google.maps.Geocoder;
function geocodeLatLng(geocoder) {
var latlng = {lat: parseFloat(markerCoords[1]), lng: parseFloat(markerCoords[0])};
geocoder.geocode({'location': latlng}, function(results, status) {
// ... code to process the result
});
}