Como geocodificar 300.000 endereços em tempo real?

Eu tenho um banco de dados que tem 300.000 endereços, que devem ser mostrados no mapa. Eu sei que se eu geocodificar todos os endereços, será muito caro para mim. Então, eu queria saber se é possível geocodificar o endereço instantaneamente / em tempo real, quando um usuário selecionaria um endereço (um endereço de propriedade), ele pesquisaria no banco de dados e, em seguida, geocodificaria o endereço e, em seguida, mapearia com outros atributos.

Seria muito bom se você pudesse compartilhar um código, conceito ou qualquer coisa. A propósito, meu backend está no mysql com suporte do Joomla.

Comentários

  • Eu geralmente uso o recurso de geocodificação do ArcGIS para geocodificar um grande número de endereços. Além disso, eu ‘ estou realmente interessado nos processos explicados aqui, especialmente, gosto de testar o script Python para geocodificar os endereços usando o Google e, em seguida, compará-los com o que eu ‘ obtido do ArcGIS. Infelizmente, parece-me que ‘ não consigo encontrar todos os arquivos e scripts relacionados que estão em lugares diferentes. Agradeceríamos se alguém me enviasse todos os scripts em um arquivo zip ou qualquer instrução passo a passo. Eu ‘ tentei usá-lo e recebi alguns comentários para você, mas não tive sucesso

Resposta

Mehul, eu trabalhava na indústria de verificação de endereço com uma empresa chamada SmartyStreets. Existem muitos serviços de geocodificação, mas apenas alguns suportarão o processamento em lote com o volume de que você precisa. (O Google e outros não permitem o uso em massa de sua API ou armazenamento / cache de resultados.)

Se você acessar seu banco de dados MySQL e realizar uma exportação de sua tabela que contém os endereços, salve-a como um Arquivo CSV, por exemplo. Você pode processá-lo usando a Ferramenta de validação de endereços em massa para listas ou Ferramenta de linha de comando . Como eu disse, existem vários serviços por aí, mas você vai querer algo, presumo, que verifique a existência de endereços também (daí o motivo da geocodificação) – se o endereço estiver errado ou incompleto, assim como os resultados da geocodificação. Apenas alguns serviços fazem isso.

LiveAddress é um serviço CASS-Certified pelo USPS. Existem alguns por aí, então faça sua pesquisa, mas você quer algo “on-the-fly” / rápido e barato, então, novamente, recomendo o LiveAddress. Ele não apenas verificará o endereço, mas fará o que você solicitar, fornecendo informações de latitude / longitude e também a precisão dos resultados da geocodificação. É tudo baseado na web e irá processar dezenas de milhões de registros em nenhum momento (veja esta pergunta como referência ).

Se você tiver mais precisa geocodificar os endereços à medida que os usuários estão interagindo, o US Street Address também tem uma versão de API que pode se conectar a praticamente qualquer coisa e também suporta processamento em lote no-the- voar, mas é pago como uma assinatura, não um pagamento único.

Comentários

  • Não estou familiarizado com o SmartyStreets, parece promissor, obrigado pelo alerta.
  • A API LiveAddress fará 300.000 em aproximadamente 5 a 10 minutos. O serviço LiveAddress for Lists (carregar uma lista para processamento) leva de 15 a 20 minutos. Ambos muito rápidos. O serviço List não exigirá que você escreva nenhum código.
  • O SmartyStreets geocodifica apenas para os EUA?
  • Tenho dados que são para Cingapura. Se não alguma direção que você poderia me dar ????
  • SmartyStreets oferece verificação de endereço internacional agora. @ user1089553

Resposta

Se você gosta de Python, pode usar o API GeoPy , combinada com as associações GDAL Python ou Fiona , e crie um script muito básico como este para converter os endereços em um arquivo de forma de ponto.

Isso irá localizar geograficamente um arquivo chamado “endereços_para_geocódigo”, criando um arquivo de forma de saída chamado “minha_output.shp” na pasta minha_aída:

import os from geopy import geocoders from osgeo import ogr, osr def geocode(address): g = geocoders.GoogleV3() place, (lat, lng) = g.geocode(address) print "%s: %.5f, %.5f" % (place, lat, lng) return place, lat, lng def parse_file(filepath, output_shape): # create the shapefile drv = ogr.GetDriverByName("ESRI Shapefile") if os.path.exists(output_shape): drv.DeleteDataSource(output_shape) ds = drv.CreateDataSource(output_shape) # spatial reference sr = osr.SpatialReference() sr.ImportFromProj4("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs") lyr = ds.CreateLayer(output_shape, sr, ogr.wkbPoint) # fields featDefn = lyr.GetLayerDefn() fld_id = ogr.FieldDefn("id", ogr.OFTInteger) fld_address = ogr.FieldDefn("ADDRESS", ogr.OFTString) fld_address.SetWidth(255) lyr.CreateField(fld_id) lyr.CreateField(fld_address) print "Shapefile %s created..." % ds.name # read text addresses file i = 0 f = open(filepath, "r") for address in f: try: print "Geocoding %s" % address place, lat, lng = geocode(address) point = ogr.Geometry(ogr.wkbPoint) point.SetPoint(0, lng, lat) feat = ogr.Feature(lyr.GetLayerDefn()) feat.SetGeometry(point) feat.SetField("id", i) feat.SetField("ADDRESS", address) lyr.CreateFeature(feat) feat.Destroy() i = i + 1 except: print "Error, skipping address..." parse_file("addresses_to_geocode", "my_output") 

O arquivo deve ter apenas uma linha para um único endereço, como por exemplo:

Via Benedetto Croce 112, Rome, Italy Via Aristide Leonori 46, Rome, Italy Viale Marconi 197, Rome, Italy 

Aqui estou usando a API do Google, mas com GeoPy é muito básico para alternar para APIs diferentes, como Yahoo !, GeoNames ou MapPoint .

Comentários

  • Isso é ótimo! Obrigado cara! De qualquer forma, atualmente (01/2016), ‘ geocoders.Google () ‘ deve ser alterado para ‘ geocoders.GoogleV3 () ‘ como em geopy.readthedocs.org/en/1.11.0

Resposta

Outra opção para resolver seu problema seria importar seu conjunto de dados para fusão tabelas e defina o campo de endereço como local. Em seguida, ele geocodificará os pontos automaticamente. Depois de concluído, você pode exportar os dados como KML.

Ou, alternativamente, você pode escrever um script php para usar o geocodificador do yahoo, que tem um limite de 50.000 registros, portanto, mais cedo ou mais tarde você terá todos os seus pontos geocodificados em seu banco de dados.

Espero que tenha ajudado!

Comentários

  • obrigado tamas, mas Eu não gostaria de obter o kml e, em seguida, buscar as informações de lá e depois para m db. Gosto da ideia de geocodificação do Yahoo, mas não tenho muita certeza da precisão que tem, pois nunca usei o Yahoo para mapeamento. Por favor, deixe-me saber se você tem algum script escrito ou algo assim. Esta é uma grande ajuda
  • Lembre-se de que usar o geocodificador do Yahoo (ou Google, nesse caso) com consultas automatizadas ou sem mostrar um mapa violará os TOS …
  • Até agora como eu sei, não é se você apresentar a saída em um mapa. Corrija-me se eu estiver errado!
  • @Tamas Mais ou menos. Veja isto, entretanto: developers.google.com/maps/terms#section_10_1_3

Resposta

Tenho usado com sucesso o geopy que usa o serviço da web de geocodificação do Google. Funciona perfeitamente para até 2.000 pontos por 24 horas.

Resposta

de longe o melhor e mais fácil geocodificador que usei https://pypi.python.org/pypi/geocoder/1.8.0 bing maps, google maps, OSM etc.

Resposta

Talvez não seja a melhor resposta para sua pergunta, mas você pode tentar o BatchGeo. A versão gratuita faria você sofrer muito, mas ainda era boa o suficiente para o meu trabalho. No entanto, compramos a versão profissional.

O truque para obter as coordenadas do arquivo KML é importá-lo para ArcGIS mais tarde.

Comentários

  • Obrigado, você pode me dizer como eu faço um BatchGeo, você também saberia os nomes da versão gratuita (Eu estava tentando a API do Google Maps v3). Isso também significa que preciso armazenar os valores Lat / Long em meu banco de dados para mapeá-lo. Isso é o que eu pretendia fazer em primeiro lugar.
  • Com BatchGeo, você terá que importar KML para seu banco de dados e extrair as coordenadas. Não conheço outra maneira, pois o Google proíbe fornecer coordenadas. Sobre o Yahoo, minha experiência com a Turquia não é muito brilhante. A maioria dos países em desenvolvimento é deixada de fora do escopo do Yahoo ‘. Anil.

Resposta

Matej, Isso porque a API do Google permite extrair até 2,5k por dia.
Sobre a solução Geo, lote ainda não foi encontrado para ser suportado que “s porque a partir da minha revisão do código geo python parece abrir a conexão toda vez que ele solicita um novo cordinate, 300k provavelmente ficará preso para sempre (provavelmente com erro 400).
Jogar com polígonos deve resolver, mas depende de qual é a sua área de “Campo de jogos”, se é 1 país ou n países.
Para 1 país, os polígonos devem funcionar muito bem .
Para n países, a solução não funcionará, pois a coleta levará mais tempo sempre que você adicionar outro país. A melhor abordagem para fazer isso é o carregamento lento.
=> comece com a ideia do polígono, tudo em outro país, crie uma grande tabela de banco de dados para conter os dados, eventualmente você terá os dados de que precisa, suponho.

Resposta

Se você quiser fazer isso com PHP – MySQL, aqui está uma solução que rked para mim:

<script type="text/javascript" charset="utf-8"> var customIcons = { restaurant: { icon: "http://labs.google.com/ridefinder/images/mm_20_blue.png", shadow: "http://labs.google.com/ridefinder/images/mm_20_shadow.png" }, bar: { icon: "http://labs.google.com/ridefinder/images/mm_20_red.png", shadow: "http://labs.google.com/ridefinder/images/mm_20_shadow.png" }, club: { icon: "http://labs.google.com/ridefinder/images/mm_20_yellow.png", shadow: "http://labs.google.com/ridefinder/images/mm_20_shadow.png" }, church: { icon: "http://labs.google.com/ridefinder/images/mm_20_green.png", shadow: "http://labs.google.com/ridefinder/images/mm_20_shadow.png" } }; function initialize() { var mapOptions = { center: new google.maps.LatLng(37.976178, 23.735881), zoom: 7, mapTypeId: google.maps.MapTypeId.roadmap }; var map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions); <?php header("content-type: text/html;charset=utf-8"); $getpoints = "SELECT lat, lng, name, address, type FROM markers"; $getpoints .= $filter; if(!$result = $con->query($getpoints)){ die("There was an error running the query [" . $con->error . "]"); } else { while ($row = $result->fetch_assoc()) { $thematic = ""$row[type]""; $name = ""$row[name]""; $map_address = "$row[address]"; $url = "http://maps.googleapis.com/maps/api/geocode/json?sensor=false&address=".urlencode($map_address); $lat_long = get_object_vars(json_decode(file_get_contents($url))); // pick out what we need (lat,lng) $lat_long = $lat_long["results"][0]->geometry->location->lat . "," . $lat_long["results"][0]->geometry->location->lng; echo "var myLatlng1 = new google.maps.LatLng($lat_long); var icon = customIcons[$thematic] || {}; var marker1 = new google.maps.Marker({ position: myLatlng1, map: map, icon: icon.icon, title: "$map_address" });"; } } ?> } google.maps.event.addDomListener(window, "load", initialize); </script> 

Resposta

Tente isto API de geocodificação . É gratuito para uso pequeno, mas se você quiser mais, eles fazem você pagar. No entanto, é barato e você pode processar isso com muita facilidade, eu processo milhões por mês com eles.

Resposta //a>)) Nesta ferramenta, você pode processar os dados usando a chave de API gratuita do Google map. E também esta ferramenta fornece cálculo de distância & Ferramenta de pesquisa de local.

Comentários

  • Por que não ‘ isso atingiu o mesmo limite de API mencionado por OP?

Resposta

Você pode salvar seus dados como um arquivo de texto (um registro por linha) e geocodificar em lote usando este serviço: http://geocode.xyz/batch (funciona para a maioria dos países europeus)

ou, você pode escrever seu próprio código para acessar o REST / API JSON: (é gratuito para pesquisas ilimitadas)

Comentários

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *