Google Geocoder возвращает неверную страну, игнорируя подсказку в регионе
Я использую Google Geocoder для поиска координат lat lng для заданного адреса.
var geocoder = new google.maps.Geocoder();
geocoder.geocode(
{
'address': address,
'region': 'uk'
}, function(results, status) {
if(status == google.maps.GeocoderStatus.OK) {
lat: results[0].geometry.location.lat(),
lng: results[0].geometry.location.lng()
});
address
переменная берется из поля ввода.
Я хочу искать местоположения только в Великобритании. Я думал, что указать 'region': 'uk'
должно быть достаточно, но это не так. Когда я печатаю в "Бостоне", он находит Бостон в США, и я хотел его в Великобритании.
Как ограничить геокодер возвратом местоположений только из одной страны или, возможно, из определенного диапазона латинского алфавита?
Спасибо
Ответы
Ответ 1
ОБНОВЛЕНИЕ: Этот ответ, возможно, не лучший подход. См. Комментарии ниже ответа для более подробной информации.
В дополнение к тому, что уже предлагалось Pekka, вы можете связать ', UK'
с вашим address
, как в следующем примере:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<title>Google Maps Geocoding only in UK Demo</title>
<script src="http://maps.google.com/maps/api/js?sensor=false"
type="text/javascript"></script>
</head>
<body>
<div id="map" style="width: 400px; height: 300px"></div>
<script type="text/javascript">
var mapOptions = {
mapTypeId: google.maps.MapTypeId.TERRAIN,
center: new google.maps.LatLng(54.00, -3.00),
zoom: 5
};
var map = new google.maps.Map(document.getElementById("map"), mapOptions);
var geocoder = new google.maps.Geocoder();
var address = 'Boston';
geocoder.geocode({
'address': address + ', UK'
},
function(results, status) {
if(status == google.maps.GeocoderStatus.OK) {
new google.maps.Marker({
position:results[0].geometry.location,
map: map
});
}
});
</script>
</body>
</html>
Скриншот:
![Geocoding only in UK]()
Я считаю, что это очень надёжно. С другой стороны, следующий пример показывает, что ни параметр region
, ни параметр bounds
не имеют никакого эффекта в этом случае:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<title>Google Maps Geocoding only in UK Demo with Bounds</title>
<script src="http://maps.google.com/maps/api/js?sensor=false"
type="text/javascript"></script>
</head>
<body>
<div id="map" style="width: 500px; height: 300px"></div>
<script type="text/javascript">
var mapOptions = {
mapTypeId: google.maps.MapTypeId.TERRAIN,
center: new google.maps.LatLng(50.00, -33.00),
zoom: 3
};
var map = new google.maps.Map(document.getElementById("map"), mapOptions);
var geocoder = new google.maps.Geocoder();
// Define north-east and south-west points of UK
var ne = new google.maps.LatLng(60.00, 3.00);
var sw = new google.maps.LatLng(49.00, -13.00);
// Define bounding box for drawing
var boundingBoxPoints = [
ne, new google.maps.LatLng(ne.lat(), sw.lng()),
sw, new google.maps.LatLng(sw.lat(), ne.lng()), ne
];
// Draw bounding box on map
new google.maps.Polyline({
path: boundingBoxPoints,
strokeColor: '#FF0000',
strokeOpacity: 1.0,
strokeWeight: 2,
map: map
});
// Geocode and place marker on map
geocoder.geocode({
'address': 'Boston',
'region': 'uk',
'bounds': new google.maps.LatLngBounds(sw, ne)
},
function(results, status) {
if(status == google.maps.GeocoderStatus.OK) {
new google.maps.Marker({
position:results[0].geometry.location,
map: map
});
}
});
</script>
</body>
</html>
Ответ 2
Следующий код получит первый адрес соответствия в Великобритании без необходимости изменения адреса.
var geocoder = new google.maps.Geocoder();
geocoder.geocode(
{
'address': address,
'region': 'uk'
}, function(results, status) {
if(status == google.maps.GeocoderStatus.OK) {
for (var i=0; i<results.length; i++) {
for (var j=0; j<results[i].address_components.length; j++) {
if ($.inArray("country", results[i].address_components[j].types) >= 0) {
if (results[i].address_components[j].short_name == "GB") {
return_address = results[i].formatted_address;
return_lat = results[i].geometry.location.lat();
return_lng = results[i].geometry.location.lng();
...
return;
}
}
}
}
});
Ответ 3
Использовать атрибут componentRestrictions:
geocoder.geocode({'address': request.term, componentRestrictions: {country: 'GB'}}
Ответ 4
Правильный способ сделать это - предоставить componentRestrictions
Например:
var request = {
address: address,
componentRestrictions: {
country: 'UK'
}
}
geocoder.geocode(request, function(results, status){
//...
});
Ответ 5
В соответствии с docs параметр области, кажется, устанавливает только смещение (вместо реального предела для этого региона). Я думаю, когда API не найдет точный адрес в Великобритании, он расширит его поиск независимо от того, в какой регион вы входите.
В прошлом я очень хорошо справлялся с указанием кода страны по адресу (в дополнение к региону).
Тем не менее, у меня не было много опыта с идентичными названиями мест в разных странах. Тем не менее, это стоит того. Попробуйте
'address': '78 Austin Street, Boston, UK'
он должен вернуть не адрес (вместо US Boston) и
'address': '78 Main Street, Boston, UK'
Должен вернуть Бостон в Великобритании, потому что на самом деле есть главная улица.
Update:
Как ограничить геокодер возвратом местоположений только из одной страны или, возможно, из определенного диапазона латинского алфавита?
Вы можете установить параметр bounds
. См. здесь
Для этого вам, конечно, нужно будет вычислить прямоугольник размером с Великобританию.
Ответ 6
Я нашел проблемы с установкой ", Великобритания", установив регион в Великобританию и установив границы. Тем не менее, делать ВСЕ ТРИ, кажется, исправить это для меня. Вот фрагмент: -
var sw = new google.maps.LatLng(50.064192, -9.711914)
var ne = new google.maps.LatLng(61.015725, 3.691406)
var viewport = new google.maps.LatLngBounds(sw, ne);
geocoder.geocode({ 'address': postcode + ', UK', 'region': 'UK', "bounds": viewport }, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
.....etc.....
Ответ 7
Я попробовал следующее:
geocoder.geocode( {'address':request.term + ', USA'}
И его работа для меня для конкретного региона (страны США).
Ответ 8
Я всегда находил, что это довольно легко фильтровать, поскольку результаты могут меняться, и регион, похоже, не работает.
response( $.map( results, function( item ) {
if (item.formatted_address.indexOf("GB") != -1) {
return {
latitude: item.geometry.location.lat(),
longitude: item.geometry.location.lng()
}
}
}
Ответ 9
Я предпочитаю гибридный подход .
- Использовать componentRestrictions, чтобы в первую очередь ограничить страну.
-
Если это не дает достаточных результатов, выполните поиск более широко (и при необходимости измените предвзятость)
function MyGeocoder(address,region)
{
geocoder = new google.maps.Geocoder();
geocoder.geocode({ 'address': address, 'componentRestrictions': { 'country': region } }, function (r, s) {
if (r.length < 10) geocoder.geocode({ 'address': address /* could also bias here */ }, function (r2, s2) {
for (var j = 0; j < r2.length; j++) r.push(r2[j]);
DoSomethingWithResults(r);
});
else DoSomethingWithResults(r);
});
}
function DoSomethingWithResults(r)
{
// Remove Duplicates
var d = {};
r = r.filter(function (e) { var h = e.formatted_address.valueOf(); var isDup = d[h]; d[h] = true; return !isDup; });
// Do something with results
}
код >
Ответ 10
Для объединенного королевства вы должны использовать GB для региона. Великобритания не является кодом страны ISO!
Ответ 11
Мне пришлось отфильтровывать результаты в самой стране сегодня. Я узнал, что код страны с двумя символами в компонентеРестрификации: страна: не работает. Но полное название страны.
Это полное_имя в address_components из результата.