javascript - longitude - google places api example
El Geocoder de Google devuelve el país incorrecto, ignorando la sugerencia de la región (12)
De acuerdo con los docs , el parámetro de región parece establecer un sesgo solamente (en lugar de un límite real para esa región). Supongo que cuando la API no encuentre la dirección exacta en el lugar del Reino Unido, expandirá la búsqueda sin importar en qué región ingrese.
Me ha ido bastante bien en el pasado con la especificación del código de país en la dirección (además de la región). Aunque no he tenido mucha experiencia con nombres de lugares idénticos en diferentes países. Aún así, vale la pena intentarlo. Tratar
''address'': ''78 Austin Street, Boston, UK''
no debe devolver ninguna dirección (en lugar de US Boston), y
''address'': ''78 Main Street, Boston, UK''
Debería devolver Boston en el Reino Unido porque en realidad tiene una calle principal.
Actualizar:
¿Cómo restringir Geocoder para devolver ubicaciones solo desde un país o quizás desde un cierto rango de latitud?
Puede establecer un parámetro de bounds
. Mira here
Tendría que calcular un rectángulo del tamaño del Reino Unido para eso, por supuesto.
Estoy usando el Geocoder de Google para encontrar coordenadas de latitud para una dirección determinada.
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
variable de address
se toma de un campo de entrada.
Quiero buscar ubicaciones solo en el Reino Unido . Pensé que especificar ''region'': ''uk''
debería ser suficiente, pero no lo es. Cuando escribo "Boston", encuentro Boston en EE. UU. Y quería la de Reino Unido.
¿Cómo restringir Geocoder para devolver ubicaciones solo desde un país o quizás desde un cierto rango de latitud?
Gracias
El siguiente código obtendrá la primera dirección coincidente en el Reino Unido sin la necesidad de modificar la dirección.
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;
}
}
}
}
});
Encontré problemas con poner ", Reino Unido", establecer la región en el Reino Unido y establecer límites. Sin embargo, hacer TODO EL TRES parece arreglarlo para mí. Aquí hay un fragmento:
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.....
Encuentro que para muchas consultas ambiguas, los EE. UU. Siempre tienen prioridad en Google, incluso si intenta decirle dónde buscar. Puede ver la respuesta y quizás ignorarla si output country = US?
Esa es la razón principal por la que dejé de usar Google Geocoder hace un tiempo y empecé a construir mi propio hace dos años.
https://geocode.xyz/Boston,%20UK siempre devolverá la ubicación del Reino Unido. Puedes asegurarte más agregando region = UK: https://geocode.xyz/Boston,%20UK?region=UK
Intenté con lo siguiente:
geocoder.geocode( {''address'':request.term + '', USA''}
Y funciona para mí para una región en particular (país de EE. UU.).
La forma correcta de hacerlo es proporcionando restricciones de componentRestrictions
Por ejemplo:
var request = {
address: address,
componentRestrictions: {
country: ''UK''
}
}
geocoder.geocode(request, function(results, status){
//...
});
Para el Reino Unido, debes usar GB para la región. ¡El Reino Unido no es el código de país ISO!
Prefiero un enfoque híbrido .
- Utilice las Restricciones de componente para limitar severamente al país primero.
Si eso no arroja suficientes resultados, busque más ampliamente (y vuelva a introducir el sesgo si es necesario)
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 }
Siempre encontré que esto es bastante fácil de filtrar ya que los resultados pueden variar y la región parece no funcionar.
response( $.map( results, function( item ) {
if (item.formatted_address.indexOf("GB") != -1) {
return {
latitude: item.geometry.location.lat(),
longitude: item.geometry.location.lng()
}
}
}
Tuve que filtrar los resultados a un país yo mismo hoy. Descubrí que el código de país de dos caracteres en componentRestrictions: country: no funciona. Pero el nombre completo del país sí.
Este es el nombre completo en la dirección_componentes de un resultado.
Use el atributo componentRestrictions :
geocoder.geocode({''address'': request.term, componentRestrictions: {country: ''GB''}}
ACTUALIZACIÓN: esta respuesta puede no ser el mejor enfoque nunca más. Vea los comentarios debajo de la respuesta para más detalles.
Además de lo que Pekka ya sugirió , puede concatenar '', UK''
a su address
, como en el siguiente ejemplo:
<!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>
Captura de pantalla:
Encuentro que esto es muy confiable. Por otro lado, el siguiente ejemplo muestra que ni el parámetro de region
ni el parámetro de bounds
tienen ningún efecto en este caso:
<!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>