Geocode 300,000 ที่อยู่ได้อย่างไร


18

ฉันมีฐานข้อมูลที่มีที่อยู่ 300,000 ซึ่งจะแสดงบนแผนที่ ฉันรู้ว่าถ้าฉันระบุที่อยู่ทางภูมิศาสตร์ทั้งหมดมันจะแพงเกินไปสำหรับฉัน ดังนั้นฉันจึงสงสัยว่าเป็นไปได้หรือไม่ที่จะระบุที่อยู่ทางภูมิศาสตร์ในการบิน / เรียลไทม์เมื่อผู้ใช้จะเลือกที่อยู่ (ที่อยู่สถานที่ให้บริการ) มันจะค้นหาผ่านฐานข้อมูลและจากนั้นรหัสทางภูมิศาสตร์ที่อยู่ คุณลักษณะอื่น ๆ

มันจะดีจริงๆถ้าคุณสามารถแบ่งปันรหัสแนวคิดหรืออะไรก็ได้ แบ็กเอนด์ของฉันอยู่บน mysql ที่สนับสนุนโดย Joomla


โดยทั่วไปฉันใช้ความสามารถทางภูมิศาสตร์ของ ArcGIS เพื่อเข้ารหัสที่อยู่จำนวนมาก นอกจากนี้ฉันสนใจจริงๆเกี่ยวกับกระบวนการที่อธิบายที่นี่โดยเฉพาะอย่างยิ่งต้องการทดสอบสคริปต์ python เพื่อเข้ารหัสที่อยู่ทางภูมิศาสตร์โดยใช้ Google จากนั้นเปรียบเทียบกับสิ่งที่ฉันได้รับจาก ArcGIS น่าเสียดายที่ฉันไม่สามารถค้นหาไฟล์และสคริปต์ที่เกี่ยวข้องทั้งหมดที่อยู่ในสถานที่ต่างกัน มันจะเป็นที่นิยมมากถ้ามีคนโปรดส่งสคริปต์ทั้งหมดในไฟล์ zip หนึ่งไฟล์หรือคำแนะนำทีละขั้นตอน ฉันพยายามใช้และรับความคิดเห็นจากคุณ แต่ฉันไม่ประสบความสำเร็จ
Housh

คำตอบ:


15

ฉันเคยทำงานในอุตสาหกรรมการตรวจสอบที่อยู่กับ บริษัท ที่เรียกว่า SmartyStreets มีบริการ Geocoding อยู่มากมาย แต่มีเพียงไม่กี่แห่งเท่านั้นที่จะรองรับการประมวลผลแบบแบตช์ในปริมาณที่คุณต้องการ (Google และคนอื่น ๆ ไม่อนุญาตให้ใช้ API ของตนจำนวนมากหรือเก็บ / แคชผลลัพธ์)

หากคุณไปยังฐานข้อมูล MySQL ของคุณและทำการส่งออกตารางซึ่งมีที่อยู่ให้บันทึกเป็นไฟล์ CSV จากนั้นคุณสามารถดำเนินการได้โดยใช้ SmartyList เครื่องมือบนเว็บหรือบรรทัดคำสั่งเครื่องมือ อย่างที่ฉันบอกว่ามีบริการหลายอย่างอยู่ที่นั่น แต่คุณต้องการอะไรฉันจะตรวจสอบว่ามีที่อยู่เช่นกัน (ด้วยเหตุผลของ geocoding) - ถ้าที่อยู่ไม่ถูกต้องหรือไม่สมบูรณ์ดังนั้นผลลัพธ์ทางภูมิศาสตร์ของ geocoding คืออะไร . บริการเพียงไม่กี่ทำเช่นนี้

LiveAddress เป็นบริการที่รับรองโดย USPS มีงานวิจัยของคุณอยู่เล็กน้อย แต่คุณต้องการบางอย่าง "แบบทันที" / รวดเร็วและราคาไม่แพงฉันขอแนะนำ LiveAddress อีกครั้ง มันจะไม่เพียง แต่ยืนยันที่อยู่ แต่ทำตามที่คุณต้องการซึ่งเป็นข้อมูล lat / lon และความแม่นยำของผลลัพธ์ geocoding มันคือทั้งหมดบนเว็บและจะประมวลผลหลายสิบล้านระเบียนในเวลาไม่นาน (ดูคำถามนี้เป็นข้อมูลอ้างอิง )

หากคุณต้องการที่อยู่ทางภูมิศาสตร์เพิ่มเติมในขณะที่ผู้ใช้กำลังโต้ตอบ LiveAddress ยังมีรุ่นAPIซึ่งสามารถเชื่อมต่อกับอะไรก็ได้และยังรองรับการประมวลผลแบบแบตช์ทันที แต่จ่ายเป็นการสมัครสมาชิกไม่ใช่แบบครั้งเดียว การชำระเงิน


ไม่คุ้นเคยกับ SmartyStreets ดูมีแนวโน้มขอบคุณสำหรับหัวขึ้น
Derek Swingley

LiveAddress API จะทำ 300,000 ในเวลาประมาณ 5-10 นาที บริการ LiveAddress สำหรับรายการ (อัปโหลดรายการเพื่อดำเนินการ) ใช้เวลา 15-20 นาที ทั้งสวยทั้งรวดเร็ว บริการรายการจะไม่ต้องการให้คุณเขียนรหัสใด ๆ
Jeffrey

2
SmartyStreets รหัสภูมิศาสตร์สำหรับสหรัฐอเมริกาหรือไม่
Mapperz

ฉันมีข้อมูลที่เป็นของสิงคโปร์จะใช้งานได้หรือไม่ หากไม่มีทิศทางคุณสามารถให้ฉัน ????
user1089553

มีกฎลิขสิทธิ์มากมายกับ Google Bing และผู้ให้บริการอื่น ๆ คุณไม่ส่งออกข้อมูล!

11

ถ้าคุณชอบ Python คุณสามารถใช้GeoPy APIรวมกับการผูก GDAL PythonหรือFionaและสร้างสคริปต์พื้นฐานแบบนี้สำหรับการแปลงที่อยู่ไปยังจุดรูปร่างไฟล์

สิ่งนี้จะระบุตำแหน่งทางภูมิศาสตร์ไฟล์ชื่อ 'addresses_to_geocode' โดยสร้างรูปร่างไฟล์ผลลัพธ์ชื่อ 'my_output.shp' ในโฟลเดอร์ 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')

ไฟล์ควรมีเพียงบรรทัดสำหรับที่อยู่เดียวเช่น:

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

นี่ฉันกำลังใช้ Google API แต่มีGeoPy เป็นพื้นฐานมากเพื่อสลับไปยัง differents API เช่น Yahoo !, GeoNames หรือ MapPoint


มันเยี่ยมมาก! ขอบคุณคน! อย่างไรก็ตามในปัจจุบัน (01/2016) ควรเปลี่ยน 'geocoders.Google ()' เป็น 'geocoders.GoogleV3 ()' เช่นเดียวกับในgeopy.readthedocs.org/en/1.11.0
umbe1987

1

ตัวเลือกอื่นที่ช่วยแก้ปัญหาของคุณคือการนำเข้าชุดข้อมูลไปยังฟิวชั่นตารางและตั้งค่าฟิลด์ที่อยู่เป็นที่ตั้ง จากนั้นมันจะระบุพิกัดของจุดโดยอัตโนมัติ เมื่อเสร็จแล้วคุณสามารถส่งออกข้อมูลเป็น KML

หรือในทางกลับกันคุณสามารถเขียนสคริปต์ php เพื่อใช้ประโยชน์จาก geocoder yahoo ที่มีการ จำกัด 50,000 เรคคอร์ดดังนั้นไม่ช้าก็เร็วคุณจะได้คะแนนทั้งหมด geocoded ในฐานข้อมูลของคุณ

ฉันหวังว่านี่จะช่วยได้!


ขอบคุณ tamas แต่ฉันไม่ต้องการรับ kml แล้วดึงข้อมูลจากที่นั่นแล้วไปที่ m db ฉันชอบความคิดเกี่ยวกับ geocoding ของ yahoo แต่ฉันก็ไม่แน่ใจในความแม่นยำของมันเพราะฉันไม่เคยใช้ yahoo ในการทำแผนที่ โปรดแจ้งให้เราทราบหากคุณมีสคริปต์ที่เขียนหรือบางสิ่ง นี่คือความช่วยเหลือที่ดี
user1089553

โปรดทราบว่าการใช้ Geocoder ของ 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 ห้ามไม่ให้ใช้พิกัด เกี่ยวกับ yahoo ประสบการณ์ในตุรกีของฉันไม่ค่อยสดใส ประเทศกำลังพัฒนาส่วนใหญ่อยู่นอกขอบเขตของ Yahoo คราม
AnılÇelik

0

ฉันใช้ Geopy ที่ใช้บริการเว็บ Geocoding ของ Google สำเร็จแล้ว มันทำงานได้อย่างสมบูรณ์แบบมากถึง 2k จุดต่อ 24 ชั่วโมง


0

Matej, Thats เพราะ Google API อนุญาตให้ดึงได้สูงสุด 2.5k ต่อวัน
เกี่ยวกับการแก้ปัญหาทางภูมิศาสตร์แบทช์ยังไม่ได้รับการสนับสนุนนั่นเป็นเพราะจากการตรวจสอบของฉันของรหัสทางภูมิศาสตร์หลามมันดูเหมือนว่าจะเปิดการเชื่อมต่อทุกครั้งที่เขาขอ cordinate ใหม่ 300k อาจจะติดอยู่ตลอดกาล
เล่นกับ Poligons ควรทำเคล็ดลับ แต่มันขึ้นอยู่กับพื้นที่ 'Play Ground' ของคุณคืออะไรถ้าเป็น 1 ประเทศหรือ n ประเทศ
สำหรับ 1 ประเทศรูปหลายเหลี่ยมควรทำงานได้ค่อนข้างดี
สำหรับ n ประเทศโซลูชันจะไม่ทำงานเนื่องจากการรวบรวมจะใช้เวลานานขึ้นเมื่อคุณเพิ่มประเทศอื่น aproch ที่ดีที่สุดที่จะทำคือการโหลดขี้เกียจ
=> เริ่มต้นด้วยแนวคิดรูปหลายเหลี่ยมทุกสิ่งในประเทศอื่นสร้างตารางฐานข้อมูลขนาดใหญ่เพื่อเก็บข้อมูลในที่สุดคุณจะเก็บข้อมูลที่คุณต้องการ


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

ลองใช้geocoding apiนี้ ฟรีสำหรับการใช้งานขนาดเล็ก แต่ถ้าคุณต้องการมากกว่านี้ก็จะทำให้คุณจ่ายมากขึ้น มันมีราคาถูกและคุณสามารถดำเนินการได้อย่างง่ายดายฉันสามารถประมวลผลได้หลายล้านต่อเดือน


0

คุณสามารถบันทึกข้อมูลของคุณเป็นไฟล์ข้อความ (หนึ่งระเบียนต่อบรรทัด) จากนั้นทำการเข้ารหัสทางภูมิศาสตร์โดยใช้บริการนี้: http://geocode.xyz/batch (เหมาะสำหรับประเทศในยุโรปส่วนใหญ่)

หรือคุณสามารถเขียนรหัสของคุณเองเพื่อเข้าถึง REST / JSON API: http://geocode.xyz/api (ฟรีสำหรับการค้นหาที่ไม่ จำกัด )


0

ใช้เครื่องมือการแมป (ชี้แผนที่ | เครื่องมือ Geocoding แบทช์ ( http://www.mappointing.com/ )) ในเครื่องมือนี้คุณสามารถประมวลผลข้อมูลโดยใช้คีย์ API แผนที่ฟรีของ Google และเครื่องมือนี้ยังให้บริการการคำนวณระยะทางและเครื่องมือค้นหาสถานที่อีกด้วย


เหตุใดสิ่งนี้จึงไม่ถึงขีด จำกัด API เดียวกันที่กล่าวถึง OP
lynxlynxlynx
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.