オンザフライで300,000の住所をジオコーディングする方法は?


18

私は地図上に表示される300,000のアドレスを持つデータベースを持っています。すべての住所をジオコーディングすれば、費用がかかりすぎることがわかります。そのため、ユーザーが住所(プロパティの住所)を選択してデータベースを検索し、住所をジオコーディングしてからマッピングすることで、その場でリアルタイムに住所をジオコーディングできるかどうか疑問に思いましたその他の属性。

コード、コンセプトなどを共有できたら本当にいいですね。ちなみに、私のバックエンドはJoomlaでサポートされているmysqlにあります。


通常、ArcGISジオコーディング機能を使用して、多数の住所をジオコーディングします。また、ここで説明されているプロセスに特に興味があります。特に、PythonスクリプトをテストしてGoogleを使用して住所をジオコーディングし、ArcGISから取得したものと比較したいです。残念ながら、別の場所にあるすべての関連ファイルとスクリプトを見つけることができないようです。誰かが私にすべてのスクリプトを1つのzipファイルで送信するか、ステップバイステップの説明を送っていただければ幸いです。私はそれを使用し、あなたにいくつかのフィードバックを得るためにしようとしましたが、私はsuccessfuませんでした
Housh

回答:


15

Mehul、私はSmartyStreetsという会社で住所確認業界で働いていました。そこには多くのジオコーディングサービスがありますが、必要な量のバッチ処理をサポートするのはごくわずかです。(Googleや他のユーザーは、APIの一括使用や結果の保存/キャッシュを許可していません。)

MySQLデータベースに移動して、アドレスを含むテーブルのエクスポートを実行する場合は、たとえばCSVファイルとして保存します。その後、SmartyList Webツールまたはコマンドラインツールを使用して処理できます。私が言ったように、そこにはいくつかのサービスがありますが、アドレスの存在も検証するものが必要です(ジオコーディングの理由)-アドレスが間違っているか不完全である場合、ジオコーディングの結果もそうです。これを行うサービスはごくわずかです。

LiveAddressは、USPSによってCASS認定されたサービスです。そこにいくつかありますので、あなたの研究を行ってください、しかし、あなたは「オンザフライ」/迅速で安価な何かが欲しいので、再びLiveAddressをお勧めします。住所を確認するだけでなく、必要に応じて緯度/経度情報とジオコーディング結果の精度を提供します。すべてWebベースであり、数千万件のレコードをすぐに処理します(この質問を参照してください)。

ユーザーが対話しているときに住所をさらにジオコーディングする必要がある場合、LiveAddressには、ほぼすべてにプラグインできるAPIバージョンもあり、オンザフライでバッチ処理もサポートしますが、1回限りではなくサブスクリプションとして支払われます支払い。


SmartyStreetsに精通していませんが、有望なようです。
デレクスイングリー

LiveAddress APIは、約5〜10分で300,000を実行します。リストサービスのLiveAddress(処理のためにリストをアップロード)には15〜20分かかります。どちらもかなり高速です。リストサービスでは、コードを記述する必要はありません。
ジェフリー

2
SmartyStreetsは米国のジオコードのみですか?
マッパーズ

シンガポール向けのデータはありますか?指示がなければ、私に教えてください。
user1089553

Google Bingや他のプロバイダーには多くの著作権規則があります。データをエクスポートしません!

11

Pythonが好きなら、GeoPy APIをGDAL PythonバインディングまたはFionaと組み合わせて使用し、アドレスをポイントシェープファイルに変換するためのこのような非常に基本的なスクリプトを作成できます。

これにより、「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年1月)、「geocoders.Google()」は「geocoders.GoogleV3()」に変更する必要があります。これはgeopy.readthedocs.org/en/1.11.0
umbe1987

1

問題を解決する別のオプションは、データセットをフュージョンテーブルにインポートし、住所フィールドを場所として設定することです。次に、ポイントを自動的にジオコーディングします。それが完了したら、データをKMLとしてエクスポートできます。

または、PHPスクリプトを記述して、50 000レコードの制限があるyahooジオコーダーを使用できるため、遅かれ早かれ、すべてのポイントをデータベースにジオコーディングできます。

これがお役に立てば幸いです!


tamasに感謝しますが、私はkmlを取得し、そこから情報を取得してからm dbに取得したくないです。私はyahooジオコーディングのアイデアが好きですが、マッピングにyahooを使用したことがないため、yahooジオコーディングの精度についてはあまり確信がありません。スクリプトが書かれているか何かがあれば教えてください。これは大きな助けです
user1089553

...自動化されたクエリまたはマップを示すことなく、(そのことについて、またはグーグル)ジオコーダをヤフーを使用すると、TOSに違反することになりますことを心に留めておいてください
マット・

私の知る限り、マップに出力を表示するのはそうではありません。間違っている場合は修正してください!
EZMapdesign

@タマスの種類。ただし、developers.google.com
Matt


0

あなたの質問に対する最良の答えではないかもしれませんが、BatchGeoを試してみてください。無料版はあなたを苦しめますが、それでも私の仕事には十分でした。しかし、私たちはプロ版を購入しました。

KMLファイルから座標を取得するコツは、後でArcGISにインポートすることです。


ありがとう、どうやってBatchGeoをやるのか教えてくれますか、無料版の名前を知っていますか(Google Map api v3を試していました)。また、これは、マップに緯度/経度の値をデータベースに保存する必要があることを意味します。これは私が最初にやろうとしていたことです。
user1089553

BatchGeoを使用すると、KMLをデータベースにインポートしてから座標を抽出する必要があります。Googleが座標の提供を禁止しているため、他に方法はありません。ヤフーについて、トルコでの私の経験はそれほど明るくありません。ほとんどの発展途上国はヤフーの範囲外です。アニル。
アニルチェリク

0

GoogleジオコーディングWebサービスを使用するgeopyを正常に使用しています。24時間あたり最大2kポイントで完全に機能します。


0

Matej、これは、Google APIが1日あたり最大2.5kをプルできるためです。
Geoソリューションについては、バッチがまだサポートされていないことがわかっています。これは、geo pythonコードのレビューから、新しい座標を要求するたびに接続を開くように見えるためです。
Poligonsでプレイすればうまくいくはずですが、1かnか国であるかどうかに応じて、「プレイグラウンド」エリアが異なります。
1か国では、ポリゴンはかなりうまく機能するはずです。
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

データをテキストファイル(1行に1レコード)として保存し、次のサービスを使用してジオコーディングをバッチ処理できます: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.