google maps api 3 - nearbysearch - Las sugerencias de autocompletado de Google Places con Número de unidad/Subpremisa no se incluyen en la matriz de respuestas
search places google maps api (3)
La API de autocompletado de Places no está diseñada para admitir resultados ''subpremisados''. Esto se informó y respondió hace algún tiempo en el rastreador de problemas públicos en https://issuetracker.google.com/35830389
Las direcciones australianas para los resultados subpremisos parecen "lo suficientemente cercanas" a las de los resultados de street_address / premise (comienzan principalmente con dígitos). Esto está dando como resultado que Autocompletar en el lugar devuelva lo que puede parecer un resultado subpremisado, sin embargo, tenga en cuenta que el tipo sigue siendo "ruta":
http://maps.googleapis.com/maps/api/place/autocomplete/json?input=9/321%20Pitt%20Street,%20Sydney
description: "9/321 Pitt Street, Sydney NSW, Australia",
place_id: "Eig5LzMyMSBQaXR0IFN0cmVldCwgU3lkbmV5IE5TVywgQXVzdHJhbGlh",
types: ["route","geocode",],
Las solicitudes de detalles de ubicación (y geocodificación) con este place_id encontrarán de hecho el resultado de subpremisión correcto:
"result" : {
"address_components" : [
{
"long_name" : "9",
"short_name" : "9",
"types" : [ "subpremise" ]
},
{
"long_name" : "321",
"short_name" : "321",
"types" : [ "street_number" ]
},
...
"formatted_address" : "9/321 Pitt St, Sydney NSW 2000, Australia",
"types" : [ "subpremise" ],
Sin embargo, no se garantiza que esto funcione para todas las consultas de subpremisión, o incluso para esta en particular a largo plazo.
Un enfoque más confiable sería utilizar la API de geocodificación para buscar la "descripción" de la predicción:
"results" : [
{
"address_components" : [
{
"long_name" : "9",
"short_name" : "9",
"types" : [ "subpremise" ]
},
{
"long_name" : "321",
"short_name" : "321",
"types" : [ "street_number" ]
},
...
],
"formatted_address" : "9/321 Pitt St, Sydney NSW 2000, Australia",
"place_id" : "Eik5LzMyMSBQaXR0IFN0LCBTeWRuZXkgTlNXIDIwMDAsIEF1c3RyYWxpYSIdGhsKFgoUChIJkyPU0z2uEmsR-pmiK6UvZUASATk",
"types" : [ "subpremise" ]
Estoy usando la API de Google Places para completar automáticamente las direcciones usando javascript
Cuando escribo el número de la unidad y el número de la calle de la dirección, en el cuadro de entrada, se muestran los resultados en el menú desplegable de sugerencias, pero cuando selecciono la dirección del oyente para el evento de acción ''place_changed'' no tengo ninguna dirección con address_component with type ''subpremise ''incluso la propiedad formatted_address no tiene el número de la unidad. Aunque contiene otros detalles de'' número de calle '','' ciudad '','' país '', etc.
Por ejemplo: si escribo "1403/648 Bourke Street" con una restricción de país a Australia. Me muestra 5 resultados en el menú desplegable con el primero como "1403/648 Bourke street, Melbourne, Australia" pero cuando selecciono esta opción, todo lo que obtengo en el detector de eventos place_change es "648 Bourke street, Melbourne, Australia"
Sin embargo, este problema es intermitente, funciona para algunas direcciones de unidades pero falla para otras. ¡Cualquier sugerencia será muy apreciada!
Me parece que Google está validando que la dirección es real (bueno, al menos real cuando se actualizó por última vez su base de datos de lugares, supongo que con los registros del gobierno). El problema es que las subdivisiones suceden todo el tiempo donde se crean nuevas direcciones de "subpremisio", y una búsqueda de estas parece ser más frecuente. Es extraño que permitan una dirección "no válida" como una sugerencia de autocompletar pero luego limiten el resultado.
Una búsqueda en la dirección de Sydney a continuación devolverá "subpremise" y "street_number"
"9/321 Pitt Street, Sydney, Nueva Gales del Sur, Australia"
Donde la dirección de Melbourne a continuación solo es tan precisa como "ruta"
"2/321 Pitt Street, Brunswick, Victoria, Australia"
El mayor problema es que el resultado no devuelve el número de unidad o calle en ninguna parte de la respuesta.
He pirateado el siguiente JS para comparar la dirección ingresada por el usuario con el resultado devuelto. Si faltan los "números", se agregan. Se puede personalizar como sea necesario para que se ajuste a su código.
if (addressType == ''route'') {
var regex = RegExp(''^(.*)''+GPLACESSTREET.split('' '',1)[0]), // get all the user entered values before a match with the first word from the Google result
result = regex.exec(INPUTFEILD.value);
if ( Array.isArray(result) ) {
FULLSTREETADDRESS = result[1]+''''+GPLACESSTREET; // add the street name to the user-entered unit & street number
}
}
Una ligera modificación del código de @ MountainAsh:
if (addressType == ''route'') {
var regex = RegExp(''^(.*?)''+GPLACESSTREET.split('' '',1)[0]), // get all the user entered values before a match with the first word from the Google result
result = regex.exec(INPUTFEILD.value);
if ( Array.isArray(result) ) {
FULLSTREETADDRESS = result[1]+''''+GPLACESSTREET; // add the street name to the user-entered unit & street number
}
}
Observe el adicional ? en RegExp , que hace que la búsqueda no sea codiciosa para cubrir casos en los que el nombre de la calle comience con el mismo nombre del suburbio (por ejemplo, 123 Clayton Rd, Clayton).