..e os mapas do Google "dividem as águas das águas"
Bem, não no sentido bíblico, mas ..
Gostaria de saber que opções tenho para verificar se um ponto de [Lat, Lon] é Terra ou Água.
O Google Maps obviamente tem esses dados (os corpos d'água são azuis) - mas há algo na API que eu possa usar para isso? E se não - eles não estão servindo porque nunca pensaram nisso? Ou porque é muito complicado?
Não encontrei nenhuma informação sobre o assunto - exceto algumas questões semelhantes aqui (como encontrar o tipo de terreno ou elevação - mas não é exatamente o que eu preciso).
Existe uma camada separada para isso? Uma opção? Comando? Ou devo fazer isso manualmente?
A única maneira que consigo pensar em como abordar isso (caso precise fazer isso manualmente) é verificar cada bloco servido para o ponto exato - e, em seguida, verificar o valor RGB para esse matiz do mapa do Google. Isso é apenas na teoria - porque na prática - não tenho ideia de como fazer isso, o primeiro obstáculo é que eu não sei como posso converter a localização de um pixel em um bloco para um ponto [LatLon], por exemplo
Uma solução pronta seria muito mais fácil.
Observe que não preciso de TODA a água do mundo (por exemplo - não me importo com riachos, pequenos lagos, a maioria dos rios ou a piscina do seu vizinho. Eu preciso de pontos onde uma pessoa pode se aventurar sem o auxílio de um veículo flutuante )
EDITAR I
Depois de ler os comentários: O método de elevação não é confiável, existem muitos lugares ABAIXO do nível do mar (você pode ver uma lista dos 10 "mais profundos" aqui http://geology.com/below-sea-level/ ) e ali há muitos corpos d'água sem litoral ACIMA do nível do mar (lagos). O método de geolocalização reversa não é confiável porque retornará uma entidade geopolítica, como uma cidade ou estado - ou ZERO muitas vezes. Já examinei essas pseudo-soluções antes de fazer a pergunta - mas nenhuma delas respondeu de fato à pergunta - esses métodos são, na melhor das hipóteses, "suposições" ruins.
fonte
Respostas:
Existem 2 maneiras diferentes, você pode tentar:
Você pode usar a geocodificação reversa do Google Maps . No conjunto de resultados, você pode determinar se é água verificando
types
. No caso de águas, o tipo énatural_feature
. Veja mais neste link http://code.google.com/apis/maps/documentation/geocoding/#Types .Além disso, você precisa verificar os nomes dos recursos, se eles contêm
Sea, Lake, Ocean
e algumas outras palavras relacionadas a águas para mais precisão. Por exemplo, os desertos também sãonatural_feature
s.Prós - Todo o processo de detecção será feito na máquina do cliente. Não há necessidade de criar serviço próprio do lado do servidor.
Contras - Muito impreciso e as chances de você não obter "nenhum" nas águas são muito altas.
Você pode detectar águas / terras por pixels, usando o Google Static Maps . Mas para isso você precisa criar um serviço http.
Estas são as etapas que seu serviço deve executar:
latitude
,longitude
ecurrent zoom
do cliente.http://maps.googleapis.com/maps/api/staticmap?center={
latitude,,
longitude}&zoom={
zoom atual`} & size = 1x1 & maptype = roadmap & sensor = solicitação falsa para o serviço Google Static Map.Você não pode detectar a cor do pixel no lado do cliente. Sim, você pode carregar a imagem estática na máquina do cliente e desenhar a imagem no
canvas
elemento. Mas você não pode usargetImageData
o contexto da tela para obter a cor do pixel. Isso é restrito pela política de domínio cruzado.Prons - detecção altamente precisa
Contras - Uso de recursos próprios do servidor para detecção
fonte
Não parece possível com nenhum serviço atual do Google.
Mas existem outros serviços, como o serviço Koordinates Vector JSON Query ! Você simplesmente consulta os dados no URL e obtém uma resposta JSON / XML .
Você deve registrar e fornecer sua chave e o número da camada selecionada. Você pode pesquisar todos os seus repositórios de camadas disponíveis . A maioria das camadas são apenas regionais, mas você também pode encontrar globais, como o Litoral Mundial :
Ao selecionar uma camada, você clica na guia "Serviços" e obtém o URL de solicitação de exemplo. Acredito que você só precisa se cadastrar e é isso!
E agora o melhor:
Você pode enviar sua camada!
Não está disponível imediatamente, ei, temos que processá-lo de alguma forma, mas deve funcionar! O repositório de camadas realmente parece que as pessoas os carregaram quando precisaram.
fonte
É isso que eu uso e está funcionando bem ... você pode melhorar o teste se tiver mais cpu para desperdiçar adicionando pixels.
fonte
Existe uma API web gratuita que resolve exatamente esse problema, chamada onwater.io . Não é algo embutido no Google Maps, mas dada uma latitude e longitude, retornará verdadeiro ou falso com precisão por meio de uma solicitação get.
Exemplo na água: https://api.onwater.io/api/v1/results/23.92323,-66.3
Exemplo em terra: https://api.onwater.io/api/v1/results/42.35,-71.1
Divulgação total Eu trabalho na Dockwa.com , a empresa por trás do onwater. Construímos onwater para resolver este problema nós mesmos e ajudar a comunidade. É grátis para usar (pago para alto volume) e queríamos compartilhar :)
fonte
Achei mais interessante fazer essa consulta localmente, para ser mais autossuficiente: digamos que eu queira gerar 25.000 coordenadas terrestres aleatórias de uma vez, prefiro evitar chamadas para APIs externas possivelmente caras. Aqui está minha chance em python, usando o exemplo python mencionado por TomSchober. Basicamente, ele procura as coordenadas em um arquivo pré-fabricado de 350 MB contendo todas as coordenadas terrestres, e se as coordenadas existem lá, ele as imprime.
Tentei uma dúzia de coordenadas, funciona maravilhosamente bem. O arquivo "land_polygons.shp" pode ser baixado aqui , cortesia do OpenStreetMaps. (Eu usei o primeiro link de download WGS84 sozinho, talvez o segundo funcione bem)
fonte
natural=coastline
. Uma rápida pesquisa no Google oferece o uso desta página que afirma especificamente que as marcas de linha costeira, na verdade, não se aplicam a lagos em sua nomenclatura. Então, eu diria que não , meu método não identifica lagos como água, já que o conjunto de dados que estou usando não identifica. Mas tente você mesmo!Confira este artigo . Ele detecta com precisão se algo está na água sem a necessidade de um servidor. É um hack que depende do recurso de estilo personalizado do Google Maps.
fonte
Além da geocodificação reversa - como o Dr. Molle apontou, ela pode retornar ZERO_RESULTS - você pode usar o serviço Elevation. Se você obtiver zero resultados por geocodificação reversa, obtenha a elevação do local. Geralmente, o mar recebe um número negativo porque o fundo do mar está abaixo do nível do mar. Há um exemplo totalmente trabalhado do serviço de elevação.
Tenha em mente que, como o Google não disponibiliza essas informações, qualquer outro método é apenas uma suposição e as suposições são inerentemente imprecisas. No entanto, usar o
type
retornado por geocodificação reversa ou a elevação, setype
não estiver disponível, cobrirá a maioria das eventualidades.fonte
Este método não é totalmente confiável. Na verdade, os dados retornados dependerão totalmente da parte do mundo com que você está trabalhando. Por exemplo, estou trabalhando na França. Se eu clicar no mar na costa da França, o Google retornará o local LAND mais próximo que ele pode "adivinhar". Quando solicitei informações ao Google para esta mesma pergunta, eles responderam que não conseguiram retornar com precisão aquele ponto solicitado em uma massa de água.
Não é uma resposta muito satisfatória, eu sei. Isso é muito frustrante, especialmente para aqueles de nós que fornecem ao usuário a capacidade de clicar no mapa para definir a posição de um marcador.
fonte
Se tudo mais falhar, você pode sempre tentar verificar a elevação no ponto e a alguma distância - muitas coisas além da água tendem a ser completamente planas.
fonte
Infelizmente, esta resposta não está na API do Google Maps e o recurso referenciado não é gratuito, mas há um serviço da web fornecido por DynamicGeometry que expõe uma operação
GetWaterOrLand
que aceita um par de latitude / longitude ( você pode ver uma demonstração aqui ).Meu entendimento de como isso é implementado é usando arquivos de forma de corpo d'água. Exatamente como esses arquivos de forma são usados com a API do Google Maps, mas você pode obter algumas informações na demonstração vinculada.
Espero que ajude de alguma forma.
fonte
Aqui está outro exemplo em JavaScript puro: http://jsfiddle.net/eUwMf/
Como você pode ver, a ideia é basicamente a mesma que rebe100x, pegar a imagem da API do mapa estático do Google e ler o primeiro pixel:
fonte
Veja a resposta que dei a uma pergunta semelhante - ele usa "HIT_TEST_TERRAIN" da API da Terra para realizar a função.
Há um exemplo prático da ideia que elaborei aqui: http://www.msa.mmu.ac.uk/~fraser/ge/coord/
fonte
Eu recomendaria fazer o seu próprio aqui. Você pode usar ferramentas como GDAL para consultar o conteúdo sob um ponto em um shapefile. Você pode obter shapefiles para a geografia dos EUA de muitas fontes, incluindo o US Census Bureau .
Isso pode ser feito por meio de binários GDAL, o código-fonte C ou via swig em Java, Python e muito mais.
Mapas do Censo
Informação GDAL
Exemplo de consulta de ponto em Python
fonte
Aqui está uma solução simples
Como o Google não fornece resultados confiáveis com relação às coordenadas localizadas no oceano ou nos corpos d'água interiores, você precisa usar outro serviço de backup, como o Yandex, para ajudar a fornecer essas informações críticas quando elas estiverem ausentes. Provavelmente, você não gostaria de usar o Yandex como seu geocodificador principal porque o Google é muito superior na confiabilidade e integridade dos dados mundiais. No entanto, o Yandex pode ser muito útil para a finalidade de recuperar dados quando se relaciona a coordenadas sobre corpos d'água, então use ambos.
Documentação Yandex: https://api.yandex.com.tr/maps/doc/geocoder/desc/concepts/input_params.xml
As etapas para recuperar o nome do oceano:
1.) Use o Google primeiro para reverter a geocodificação da coordenada.
2.) Se o Google retornar zero resultados, é 99% provável que a coordenada esteja sobre um oceano. Agora faça uma solicitação secundária de geocodificação reversa com as mesmas coordenadas para Yandex. Yandex retornará uma resposta JSON com para as coordenadas exatas, dentro desta resposta haverá dois pares de importância "chave": "valor"
Verifique o tipo de chave, se for == "hidro" você sabe que está sobre um corpo d'água e, como o Google retornou zero resultados, é 99,99% de probabilidade desse corpo d'água ser um oceano. O nome do oceano será a chave "nome" acima.
Aqui está um exemplo de como eu uso essa estratégia escrita em Ruby
As etapas para recuperar um nome de corpo d'água interno:
Para este exemplo, suponha que nossa coordenada esteja em um lago em algum lugar:
1.) Use o Google primeiro para reverter a geocodificação da coordenada.
2.) O Google provavelmente retornará um resultado que é um endereço padrão de destaque em um terreno próximo. Neste resultado ele fornece as coordenadas do endereço que retornou, esta coordenada não coincidirá com a que você forneceu. Meça a distância entre a coordenada que você forneceu e aquela retornada com o resultado, se for significativamente diferente (por exemplo, 100 jardas), em seguida, execute uma solicitação de backup secundária com Yandex e verifique para ver o valor da chave "kind", se é "hidro", então você sabe que a coordenada está na água. Como o Google retornou um resultado diferente do exemplo acima, é 99,99% provável que este seja um corpo de água interior, então agora você pode obter o nome. Se "kind" não == "hydro", use o objeto geocodificado do Google.
Aqui está o mesmo código escrito em Ruby para obter inland_body_of_water
Uma observação sobre o licenciamento: até onde eu sei, o Google não permite que você use seus dados para exibição em quaisquer outros mapas além dos que o Google oferece. Yandex, entretanto, tem licenciamento muito flexível, e você pode usar seus dados para serem exibidos no Google Maps.
Além disso, Yandex tem um limite de taxa alta de 50.000 solicitações / dia gratuitas e sem a chave API necessária.
fonte
Consegui chegar bem perto usando a API do Google Elevation. Aqui está uma imagem dos resultados:
Você vê que os hexágonos praticamente permanecem na terra, embora um perímetro retangular seja definido que passa parcialmente sobre a água. Neste caso, fiz uma verificação rápida no próprio Google Maps e a elevação mínima em terra era de cerca de 8-9m, então esse era o meu limite. O código é principalmente copiado / colado da documentação do Google e Stack Overflow, aqui está a essência completa:
https://gist.github.com/dvas0004/fd541a0502528ebfb825
fonte
Se o
List<Address>
endereço retornar 0, você pode assumir esta localização como oceano ou Recursos naturais. Basta adicionar o código abaixo em Seu método de resposta da resposta da API do Google Places.Inicializar abaixo da lista conforme mencionado
List<Address> addresses = geocoder.getFromLocation(latLng.latitude, latLng.longitude, 1);
if (addresses.size()==0) { Toast.MakeText(getApplicationContext,"Ocean or Natural Resources selected",Toast.LENGTH_SHORT).show(); }else{ }
fonte
Como um novato completo em Python, não consegui fazer a solução do SylvainB funcionar com o script Python que verifica se as coordenadas estão em terra. Eu consegui descobrir, no entanto, baixando OSGeo4W ( https://trac.osgeo.org/osgeo4w/ ) e depois instalei tudo que precisava pip, Ipython, e verifiquei se todas as importações especificadas estavam lá. Salvei o código a seguir como um arquivo .py.
Código para verificar se as coordenadas estão em terra
Tentei fazê-lo funcionar em R, mas tive um pesadelo ao tentar obter todos os pacotes que você precisa para instalar tão preso ao python.
fonte
Eu tenho uma solução diferente aqui. Na implementação atual do mapa do Google, ele não calcula a direção / distância de um local de água para um local de terra e vice-versa. Por que não usamos essa lógica para determinar se o ponto é terra ou água.
Por exemplo, vamos dar este exemplo
se queremos determinar, se um ponto
x
é terra ou água, entãovamos verificar a direção entre o ponto
x
e um ponto conhecidoy
que é a terra. Se ele determina a direção / distância, o pontox
é a terra ou a água.fonte