iftopalmas/aglomerou

O ponto com a sua localização atual deve mostrar informações ao ser pressionado.

Closed this issue · 16 comments

Ao entar no mapa, ele carrega a localização atual e mostra um Marker.
Quando pressionar tal Marker, exibir uma informação como "Você está aqui: nome do lugar".

Use o recurso de Reverse Geocoding do Maps para obter o nome do lugar a partir das coordenadas.

Mudar ao menos a cor desse marker pra diferenciar dos outros.

De acordo com resultado obtido da requisição executada na API do Google Maps, uma localização não é associada a um local, e sim um local é associada a uma localização.
Quando executado a requisição, a geocodificação retorna localizações dentro de um raio aproximado das coordenadas passadas. Essas localizações apresentam todos os tipos de estabelecimentos indexados pelo Google, mas informações como nome não são carregadas nos resultados.
Mesmo com a utilização de filtros, disponibilizados pela própria API, nenhum resultado viável foi encontrado.

\"results\" : [
      {
         \"address_components\" : [
            {
               \"long_name\" : \"162\",
               \"short_name\" : \"162\",
               \"types\" : [ \"street_number\" ]
            },
            {
               \"long_name\" : \"Acesso Quadra 402 Sul Avenida Ns 2\",
               \"short_name\" : \"Ac. Q. 402 Sul Avenida Ns 2\",
               \"types\" : [ \"route\" ]
            },
            {
               \"long_name\" : \"Plano Diretor Sul\",
               \"short_name\" : \"Plano Diretor Sul\",
               \"types\" : [ \"political\", \"sublocality\", \"sublocality_level_1\" ]
            },
            {
               \"long_name\" : \"Palmas\",
               \"short_name\" : \"Palmas\",
               \"types\" : [ \"administrative_area_level_2\", \"political\" ]
            },
            {
               \"long_name\" : \"Tocantins\",
               \"short_name\" : \"TO\",
               \"types\" : [ \"administrative_area_level_1\", \"political\" ]
            },
            {
               \"long_name\" : \"Brazil\",
               \"short_name\" : \"BR\",
               \"types\" : [ \"country\", \"political\" ]
            },
            {
               \"long_name\" : \"77016-010\",
               \"short_name\" : \"77016-010\",
               \"types\" : [ \"postal_code\" ]
            }
         ]

A documentação informa que podem ser retornados vários locais. Um ponto pode representar uma rua, a rua está numa cidade, que está num estado e por fim num país. Por isso são retornados vários locais. O local da posição 0 é o mais preciso, logo, os outros podem ser ignorados.

O seu exemplo mostra exatamente isso, cada item, nada mais é do que um nível superior na hierarquia de locais.

Mas ainda sim a Reverse Geocoding não retorna o nome do estabelecimento né?! Será que podemos usar ela em conjunto com a PlacesAPI? A Rev.Geo retornaria o endereço que iria pra Places que por sua vez retornaria os dados do estabelecimento. Se a localização do usuário for precisa, vai dar certo. Eu acho! kk

Possivelmente ele retorna o PlaceID, aí é só usar a Places API como falou .

Fiz os teste utilizando a Places API do Google e novamente os resultados não trazem as informações da forma que esperamos. A partir da localização (latitude, longitude) o nome sempre é carregado com o enderenço.

Segue abaixo resultado obtido através da localização do Supermercado Extra

Object {
  "html_attributions": Array [],
  "result": Object {
    "address_components": Array [
      Object {
        "long_name": "60",
        "short_name": "60",
        "types": Array [
          "street_number",
        ],
      },
      Object {
        "long_name": "Quadra 504 Sul Alameda 4",
        "short_name": "Q. 504 Sul Alameda 4",
        "types": Array [
          "route",
        ],
      },
      Object {
        "long_name": "Plano Diretor Sul",
        "short_name": "Plano Diretor Sul",
        "types": Array [
          "sublocality_level_1",
          "sublocality",
          "political",
        ],
      },
      Object {
        "long_name": "Palmas",
        "short_name": "Palmas",
        "types": Array [
          "administrative_area_level_2",
          "political",
        ],
      },
      Object {
        "long_name": "Tocantins",
        "short_name": "TO",
        "types": Array [
          "administrative_area_level_1",
          "political",
        ],
      },
      Object {
        "long_name": "Brazil",
        "short_name": "BR",
        "types": Array [
          "country",
          "political",
        ],
      },
      Object {
        "long_name": "77021-690",
        "short_name": "77021-690",
        "types": Array [
          "postal_code",
        ],
      },
    ],
    "adr_address": "<span class=\"street-address\">Q. 504 Sul Alameda 4, 60</span> - <span class=\"extended-address\">Plano Diretor Sul</span>, <span class=\"locality\">Palmas</span> - <span class=\"region\">TO</span>, <span class=\"postal-code\">77021-690</span>, <span class=\"country-name\">Brazil</span>",
    "formatted_address": "Q. 504 Sul Alameda 4, 60 - Plano Diretor Sul, Palmas - TO, 77021-690, Brazil",
    "geometry": Object {
      "location": Object {
        "lat": -10.2155468,
        "lng": -48.32860609999999,
      },
      "viewport": Object {
        "northeast": Object {
          "lat": -10.2141982197085,
          "lng": -48.3273031197085,
        },
        "southwest": Object {
          "lat": -10.2168961802915,
          "lng": -48.3300010802915,
        },
      },
    },
    "icon": "https://maps.gstatic.com/mapfiles/place_api/icons/geocode-71.png",
    "id": "1db3ea854b24b1d496cca476590f39464305f44f",
    "name": "Q. 504 Sul Alameda 4, 60",
    "place_id": "ChIJ4yu1LqM0O5MRK1eXv94FFbM",
    "plus_code": Object {
      "compound_code": "QMMC+QH Plano Diretor Sul, Palmas - TO, Brazil",
      "global_code": "58XHQMMC+QH",
    },
    "reference": "ChIJ4yu1LqM0O5MRK1eXv94FFbM",
    "scope": "GOOGLE",
    "types": Array [
      "street_address",
    ],
    "url": "https://maps.google.com/?q=Q.+504+Sul+Alameda+4,+60+-+Plano+Diretor+Sul,+Palmas+-+TO,+77021-690,+Brazil&ftid=0x933b34a32eb52be3:0xb31505debf97572b",
    "utc_offset": -180,
    "vicinity": "Plano Diretor Sul",
  },
  "status": "OK",
}

Também tentei alterar a cor do Marker seguindo a documentação e não obtive sucesso.

@Thanyla Tu chegou a ver essa parte da documentação? Fala sobre buscar detalhes de um lugar pelo ID.
PlaceDetails

Quanto ao Marker, eu adicionei um Marker customizado. Ele é um icon do pacote vector icons. Pra tu mudar a cor dele tem que mudar direto nas propriedades do componente. Tentou dessa forma?!

@radaelilucca sim, o resultado anterior é usando exatamente o PlaceDetails.

Quanto ao Marker, quando você se refere a mudar a propriedade do componente quer disser alterar o próprio Marker ou o icon? Testei utilizando a propriedade pinColor no Marker.

@radaelilucca Consegui alterar, na verdade já havia testado alterando o icon Fa, mas possivelmente não conseguir visualizar a alteração por causa do cache. Obrigada.

Icon e cor alterados
Alteração pode ser checada na branch issue-173.

Bem, a Places API funciona em conjunto com a reverse geocoding.
Este exemplo mostra o que precisamos, o nome do lugar: https://developers.google.com/maps/documentation/javascript/examples/places-placeid-geocoder

@manoelcampos O exemplo que você citou não utiliza um endereço de localização com latitude e longitude. Da mesma forma que citei antes, quando passo a latitude e longitude para a API do Google Maps, tanto no Geocode quanto no Place, é retornado um place_id que está atrelado ao endereço da localização. A única forma que encontrei pra obter o place_id de um estabelecimento é passando o nome do estabelecimento como parâmetro de busca pro Google Maps. No próprio aplicativo do Google Maps, se você utiliza uma latitude e longitude como parâmetro de busca, o aplicativo não irá apresentar o estabelecimento mais próximo, neste caso ele só apresenta como resultado um endereço genérico próximo (bairro, rua, quadra, cidade, estado).

Os valores de endereço já são satisfatórios para resolver essa issue?

Acho que o problema é que não está passando as coordenadas exatas ou pegando os dados da chave errada no JSON.

Podemos usar a Places API para buscar o estabelecimento (documentação) em um determinado raio (em metros) de um par de coordenadas.
Eu consegui encontrar o Hipermercado Extra com a requisição:

Se ele encontrar estabelecimentos no raio para as coordenadas indicadas, eles serão listados.
Com a requisição acima, o vetor results na posição 0 retornou "Palmas", mas na posição 1 retornou "Extra".
Não sei se é sempre assim, mas tente com o retorno da posição 1.
Lá vai ter o campo name com o nome do local.

@manoelcampos fiz alguns testes e dependendo da localização os resultados podem variar muito, desta forma não tem como obter de forma padronizada o nome do estabelecimento.
Por exemplo, se você colocar no meio do condômino retorna vários resultados, onde muito destes resultados não estão próximos do local, e o nome do condomínio não é retornado.

https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=-10.2324755,-48.3231887&radius=50&key=API_KEY_HERE

Neste caso então vamos exibir o que for possível e vejo depois se há outra forma de fazer