300,000のアドレスをその場でジオコーディングする方法は?

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

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

コメント

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

回答

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

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

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

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

コメント

  • SmartyStreetsに精通していない、有望に見える、ありがとう
  • LiveAddress APIは、約5〜10分で300,000を実行します。 LiveAddress for Listsサービス(処理のためにリストをアップロードする)には15〜20分かかります。どちらもかなりスピーディーです。リストサービスでは、コードを記述する必要はありません。
  • SmartyStreetsは米国のジオコードのみですか?
  • シンガポール向けのデータがありますか?指示がない場合は、私に教えてください????
  • SmartyStreetsは、現在、国際住所の確認を提供しています。 @ user1089553

回答

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

これにより、「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") 

ファイルには、たとえば次のように、単一のアドレスの1行だけが含まれている必要があります。

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

ここではGoogleAPIを使用していますが、 GeoPyは、Yahoo!、GeoNames、MapPointなどのさまざまなAPIに切り替えるための非常に基本的なものです

コメント

回答

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

または..または、50000レコードの制限があるyahooジオコーダーを利用するphpスクリプトを作成することもできます。遅かれ早かれデータベースにすべてのポイントがジオコーディングされます。

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

コメント

  • tamasに感謝しますがkmlを取得して、そこから情報を取得してからmdbに取得したくありません。私はyahooジオコーディングのアイデアが好きですが、マッピングにyahooを使用したことがないため、その精度についてはあまり確信がありません。スクリプトを書いたことがあれば教えてください。これは非常に役立ちます
  • 自動クエリを使用して、または地図を表示せずにYahoo(またはGoogle)ジオコーダーを使用すると、TOSに違反することに注意してください…
  • これまでのところ私が知っているように、それはあなたが地図上に出力を提示する場合ではありません。私が間違っている場合は訂正してください!
  • @Tamas種類。ただし、これを参照してください: developers.google.com/maps/terms#section_10_1_3

回答

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

回答

これまで使用した中で最も優れた最も簡単なジオコーダー https://pypi.python.org/pypi/geocoder/1.8.0 ビングマップ、グーグルマップ、OSMなど。

回答

質問に対する最良の回答ではないかもしれませんが、 BatchGeoを試してみてください。無料バージョンでは多くの苦労がありますが、それでも私の仕事には十分でした。ただし、プロバージョンを購入しました。

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

コメント

  • ありがとうございます。BatchGeoの実行方法を教えてください。また、無料バージョンの名前も教えてください。 (私はGoogle Map api v3を試していました)これはまた、マッピングするには、Lat / Long値をデータベースに保存する必要があります。これは私が最初に意図したことです。
  • BatchGeoでは、KMLをデータベースにインポートしてから座標を抽出する必要があります。Googleが座標の提供を禁止しているため、他の方法はわかりません。 yahooについては、トルコでの私の経験はそれほど明るくありません。ほとんどの発展途上国は、Yahoo ‘の範囲から除外されています。 Anil。

回答

Matej、これはGoogleAPIで1日あたり最大2.5kをプルできるためです。
Geoソリューションについては、バッチがまだサポートされていないことがわかりました。これは、geo pythonコードのレビューから、新しい座標を要求するたびに接続が開かれるようであるため、300kはおそらく永久にスタックします(おそらくエラー400)。
ポリゴンで遊ぶとうまくいくはずですが、1か国かnか国の場合、「プレイグラウンド」エリアはどこかによって異なります。
1か国の場合、ポリゴンはかなりうまく機能するはずです。 。
nか国では、別の国を追加するたびにコレクションに時間がかかるため、ソリューションは機能しません。それを行うための最善の方法は、遅延ロードです。
=>ポリゴンのアイデアから始めて、別の国のすべてのものを国、データを保持するための大きなデータベーステーブルを作成すると、最終的には必要なデータを保持できると思います。

回答

PHPでそれをやりたいのなら-MySQLはここにある解決策ですrked for me:

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

回答

これを試してくださいジオコーディングAPI 。少量の使用では無料ですが、もっと欲しい場合は有料になります。ただし、安価で簡単に処理できるので、月に数百万を処理します。

回答

マップポインティングツールを使用する(マップポインティング|バッチジオコーディングツール( http://www.mappointing.com/ ))このツールでは、Googleマップの無料APIキーを使用してデータを処理できます。また、このツールは、距離計算&場所検索ツールを提供します。

コメント

  • なぜ’これが前述の同じAPI制限OPに達しないのですか?

回答

データをテキストファイル(1行に1レコード)として保存し、次のサービスを使用してバッチジオコーディングできます: http://geocode.xyz/batch (ほとんどのヨーロッパ諸国で機能します)

または、独自のコードを記述してREST /にアクセスできます。 JSON API: (無制限のルックアップは無料)

コメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です