300,000 개의 주소를 즉석에서 지오 코딩하는 방법은 무엇입니까?


18

300,000 개의 주소가있는 데이터베이스가 있으며지도에 표시됩니다. 모든 주소를 지오 코딩하면 비용이 너무 많이 듭니다. 그래서 주소를 실시간으로 지오 코딩 할 수 있는지 궁금합니다. 사용자가 주소 (속성 주소)를 선택하면 데이터베이스를 검색 한 다음 주소를 지오 코딩 한 다음 다른 속성들.

코드, 개념 또는 다른 것을 공유 할 수 있다면 정말 좋을 것입니다. 그건 그렇고 내 백엔드는 Joomla가 지원하는 mysql에 있습니다.


일반적으로 ArcGIS 지오 코딩 기능을 사용하여 많은 수의 주소를 지오 코딩합니다. 또한 여기에 설명 된 프로세스, 특히 파이썬 스크립트를 테스트하여 Google을 사용하여 주소를 지오 코딩 한 다음 ArcGIS에서 얻은 것과 비교하는 것과 같은 프로세스에 관심이 있습니다. 불행히도 다른 장소에있는 모든 관련 파일과 스크립트를 찾을 수없는 것 같습니다. 누군가가 모든 스크립트를 하나의 zip 파일 또는 단계별 지침으로 보내 주시면 감사하겠습니다. 나는 그것을 사용하고 당신에게 약간의 피드백을 얻으려고 노력했지만, 나는 성공하지 못했습니다
Housh

답변:


15

Mehul, 저는 SmartyStreets라는 회사와 주소 확인 업계에서 일했습니다. 지오 코딩 서비스는 많지만 필요한 볼륨으로 일괄 처리를 지원하는 서비스는 거의 없습니다. (Google 및 기타 업체는 API를 대량으로 사용하거나 결과를 저장 / 캐싱하는 것을 허용하지 않습니다.)

MySQL 데이터베이스로 이동하여 주소가 포함 된 테이블 내보내기를 수행하는 경우이를 예를 들어 CSV 파일로 저장하십시오. 그런 다음 SmartyList 웹 도구 또는 명령 행 도구를 사용하여이를 처리 할 수 ​​있습니다 . 내가 말했듯이, 몇 가지 서비스가 있지만 주소가 존재하는지 (따라서 지오 코딩의 이유) 확인하는 것이 필요합니다. 주소가 잘못되었거나 불완전한 경우 지오 코딩 결과도 있습니다 . 일부 서비스 만이 작업을 수행합니다.

LiveAddress는 USPS에서 CASS 인증 한 서비스입니다 . 거기에 몇 가지 연구가 있지만 "즉시"/ 빠르고 저렴한 것을 원하므로 다시 LiveAddress를 권장합니다. 주소를 확인할뿐만 아니라 위도 / 경도 정보와 지오 코딩 결과의 정밀도를 요구하는대로 수행합니다. 그것은 모두 웹 기반 이며 즉시 수천만 개의 레코드를 처리합니다 ( 이 질문을 참조하십시오 ).

사용자가 상호 작용하면서 주소를 지오 코딩해야하는 경우 LiveAddress에는 거의 모든 것에 연결할 수 있는 API 버전이 있으며 즉시 일괄 처리를 지원하지만 일회성이 아닌 구독으로 지불됩니다. 지불.


SmartyStreets에 익숙하지 않으며 유망한 것으로 보입니다.
Derek Swingley

LiveAddress API는 약 5-10 분 안에 300,000을 수행합니다. LiveAddress for Lists 서비스 (처리를 위해 목록 업로드)는 15-20 분이 걸립니다. 둘 다 꽤 빠릅니다. List 서비스는 코드 작성을 요구하지 않습니다.
Jeffrey

2
SmartyStreets는 미국의 지오 코드 만?
Mapperz

싱가포르에 대한 데이터가 있습니까? 지시가 없다면 나에게 줄 수 있습니까 ????
user1089553

Google Bing 및 기타 제공 업체에는 많은 저작권 규칙이 있습니다. 데이터를 내 보내지 않습니다!

11

Python을 좋아한다면 GDAL Python 바인딩 또는 Fiona 와 결합 된 GeoPy API를 사용 하여 주소를 포인트 셰이프 파일로 변환하는 이와 같은 매우 기본적인 스크립트를 만들 수 있습니다.

그러면 'addresses_to_geocode'라는 파일의 위치가 지정되어 my_output 폴더에 'my_output.shp'라는 출력 모양 파일이 생성됩니다.

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')

파일은 예를 들어 다음과 같이 단일 주소에 대해 한 줄만 있어야합니다.

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

여기에서는 Google API를 사용하고 있지만 GeoPy는 Yahoo !, GeoNames 또는 MapPoint와 같은 다른 API로 전환하는 것이 매우 기본 입니다.


대단해! 고마워요! 어쨌든, 현재 ( 2016
umbe1987

1

문제를 해결하는 또 다른 옵션은 데이터 집합을 퓨전 테이블로 가져오고 주소 필드를 위치로 설정하는 것입니다. 그런 다음 포인트를 자동으로 지오 코딩합니다. 완료되면 데이터를 KML로 내보낼 수 있습니다.

또는 .. 대신, 50,000 스크립트로 제한되는 야후 지오 코더를 사용하기 위해 PHP 스크립트를 작성할 수 있으므로 조만간 데이터베이스에 모든 지점이 지오 코딩됩니다.

이것이 도움이 되었기를 바랍니다!


덕분에 tamas하지만 kml을 가져 와서 거기에서 정보를 가져온 다음 m db로 가져 가고 싶지 않습니다. yahoo 지오 코딩에 대해 알고 싶지만 yahoo를 매핑에 사용한 적이 없으므로 정확성이 확실하지 않습니다. 스크립트가 작성되었거나 어떤 것이 있으면 알려주세요. 이것은 큰 도움이됩니다
user1089553

자동화 된 검색어를 사용하거나지도를 표시하지 않고 Yahoo (또는 Google의 경우) 지오 코더를 사용하면 TOS를 위반하게됩니다.
Matt

내가 아는 한, 출력물을지도에 표시하는 것은 아닙니다. 내가 틀렸다면 정정해라!
EZMapdesign

@Tamas 종류. 그러나 이것을보십시오 : developers.google.com/maps/terms#section_10_1_3
Matt


0

귀하의 질문에 가장 적합한 답변은 아니지만 BatchGeo를 사용해보십시오. 무료 버전을 사용하면 많은 고통을 겪을 수 있지만 여전히 내 작품에는 충분했습니다. 그러나 우리는 프로 버전을 구입했습니다.

KML 파일에서 좌표를 얻는 방법은 나중에 ArcGIS로 가져 오는 것입니다.


감사합니다. BatchGeo를 어떻게 수행하는지 알려주고 무료 버전의 이름을 알고 싶습니다 (Google Map api v3을 사용하려고했습니다). 또한 이것은 매핑하기 위해 Lat / Long 값을 데이터베이스에 저장해야 함을 의미합니다. 이것이 내가 처음에했던 것입니다.
user1089553

BatchGeo를 사용하면 KML을 데이터베이스로 가져 와서 좌표를 추출해야합니다 .Google이 좌표를 제공하는 것을 금지하는 다른 방법은 없습니다. 야후에 대해, 터키에 대한 나의 경험은 실제로 밝지 않습니다. 대부분의 개발 도상국은 야후의 범위에서 제외됩니다. 쪽빛.
Anıl Çelik

0

Google 지오 코딩 웹 서비스를 사용하는 지오피를 성공적으로 사용했습니다. 24 시간마다 최대 2k 포인트까지 완벽하게 작동합니다.


0

Matej, 구글 API는 하루 최대 2.5k를 사용할 수 있기 때문입니다.
Geo 솔루션에 대해서는 배치가 아직 지원되지 않는 것으로 나타났습니다. 지리적 파이썬 코드를 검토 한 결과 새 좌표를 요청할 때마다 연결이 열려있는 것처럼 보이므로 300k는 아마도 영원히 멈출 것입니다 (아마 400 오류).
Poligons와 함께 플레이하면 트릭을 수행해야하지만 1 국가 또는 n 국가 인 경우 '놀이터'영역에 따라 다릅니다.
한 국가의 경우 다각형이 꽤 잘 작동합니다.
n 개 국가의 경우 다른 국가를 추가 할 때마다 수집 시간이 길어 지므로 솔루션이 작동하지 않습니다. 그것을하는 가장 좋은 방법은 게으른로드입니다.
=> 다각형 아이디어, 다른 나라의 모든 것부터 시작하여 데이터를 보유 할 큰 데이터베이스 테이블을 작성하십시오. 결국 필요한 데이터를 보유하게됩니다.


0

PHP-MySQL로하고 싶다면 다음과 같은 해결책이 있습니다.

<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>

0

지오 코딩 API를 사용해보십시오 . 적은 사용량에 대해서는 무료이지만 더 많이 원할 경우 비용을 지불하게됩니다. 그러나 저렴하고 훨씬 쉽게 처리 할 수 ​​있으며 한 달에 수백만 달러를 처리합니다.


0

데이터를 텍스트 파일 (한 줄에 하나의 레코드)로 저장 한 후 다음 서비스를 사용하여 데이터를 일괄 지오 코딩 할 수 있습니다. http://geocode.xyz/batch (대부분의 유럽 국가에서 작동)

또는 REST / JSON API에 액세스하기위한 고유 코드를 작성할 수 있습니다. http://geocode.xyz/api (무제한 조회는 무료)


0

맵 포인팅 도구 사용 (맵 포인팅 | 배치 지오 코딩 도구 ( http://www.mappointing.com/ ))이 도구에서 Google 맵 프리 API 키를 사용하여 데이터를 처리 할 수 ​​있습니다. 또한이 도구는 거리 계산 및 장소 검색 도구를 제공합니다.


왜 이것이 언급 한 동일한 API 한도 OP에 도달하지 않습니까?
lynxlynxlynx
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.