Datos de Google Maps: recupere datos cuando sea necesaria la paginación

Un usuario Pregunto ✅

Anónimo

Hola,

Somos bastante novatos y necesitamos ayuda. Estamos tratando de crear una tabla con datos provenientes de una consulta de Google Maps.

ingresamos en una función lat, long, radius y palabra clave para recibir un json con datos de ubicación.

nuestro código funciona cuando recibimos menos de 20 artículos, para más artículos es necesaria la paginación, pero no podemos continuar, ya que no tenemos experiencia en eso.

la ayuda es muy apreciada

roberto

let
    Source = (location as text, radius as text, category as text, optional pagetoken as text) =>
let    
    VAR1 = (location, radius, category, pagetoken,mapskey)  
 =>
let
    result = if pagetoken= null or "" then 
        Json.Document(Web.Contents("https://maps.googleapis.com/maps/api/place/nearbysearch/json?location="	&location&"&radius="&radius&"&keyword="&category&"&key=mapskey"))
else
Json.Document(Web.Contents("https://maps.googleapis.com/maps/api/place/nearbysearch/json?key=mapskey&pagetoken=pagetoken"))
,
    pagetoken= try result[pagetoken] otherwise null,    
    results = result[results],
    record = [results=results, pagetoken=pagetoken]
in record,
resultSet = List.Generate(
                    () => VAR1 (location, radius, category),
                    each _[pagetoken] <> null,
                    each VAR1(_[pagetoken]),
                    each [pagetoken= [pagetoken], results = [results]]
                    )
in VAR1 (location, radius, category, pagetoken)
in 
   Source

Hola @Anónimo,

Puede consultar los siguientes enlaces para saber cómo manejar la API de descanso de paginación:

Funciones auxiliares

Cómo obtener datos paginados de la API en Power BI

Cómo hacer paginación en Power Query

Saludos,

Xiaoxin-sheng

Anónimo

En respuesta a v-shex-msft

Hola, hemos seguido sus sugerencias y miramos algunos ejemplos. Nuestro código sigue sin funcionar.

El código que escribimos es

let
    pippo = (location as text, radius as text, category as text, pageToken) =>

    let
        source = if pageToken = null then
        Json.Document(Web.Contents("https://maps.googleapis.com/maps/api/place/nearbysearch/json?key=OUR KEY&location=45.538474,10.220309&keyword=bar&radius=2500"))
        else 
        Json.Document(Web.Contents("https://maps.googleapis.com/maps/api/place/nearbysearch/json?key=OUR KEY&pageToken=pageToken"))

,

        nextPageToken = try source[next_page_token] otherwise "pippo",
        results = source[results],
        record = [results = results , nextPageToken = nextPageToken ]
    in
        record,


resultSet = List.Generate(
                    () => pippo (location, radius, category, pageToken),
                   
                    each _[nextPageToken] <> null,
                    each pippo(_[nextPageToken]),
                    each [nextPageToken= [nextPageToken], results = [results]]
                    ),

   lastPageToken = List.Last(Table.FromRecords(resultSet)[nextPageToken]),
   lastResultSet = pippo(lastPageToken)[results], 
   fullResultSet = Table.Combine({Table.FromRecords(List.Combine(Table.FromRecords(resultSet)[results])), Table.FromRecords(lastResultSet)})
     
     
in
    fullResultSet

Podemos recopilar los 20 registros que se encuentran en la primera página, pero no podemos recuperar los elementos de las siguientes páginas (20 por página).

Básicamente nuestro problema está en las páginas posteriores a la primera, es decir en la generación del conjunto de resultados. El mensaje de error es

«Expression.Error: la ubicación de importación no coincide con las exportaciones. ¿Perdió una referencia de módulo?» – «Expresión.Error: No se reconoció el nombre ‘ubicación’. Asegúrese de que esté escrito correctamente».

BR

roberto

En respuesta a Anónimo

HOLA @Anonimo,

Creo que este problema debería estar más relacionado con su fórmula. La función pippo requiere 4 parámetros, pero solo ingresa uno en la función list.generate.
Intento modificar su fórmula para permitir que el parámetro funcione en su fórmula de consulta:

let
    pippo = (location as text, radius as text, category as text, pageToken) =>

    let
        url=if pageToken = null then
        "https://maps.googleapis.com/maps/api/place/nearbysearch/json?key=OUR KEY&location="&location&"&keyword=bar&radius=2500"
        else 
        "https://maps.googleapis.com/maps/api/place/nearbysearch/json?key=OUR KEY&pageToken="&pageToken,
        source =Json.Document(Web.Contents(url)),

        nextPageToken = try source[next_page_token] otherwise "pippo",
        results = source[results],
        record = [results = results , nextPageToken = nextPageToken ]
    in
        record,


resultSet = List.Generate(
                    () => pippo (location, radius, category, pageToken),
                   
                    each _[nextPageToken] <> null,
                    each pippo(location,radius,category,_[nextPageToken]),
                    each [nextPageToken= [nextPageToken], results = [results]]
                    ),

   lastPageToken = List.Last(Table.FromRecords(resultSet)[nextPageToken]),
   lastResultSet = pippo(lastPageToken)[results], 
   fullResultSet = Table.Combine({Table.FromRecords(List.Combine(Table.FromRecords(resultSet)[results])), Table.FromRecords(lastResultSet)})
     
     
in
    fullResultSet

Saludos,

Xiaoxin-sheng

Anónimo

En respuesta a v-shex-msft

Hola @v-shex-msft,

gracias por tus sugerencias, las hemos seguido y ahora tenemos la siguiente consulta:

let Func = (Ubicación, Radio, Palabra clave, Token) =>

deje Fuente =

si Token = nulo, entonces Json.Document(Web.Contents(«https://maps.googleapis.com/maps/api/place/nearbysearch/json?key=OUR_KEY&location=» & Location & «&keyword=» & Keyword & » &radius=» & Number.ToText(Radius)))

else Json.Document(Web.Contents(«https://maps.googleapis.com/maps/api/place/nearbysearch/json?key=OUR_KEY&pagetoken=» & Token)),

Resultados = probar Fuente[results] de lo contrario {},

NextPageToken = probar fuente[next_page_token] de lo contrario nulo,

artículos = [Results = Results, NextPageToken = NextPageToken]

en artículos,

ResultSet = Lista.Generar(

() => Func(«45.538474,10.220309», 1200, «barra», nulo),

cada [Results] <> {} y [NextPageToken] <> nulo,

cada Función.InvokeAfter(() => Func(null, null, null, _[NextPageToken]), #duración(0,0,0,1)),

cada [Results = [Results], FichaPáginaSiguiente = [NextPageToken]]

),

LastPageToken = List.Last(Table.FromRecords(ResultSet)[NextPageToken]),

LastResultSet = Function.InvokeAfter(() => Func(null, null, null, LastPageToken)[Results], #duración(0,0,0,1)),

FullResultSet = Table.Combine({Table.FromRecords(List.Combine(Table.FromRecords(ResultSet)[Results])), Tabla.FromRecords(LastResultSet)})

en conjunto de resultados completo

Tenemos algunos problemas:

  • Nuestra consulta devuelve 40 registros (la API de Google devuelve 20 registros por página hasta un total de 60 registros), no podemos recopilar los registros en la última página;
  • Si cambiamos el valor del radio, por ejemplo 1500 metros (o cualquier otro número) en lugar de 1200 metros, nuestra consulta devuelve 20 registros, ya no 40. Esto es extraño y no podemos entender por qué.

¿Puedes ayudarnos? Muchas gracias de antemano!

Saludos,

Elena @Anónimo

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *