Bagaimana cara Geocode 300.000 alamat dengan cepat?

18

Saya memiliki database yang memiliki 300.000 alamat, yang akan ditampilkan di peta. Saya tahu jika saya geo-kode semua alamat itu akan terlalu mahal bagi saya. Jadi saya bertanya-tanya apakah mungkin untuk geo-code alamat dengan cepat / realtime, ketika pengguna akan memilih alamat (alamat properti) itu akan mencari melalui database dan kemudian geo-code alamat dan kemudian memetakannya dengan atribut lainnya.

Akan sangat menyenangkan jika Anda dapat membagikan kode, konsep, atau apa pun. Ngomong-ngomong, backend saya ada di mysql yang didukung oleh Joomla.

pengguna1089553
sumber
Saya biasanya menggunakan kemampuan geocoding ArcGIS untuk membuat geocode sejumlah besar alamat. Juga, saya benar-benar tertarik dengan proses yang dijelaskan di sini, khususnya, seperti untuk menguji skrip python untuk melakukan geocode alamat menggunakan Google, kemudian membandingkannya dengan apa yang saya dapatkan dari ArcGIS. Sayangnya, menurut saya saya tidak dapat menemukan semua file dan skrip terkait yang berada di tempat yang berbeda. Akan sangat dihargai jika seseorang tolong kirimi saya semua skrip dalam satu file zip atau instruksi langkah demi langkah. Saya sudah mencoba menggunakannya dan mendapatkan umpan balik kepada Anda, tetapi saya tidak berhasil
Housh

Jawaban:

15

Mehul, saya dulu bekerja di industri verifikasi alamat dengan perusahaan bernama SmartyStreets. Ada banyak layanan geocoding di luar sana, tetapi hanya sedikit yang akan mendukung pemrosesan batch dengan volume yang Anda butuhkan. (Google dan lainnya tidak mengizinkan sebagian besar penggunaan API atau menyimpan / menyimpan hasil caching mereka.)

Jika Anda pergi ke database MySQL Anda dan melakukan ekspor tabel Anda yang berisi alamat, simpan itu sebagai file CSV misalnya. Anda kemudian dapat memprosesnya menggunakan alat web SmartyList atau alat baris perintah . Seperti yang saya katakan, ada beberapa layanan di luar sana, tetapi Anda akan menginginkan sesuatu, saya kira, yang memverifikasi keberadaan alamat juga (maka alasan geocoding) - jika alamat itu salah atau tidak lengkap, demikian juga hasil geocoding . Hanya beberapa layanan yang melakukan ini.

LiveAddress adalah layanan yang disertifikasi CASS oleh USPS. Ada beberapa di luar sana jadi lakukan riset, tetapi Anda menginginkan sesuatu "on-the-fly" / cepat dan murah jadi sekali lagi saya sarankan LiveAddress. Itu tidak hanya akan memverifikasi alamat tetapi kemudian melakukan apa yang Anda butuhkan yang menyediakan informasi lat / lon dan juga ketepatan hasil geocoding. Semuanya berbasis web dan akan memproses puluhan juta rekaman dalam waktu singkat (lihat pertanyaan ini sebagai referensi ).

Jika Anda memiliki kebutuhan lebih lanjut untuk melakukan geocode alamat ketika pengguna berinteraksi, LiveAddress juga memiliki versi API yang dapat menyambungkan apa saja dan juga mendukung pemrosesan batch on-the-fly, tetapi dibayar sebagai langganan, bukan satu kali pembayaran.

Mat
sumber
Tidak terbiasa dengan SmartyStreets, terlihat menjanjikan, terima kasih atas perhatiannya.
Derek Swingley
API LiveAddress akan melakukan 300.000 dalam waktu sekitar 5-10 menit. Layanan LiveAddress untuk Daftar (mengunggah daftar untuk diproses) membutuhkan waktu 15-20 menit. Keduanya cukup cepat. Layanan Daftar tidak akan mengharuskan Anda untuk menulis kode apa pun.
Jeffrey
2
SmartyStreets hanya membuat geocode untuk AS?
Mapperz
Saya memiliki data untuk Singapura apakah akan berfungsi? Jika tidak ada petunjuk yang bisa Anda berikan kepada saya ????
user1089553
Ada banyak aturan hak cipta dengan Google Bing dan penyedia lainnya. Anda tidak mengekspor data!
11

Jika Anda suka Python, Anda bisa menggunakan GeoPy API , dikombinasikan dengan binding GDAL Python atau Fiona , dan membuat skrip yang sangat mendasar seperti ini untuk mengonversi alamat ke titik shapefile.

Ini akan melakukan geolokasi file bernama 'address_to_geocode', membuat shapefile keluaran bernama 'my_output.shp' di folder my_output:

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

File seharusnya hanya memiliki satu baris untuk satu alamat, seperti misalnya:

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

Di sini saya menggunakan Google API, tetapi dengan GeoPy sangat mendasar untuk beralih ke API differents, seperti Yahoo !, GeoNames, atau MapPoint .

capooti
sumber
Ini bagus! Terima kasih sobat! Bagaimanapun, saat ini (01/2016), 'geocoder. Google ()' harus diubah menjadi 'geocoder. GoogleV3 ()' seperti di geopy.readthedocs.org/en/1.11.0
umbe1987
1

Pilihan lain untuk menyelesaikan masalah Anda adalah mengimpor dataset Anda ke tabel fusi dan mengatur bidang alamat sebagai lokasi. Maka itu akan geocode poin secara otomatis. Setelah selesai, Anda dapat mengekspor data sebagai KML.

Atau .. secara alternatif, Anda dapat menulis skrip php untuk menggunakan geocoder yahoo yang memiliki batas 50.000 catatan, jadi cepat atau lambat Anda akan memiliki semua poin Anda di-geocode dalam database Anda.

Saya harap ini membantu!

Desain EZMap
sumber
terima kasih tamas tetapi saya tidak ingin mendapatkan kml dan kemudian mengambil informasi dari sana dan kemudian ke m db. Saya suka ide geocoding yahoo tetapi saya tidak terlalu yakin dengan keakuratan yang dimilikinya, karena saya tidak pernah menggunakan yahoo untuk pemetaan. Tolong beri tahu saya jika Anda memiliki skrip yang ditulis atau sesuatu. Ini sangat membantu
user1089553
Perlu diingat bahwa menggunakan geocoder Yahoo (atau Google, dalam hal ini) dengan permintaan otomatis atau tanpa menunjukkan peta akan melanggar TOS ...
Matt
Sejauh yang saya tahu, bukan jika Anda menyajikan output pada peta. Koreksi saya jika saya salah!
EZMapdesign
@Tamas Kind of. Lihat ini, namun: developers.google.com/maps/terms#section_10_1_3
Matt
0

Mungkin bukan jawaban terbaik untuk pertanyaan Anda tetapi Anda dapat mencoba BatchGeo. Versi gratis akan membuat Anda banyak menderita, tetapi masih cukup baik untuk pekerjaan saya. Padahal, kami telah membeli versi pro.

Trik untuk mendapatkan koordinat dari file KML adalah dengan mengimpornya ke ArcGIS nanti.

Anıl Çelik
sumber
Terima kasih, dapatkah Anda memberi tahu saya bagaimana cara melakukan BatchGeo, apakah Anda juga tahu nama-nama versi gratis (saya sedang mencoba Google Map api v3). Juga apakah ini berarti bahwa saya harus menyimpan nilai Lat / Long dalam database saya untuk memetakannya. Inilah yang ingin saya lakukan sejak awal.
user1089553
Dengan BatchGeo, Anda harus mengimpor KML ke database Anda kemudian mengekstrak koordinat, saya tidak tahu cara lain selain Google melarang untuk memberikan koordinat. Tentang yahoo, pengalaman saya dengan Turki tidak terlalu cerah. Sebagian besar negara berkembang tidak termasuk dalam ruang lingkup Yahoo. Anil.
Anıl Çelik
0

Saya telah berhasil menggunakan geopy yang menggunakan layanan web geocoding Google. Ini bekerja dengan sempurna hingga 2k poin per 24 jam.

Matej
sumber
0

Matej, Itu karena Google API memungkinkan untuk menarik hingga 2.5k per hari.
Tentang solusi Geo, batch belum ditemukan didukung itu karena dari ulasan saya tentang kode geo python itu tampaknya membuka koneksi setiap kali dia meminta koordinat baru, 300k mungkin akan macet selamanya (mungkin dengan kesalahan 400).
Bermain dengan Poligons harus melakukan trik tetapi tergantung pada area 'Play ground' Anda, apakah itu 1 negara atau negara.
Untuk 1 negara, poligon harus bekerja dengan sangat baik.
Untuk n negara solusi tidak akan berfungsi karena pengumpulan akan memakan waktu lebih lama kapan saja Anda menambahkan negara lain. Cara terbaik untuk melakukannya adalah memuat dengan malas.
=> mulai dengan ide poligon, setiap hal di negara lain, buat tabel database besar untuk menyimpan data, akhirnya Anda akan menyimpan data yang Anda butuhkan saya kira.

Benjaminel
sumber
0

Jika Anda ingin melakukannya dengan PHP - MySQL di sini adalah solusi yang bekerja untuk saya:

<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>
pancy1
sumber
0

Coba api geocoding ini . Ini gratis untuk penggunaan kecil tetapi jika Anda ingin lebih banyak, mereka membuat Anda membayar. Namun itu murah dan Anda dapat memproses dengan mudah, saya memproses jutaan per bulan melalui mereka.

John M.
sumber
0

Anda dapat menyimpan data Anda sebagai file teks (satu catatan per baris) kemudian batch geocode menggunakan layanan ini: http://geocode.xyz/batch (berfungsi untuk sebagian besar negara Eropa)

atau, Anda dapat menulis kode Anda sendiri untuk mengakses REST / JSON API: http://geocode.xyz/api (gratis untuk pencarian tanpa batas)

Ervin Ruci
sumber
0

Gunakan alat Mappointing (Pointing map | Batch Geocoding Tool ( http://www.mappointing.com/ )) Dalam alat ini Anda dapat memproses data menggunakan kunci API gratis peta Google. Dan juga alat ini menyediakan perhitungan Jarak & alat pencarian Place.

Debasis Sahu
sumber
Mengapa ini tidak mencapai OP API batas yang sama yang disebutkan?
lynxlynxlynx