Làm thế nào để Geocode 300.000 địa chỉ trên bay?


18

Tôi có một cơ sở dữ liệu có 300.000 địa chỉ, được hiển thị trên bản đồ. Tôi biết nếu tôi mã địa lý tất cả các địa chỉ thì nó sẽ quá đắt đối với tôi. Vì vậy, tôi đã tự hỏi nếu có thể mã hóa địa chỉ địa chỉ khi đang bay / thời gian thực, khi người dùng chọn một địa chỉ (địa chỉ thuộc tính), nó sẽ tìm kiếm thông qua cơ sở dữ liệu và sau đó mã hóa địa chỉ địa chỉ và sau đó ánh xạ địa chỉ đó các thuộc tính khác.

Sẽ thật sự tốt nếu bạn có thể chia sẻ mã, khái niệm hoặc bất cứ điều gì. Nhân tiện, phần phụ trợ của tôi là trên mysql được Joomla hỗ trợ.


Tôi thường sử dụng khả năng mã hóa địa lý ArcGIS để mã hóa địa lý số lượng lớn địa chỉ. Ngoài ra, tôi thực sự quan tâm đến các quy trình được giải thích ở đây, đặc biệt, muốn kiểm tra tập lệnh python để mã hóa địa chỉ các địa chỉ bằng Google, sau đó so sánh chúng với những gì tôi đã nhận được từ ArcGIS. Thật không may, dường như tôi không thể tìm thấy tất cả các tập tin và tập lệnh liên quan ở những nơi khác nhau. Sẽ rất cảm kích nếu ai đó vui lòng gửi cho tôi tất cả các tập lệnh trong một tệp zip hoặc bất kỳ hướng dẫn từng bước nào. Tôi đã thử sử dụng nó và nhận được một số phản hồi cho bạn, nhưng tôi đã không thành công
Housh

Câu trả lời:


15

Mehul, tôi từng làm việc trong ngành xác minh địa chỉ với một công ty tên là SmartyStreets. Có rất nhiều dịch vụ mã hóa địa lý ngoài kia, nhưng chỉ một số ít sẽ hỗ trợ xử lý hàng loạt với khối lượng bạn yêu cầu. (Google và những người khác không cho phép sử dụng hàng loạt API của họ hoặc lưu trữ / lưu trữ kết quả.)

Nếu bạn truy cập cơ sở dữ liệu MySQL của mình và thực hiện xuất bảng chứa địa chỉ, hãy lưu nó dưới dạng tệp CSV chẳng hạn. Sau đó, bạn có thể xử lý nó bằng công cụ web SmartyList hoặc công cụ dòng lệnh . Như tôi đã nói, có một số dịch vụ ngoài đó, nhưng bạn sẽ muốn một cái gì đó, tôi cho rằng, cũng xác minh sự tồn tại của địa chỉ (do đó là lý do cho mã hóa địa lý) - nếu địa chỉ sai hoặc không đầy đủ, thì kết quả mã hóa địa lý cũng vậy. . Chỉ có một vài dịch vụ làm điều này.

LiveAddress là một dịch vụ được chứng nhận CASS bởi USPS. Có một vài nghiên cứu ngoài kia, nhưng bạn muốn một cái gì đó "nhanh chóng" / nhanh chóng và không tốn kém vì vậy một lần nữa tôi khuyên bạn nên LiveAddress. Nó sẽ không chỉ xác minh địa chỉ mà còn làm như bạn yêu cầu cung cấp thông tin lat / lon và độ chính xác của kết quả mã hóa địa lý. Tất cả đều dựa trên web và sẽ xử lý hàng chục triệu bản ghi ngay lập tức (xem câu hỏi này là tài liệu tham khảo ).

Nếu bạn cần thêm địa chỉ mã địa lý khi người dùng đang tương tác, LiveAddress cũng có phiên bản API có thể cắm vào bất cứ thứ gì và nó cũng hỗ trợ xử lý hàng loạt nhanh chóng, nhưng được trả tiền dưới dạng đăng ký, không phải là một lần thanh toán.


Không quen thuộc với SmartyStreets, có vẻ đầy hứa hẹn, cảm ơn vì đã ngẩng cao đầu.
Derek Swingley

API LiveAddress sẽ thực hiện 300.000 trong khoảng 5-10 phút. Dịch vụ LiveAddress for Lists (tải lên danh sách để xử lý) mất 15-20 phút. Cả hai khá nhanh. Dịch vụ Danh sách sẽ không yêu cầu bạn viết bất kỳ mã nào.
Jeffrey

2
SmartyStreets chỉ mã hóa địa lý cho Hoa Kỳ?
Mapperz

Tôi có dữ liệu cho Singapore nó sẽ hoạt động? Nếu không có bất kỳ hướng nào bạn có thể cho tôi ????
dùng1089553

Có nhiều quy tắc bản quyền với Google Bing và các nhà cung cấp khác. Bạn không xuất dữ liệu!

11

Nếu bạn thích Python, bạn có thể sử dụng API GeoPy , kết hợp với các ràng buộc GDAL Python hoặc Fiona và tạo một tập lệnh rất cơ bản như thế này để chuyển đổi địa chỉ thành shapefile.

Điều này sẽ định vị địa lý một tệp có tên 'địa chỉ_to_geocode', tạo ra một shapefile đầu ra có tên 'myDefput.shp' trong thư mục myDefput:

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

Tệp được cho là chỉ có một dòng cho một địa chỉ, ví dụ như:

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

Ở đây tôi đang sử dụng Google API, nhưng với GeoPy là rất cơ bản để chuyển sang API khác biệt, như Yahoo!, GeoNames hoặc MapPoint .


Điều đó thật tuyệt! Cảm ơn người đàn ông! Dù sao, hiện tại (01/2016), 'geocoders.Google ()' nên được đổi thành 'geocoders.GoogleV3 ()' như trong geopy.readthedocs.org/en/1.11.0
umbe1987

1

Một tùy chọn khác giải quyết vấn đề của bạn là nhập dữ liệu của bạn vào các bảng tổng hợp và đặt trường địa chỉ làm vị trí. Sau đó, nó sẽ mã hóa địa lý các điểm tự động. Khi hoàn thành, bạn có thể xuất dữ liệu dưới dạng KML.

Hoặc bên ngoài, bạn có thể viết một tập lệnh php để sử dụng trình mã hóa địa lý yahoo có giới hạn 50 000 bản ghi, vì vậy sớm hay muộn bạn sẽ có tất cả các điểm được mã hóa trong cơ sở dữ liệu của mình.

Tôi hy vọng điều này sẽ giúp!


cảm ơn tamas nhưng tôi không muốn lấy kml và sau đó lấy thông tin từ đó và sau đó đến m db. Tôi thích ý tưởng về mã hóa địa lý yahoo nhưng tôi không chắc lắm về độ chính xác của nó, vì tôi chưa bao giờ sử dụng yahoo để lập bản đồ. Xin vui lòng cho tôi biết nếu bạn có bất kỳ kịch bản được viết hoặc một số điều. Đây là một trợ giúp tuyệt vời
user1089553 22/03/2016

Hãy nhớ rằng sử dụng trình mã hóa địa lý của Yahoo (hoặc Google, cho vấn đề đó) với các truy vấn tự động hoặc không hiển thị bản đồ sẽ vi phạm ĐKDV ...
Matt

Theo tôi biết, không phải là nếu bạn trình bày đầu ra trên bản đồ. Đúng nếu tôi đã sai lầm!
EZMapdesign

@Tama Loại. Tuy nhiên, hãy xem điều này: developers.google.com/maps/terms#section_10_1_3
Matt


0

Có thể không phải là câu trả lời tốt nhất cho câu hỏi của bạn nhưng bạn có thể thử BatchGeo. Phiên bản miễn phí sẽ khiến bạn đau khổ rất nhiều, nhưng vẫn đủ tốt cho công việc của tôi. Mặc dù, chúng tôi đã mua phiên bản pro.

Thủ thuật để lấy tọa độ từ tệp KML là nhập tệp này vào ArcGIS sau này.


Cảm ơn, bạn có thể cho tôi biết làm thế nào để tôi làm BatchGeo không, bạn cũng có thể biết tên của phiên bản miễn phí (tôi đã thử dùng Google Map api v3). Điều này cũng có nghĩa là tôi phải lưu trữ các giá trị Lat / Long trong cơ sở dữ liệu của mình để ánh xạ nó. Đây là những gì tôi dự định làm ở nơi đầu tiên.
dùng1089553

Với BatchGeo, bạn sẽ phải nhập KML vào cơ sở dữ liệu của mình sau đó trích xuất tọa độ, tôi không biết cách nào khác vì Google cấm cung cấp tọa độ. Về yahoo, trải nghiệm của tôi với Thổ Nhĩ Kỳ không thực sự sáng sủa. Hầu hết các nước đang phát triển đều rời khỏi phạm vi của Yahoo. Anil.
Anıl Çelik

0

Tôi đã sử dụng thành công bản đồ địa lý sử dụng dịch vụ web mã hóa địa lý của Google. Nó hoạt động hoàn hảo cho tối đa 2k điểm mỗi 24 giờ.


0

Matej, Thats vì Google API cho phép kéo tới 2,5k mỗi ngày.
Về giải pháp Geo, lô chưa được tìm thấy để hỗ trợ vì theo đánh giá của tôi về mã python địa lý, nó dường như mở kết nối mỗi khi anh ta yêu cầu một dây nối mới, 300k có thể sẽ bị kẹt vĩnh viễn (có thể có lỗi 400).
Chơi với Poligons nên thực hiện mẹo nhưng điều đó phụ thuộc vào khu vực 'Sân chơi' của bạn là gì, nếu đó là 1 quốc gia hoặc n quốc gia.
Đối với 1 quốc gia, đa giác sẽ hoạt động khá tốt.
Đối với n quốc gia, giải pháp sẽ không hoạt động vì bộ sưu tập sẽ mất nhiều thời gian hơn bất cứ khi nào bạn thêm quốc gia khác. Aproch tốt nhất để làm điều đó là tải lười biếng.
=> bắt đầu với ý tưởng đa giác, mọi thứ ở một quốc gia khác, tạo một bảng cơ sở dữ liệu lớn để chứa dữ liệu, cuối cùng bạn sẽ giữ dữ liệu bạn cần tôi cho là.


0

Nếu bạn muốn làm điều đó với PHP - MySQL thì đây là một giải pháp hiệu quả với tôi:

<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

Hãy thử api mã hóa địa lý này . Nó miễn phí cho việc sử dụng nhỏ nhưng nếu bạn muốn nhiều hơn họ sẽ khiến bạn phải trả tiền. Tuy nhiên, nó rẻ và bạn có thể xử lý dễ dàng như vậy, tôi xử lý hàng triệu mỗi tháng thông qua chúng.


0

Bạn có thể lưu dữ liệu của mình dưới dạng tệp văn bản (một bản ghi trên mỗi dòng) sau đó hàng loạt mã địa lý sử dụng dịch vụ này: http://geocode.xyz/batch (hoạt động cho hầu hết các quốc gia châu Âu)

hoặc, bạn có thể viết mã của riêng mình để truy cập API REST / JSON: http://geocode.xyz/api (nó miễn phí cho việc tra cứu không giới hạn)


0

Sử dụng các công cụ Mappointing (Công cụ mã hóa bản đồ | Công cụ mã hóa hàng loạt ( http://www.mappointing.com/ )) Trong công cụ này, bạn có thể xử lý dữ liệu bằng khóa API miễn phí của Google map. Và công cụ này cũng đang cung cấp công cụ tìm kiếm Tính toán & Địa điểm.


Tại sao điều này không đạt được giới hạn API tương tự OP đã đề cập?
lynxlynxlynx
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.