Google 地理编码器从请求值返回不同的纬度和经度
Google geocoder is returning different latitude and longitude from request values
我根据给定的纬度和经度获取位置:
getLocationFromCoords(lat, lng) {
var geocoder = new google.maps.Geocoder();
var latLng = new google.maps.LatLng(parseFloat(lat), parseFloat(lng));
geocoder.geocode({
'latLng': latLng
}, function (results, status) {
if (status === google.maps.GeocoderStatus.OK) {
if (typeof results[0].geometry.location != 'undefined') {
console.log(lat, lng);
console.log(results[0].geometry.location.lat(), results[0].geometry.location.lng());
// set the location
} else {
//...
}
});
});
}
问题是 results[0].geometry.location
中的纬度和经度与请求的值不同。以上代码在控制台中显示:
38.9067339 1.4205983
38.9069681 1.4205133000000387
所以我错过了什么吗?为什么值不一样?
地理编码或反向地理编码无法给出准确的结果。如果您将地址地理编码为 LatLong,您将从 Google 获得最合适和最近的记录。这是正常行为。 Google 的官方示例也有相同的行为。 (不是错误或问题)。
勾选这个fiddle;
function initMap() {
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 8,
center: {lat: 40.731, lng: -73.997}
});
var geocoder = new google.maps.Geocoder;
var infowindow = new google.maps.InfoWindow;
document.getElementById('submit').addEventListener('click', function() {
geocodeLatLng(geocoder, map, infowindow);
});
}
function geocodeLatLng(geocoder, map, infowindow) {
var input = document.getElementById('latlng').value;
var latlngStr = input.split(',', 2);
var latlng = {lat: parseFloat(latlngStr[0]), lng: parseFloat(latlngStr[1])};
geocoder.geocode({'location': latlng}, function(results, status) {
if (status === 'OK') {
if (results[1]) {
map.setZoom(11);
var marker = new google.maps.Marker({
position: latlng,
map: map
});
infowindow.setContent(
results[1].formatted_address + "<br />" + results[1].geometry.location
);
infowindow.open(map, marker);
} else {
window.alert('No results found');
}
} else {
window.alert('Geocoder failed due to: ' + status);
}
});
}
html, body {
height: 100%;
margin: 0;
padding: 0;
}
#map {
height: 100%;
}
#floating-panel {
position: absolute;
top: 10px;
left: 25%;
z-index: 5;
background-color: #fff;
padding: 5px;
border: 1px solid #999;
text-align: center;
font-family: 'Roboto','sans-serif';
line-height: 30px;
padding-left: 10px;
}
#floating-panel {
position: absolute;
top: 5px;
left: 50%;
margin-left: -180px;
width: 350px;
z-index: 5;
background-color: #fff;
padding: 5px;
border: 1px solid #999;
}
#latlng {
width: 225px;
}
<div id="floating-panel">
<input id="latlng" type="text" value="40.714224,-73.961452">
<input id="submit" type="button" value="Reverse Geocode">
</div>
<div id="map"></div>
<!-- Replace the value of the key parameter with your own API key. -->
<script async defer
src="https://maps.googleapis.com/maps/api/js?callback=initMap">
</script>
地理编码(将位置与经纬度对匹配,反之亦然)仅在您搜索已知地址或已知地点时才准确。有可用的数据库可以提供所有真实地址的准确信息。而且,还有专门使用此类数据的服务和 API。例如,地址验证服务会根据真实地址列表进行搜索。他们解析地址输入并可以确定输入是否是真实地址。对于使用这些服务的人(例如处理运输的人),准确准确的地址很重要。
但是,即使没有完美的答案,许多地理编码服务也更愿意为用户提供答案 - 即如果没有与输入匹配的官方数据。例如,Google 的地图服务即使输入的不是真实地址,也会为您提供结果。他们使用良好的算法为您提供地图上的“估计猜测”。 Google 的服务有很多优点,但缺点之一是有些回复不准确。
在其他情况下,大 public 地点或其他命名位置可能匹配许多纬度和经度对,但匹配名称的数据与搜索输入略有不同。
在您的具体情况下,可能 Google 发现您输入的纬度和经度非常接近实际地标或地点,并假设这就是您想要的。或者,该地点很大(如公园),Google 对该公园的信息将另一个地点精确定位为 "the middle"。
正如已经提到的,Google 的结果通常很接近。当您使用其中一项服务并输入经纬度,搜索相应的地点,然后再转换回经纬度时,很可能已经发生了细微的变化。
(完全披露:我在 SmartyStreets 工作,这是一家地址验证公司。)
我根据给定的纬度和经度获取位置:
getLocationFromCoords(lat, lng) {
var geocoder = new google.maps.Geocoder();
var latLng = new google.maps.LatLng(parseFloat(lat), parseFloat(lng));
geocoder.geocode({
'latLng': latLng
}, function (results, status) {
if (status === google.maps.GeocoderStatus.OK) {
if (typeof results[0].geometry.location != 'undefined') {
console.log(lat, lng);
console.log(results[0].geometry.location.lat(), results[0].geometry.location.lng());
// set the location
} else {
//...
}
});
});
}
问题是 results[0].geometry.location
中的纬度和经度与请求的值不同。以上代码在控制台中显示:
38.9067339 1.4205983
38.9069681 1.4205133000000387
所以我错过了什么吗?为什么值不一样?
地理编码或反向地理编码无法给出准确的结果。如果您将地址地理编码为 LatLong,您将从 Google 获得最合适和最近的记录。这是正常行为。 Google 的官方示例也有相同的行为。 (不是错误或问题)。
勾选这个fiddle;
function initMap() {
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 8,
center: {lat: 40.731, lng: -73.997}
});
var geocoder = new google.maps.Geocoder;
var infowindow = new google.maps.InfoWindow;
document.getElementById('submit').addEventListener('click', function() {
geocodeLatLng(geocoder, map, infowindow);
});
}
function geocodeLatLng(geocoder, map, infowindow) {
var input = document.getElementById('latlng').value;
var latlngStr = input.split(',', 2);
var latlng = {lat: parseFloat(latlngStr[0]), lng: parseFloat(latlngStr[1])};
geocoder.geocode({'location': latlng}, function(results, status) {
if (status === 'OK') {
if (results[1]) {
map.setZoom(11);
var marker = new google.maps.Marker({
position: latlng,
map: map
});
infowindow.setContent(
results[1].formatted_address + "<br />" + results[1].geometry.location
);
infowindow.open(map, marker);
} else {
window.alert('No results found');
}
} else {
window.alert('Geocoder failed due to: ' + status);
}
});
}
html, body {
height: 100%;
margin: 0;
padding: 0;
}
#map {
height: 100%;
}
#floating-panel {
position: absolute;
top: 10px;
left: 25%;
z-index: 5;
background-color: #fff;
padding: 5px;
border: 1px solid #999;
text-align: center;
font-family: 'Roboto','sans-serif';
line-height: 30px;
padding-left: 10px;
}
#floating-panel {
position: absolute;
top: 5px;
left: 50%;
margin-left: -180px;
width: 350px;
z-index: 5;
background-color: #fff;
padding: 5px;
border: 1px solid #999;
}
#latlng {
width: 225px;
}
<div id="floating-panel">
<input id="latlng" type="text" value="40.714224,-73.961452">
<input id="submit" type="button" value="Reverse Geocode">
</div>
<div id="map"></div>
<!-- Replace the value of the key parameter with your own API key. -->
<script async defer
src="https://maps.googleapis.com/maps/api/js?callback=initMap">
</script>
地理编码(将位置与经纬度对匹配,反之亦然)仅在您搜索已知地址或已知地点时才准确。有可用的数据库可以提供所有真实地址的准确信息。而且,还有专门使用此类数据的服务和 API。例如,地址验证服务会根据真实地址列表进行搜索。他们解析地址输入并可以确定输入是否是真实地址。对于使用这些服务的人(例如处理运输的人),准确准确的地址很重要。
但是,即使没有完美的答案,许多地理编码服务也更愿意为用户提供答案 - 即如果没有与输入匹配的官方数据。例如,Google 的地图服务即使输入的不是真实地址,也会为您提供结果。他们使用良好的算法为您提供地图上的“估计猜测”。 Google 的服务有很多优点,但缺点之一是有些回复不准确。
在其他情况下,大 public 地点或其他命名位置可能匹配许多纬度和经度对,但匹配名称的数据与搜索输入略有不同。
在您的具体情况下,可能 Google 发现您输入的纬度和经度非常接近实际地标或地点,并假设这就是您想要的。或者,该地点很大(如公园),Google 对该公园的信息将另一个地点精确定位为 "the middle"。
正如已经提到的,Google 的结果通常很接近。当您使用其中一项服务并输入经纬度,搜索相应的地点,然后再转换回经纬度时,很可能已经发生了细微的变化。
(完全披露:我在 SmartyStreets 工作,这是一家地址验证公司。)