Tránh giới hạn mã địa lý của Google Maps?


32

Tôi đang tạo một bản đồ google tùy chỉnh có 125 điểm đánh dấu được vẽ thông qua một cms. Khi tải bản đồ, tôi nhận được thông báo này:

Mã địa lý không thành công vì lý do sau: OVER_QUERY_LIMIT

Tôi khá chắc chắn rằng đó là cách mà tôi đã mã hóa các điểm đánh dấu.

Làm cách nào tôi có thể tránh những cảnh báo này và có cách nào hiệu quả hơn để mã hóa kết quả?

CẬP NHẬT: Đây là nỗ lực của tôi đối với câu trả lời của Casey, hiện tại tôi chỉ nhận được một trang trống.

<script type="text/javascript"> 
(function() { 

window.onload = function() { 
 var mc;
// Creating an object literal containing the properties we want to pass to the map 
var options = { 
zoom: 10, 
center: new google.maps.LatLng(52.40, -3.61), 
mapTypeId: google.maps.MapTypeId.ROADMAP 
}; 

// Creating the map 
var map = new google.maps.Map(document.getElementById('map'), options); 

// Creating a LatLngBounds object 
var bounds = new google.maps.LatLngBounds(); 

// Creating an array that will contain the addresses 
var places = []; 

// Creating a variable that will hold the InfoWindow object 
var infowindow; 
mc = new MarkerClusterer(map);
<?php
$pages = get_pages(array('child_of' => $post->ID, 'sort_column' => 'menu_order'));
$popup_content = array();
foreach($pages as $post)
    {
    setup_postdata($post);
    $fields = get_fields(); 
    $popup_content[] = '<p>'.$fields->company_name.'</p><img src="'.$fields->company_logo.'" /><br /><br /><a href="'.get_page_link($post->ID).'">View profile</a>';
    $comma = ", ";
    $full_address = "{$fields->address_line_1}{$comma}{$fields->address_line_2}{$comma}{$fields->address_line_3}{$comma}{$fields->post_code}";
    $address[] = $full_address;
    }
wp_reset_query();
echo 'var popup_content = ' . json_encode($popup_content) . ';';
echo 'var address = ' . json_encode($address) . ';';
?>

var geocoder = new google.maps.Geocoder(); 

var markers = [];

// Adding a LatLng object for each city  
for (var i = 0; i < address.length; i++) { 
    (function(i) { 
        geocoder.geocode( {'address': address[i]}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                places[i] = results[0].geometry.location;

                // Adding the markers 
                var marker = new google.maps.Marker({position: places[i], map: map});
                markers.push(marker);
                mc.addMarker(marker);

                // Creating the event listener. It now has access to the values of i and marker as they were during its creation
                google.maps.event.addListener(marker, 'click', function() {
                    // Check to see if we already have an InfoWindow
                    if (!infowindow) {
                        infowindow = new google.maps.InfoWindow();
                    }

                    // Setting the content of the InfoWindow
                    infowindow.setContent(popup_content[i]);

                    // Tying the InfoWindow to the marker 
                    infowindow.open(map, marker);
                });

                // Extending the bounds object with each LatLng 
                bounds.extend(places[i]); 

                // Adjusting the map to new bounding box 
                map.fitBounds(bounds) 
            } else { 
            alert("Geocode was not successful for the following reason: " + status); 
            }

        });

    })(i);

} 
var markerCluster = new MarkerClusterer(map, markers); 
} 
})
(); 
</script> 

Việc giải pháp là gì thực sự không quan trọng miễn là các điểm đánh dấu tải ngay lập tức và nó không vi phạm bất kỳ điều khoản & điều kiện nào.


Bạn không nói lý do tại sao hoặc tần suất bạn đang thực hiện các tra cứu này. Bạn không cố gắng mã hóa địa điểm giống nhau mỗi trang hiển thị phải không? Nếu đó là trường hợp bạn nên xem xét bằng cách sử dụng api để thực hiện các phía máy chủ tra cứu này một lần duy nhất, khi vị trí đầu tiên được thêm vào cơ sở dữ liệu.
Peter

Nếu bạn muốn thử lời khuyên của @ Peter, có một công cụ đơn giản ở đây sẽ mã hóa các điểm trong bảng tính Google. Điều này sẽ cho phép bạn viết lat / long cho các thành phố vào CMS, vì vậy bạn sẽ không cần sử dụng trình mã hóa địa lý vào thời gian chạy.
Stephen chì

@Peter Thật ra nghe có vẻ là một ý tưởng tuyệt vời. Tôi hơi rách vì nó sẽ làm giảm khả năng sử dụng cms của tôi. Nếu khách hàng phải tìm hiểu lat / long cho mỗi công ty thay vì chỉ nhập địa chỉ thì nó không thân thiện với người dùng lắm. Tôi có hiểu đúng không?
Cướp

Xem câu trả lời mới của tôi thấp hơn cho một chức năng php.
Peter

2
@rob FWIW Tôi nghĩ Ragi có cách tiếp cận đúng. Câu trả lời của Casey vẫn yêu cầu bạn mã hóa địa lý mọi điểm, mỗi khi bản đồ vẽ, điều này dường như không cần thiết cho bộ dữ liệu tĩnh của bạn
Stephen Lead

Câu trả lời:


57

Giống như mọi người khác, tôi có thể cung cấp cho bạn câu trả lời bằng mã, nhưng tôi không nghĩ ai đó đã giải thích cho bạn rằng bạn đang làm điều gì đó về cơ bảnsai .

Tại sao bạn nhấn lỗi này? Bởi vì bạn đang gọi mã địa lý mỗi khi ai đó xem trang của bạn và bạn không lưu trữ kết quả của mình ở bất cứ đâu trong db!

Lý do giới hạn tồn tại là để ngăn chặn sự lạm dụng từ các tài nguyên của Google (cho dù đó là sẵn sàng hay không sẵn lòng) - đó chính xác là những gì bạn đang làm :)

Mặc dù mã địa lý của google rất nhanh, nhưng nếu mọi người sử dụng nó như thế này, nó sẽ làm mất máy chủ của họ. Lý do tại sao Google Fusion Table tồn tại là để thực hiện nhiều thao tác nâng máy chủ hạng nặng cho bạn. Mã hóa địa lý và bộ đệm ẩn được thực hiện trên máy chủ của họ. Nếu bạn không muốn sử dụng nó, thì bạn nên lưu trữ chúng trên máy chủ của bạn.

Nếu vẫn còn 2500 yêu cầu một ngày là quá ít, thì bạn phải xem giấy phép Google Maps Premier (trả phí) cung cấp cho bạn 100.000 yêu cầu mã hóa địa lý mỗi ngày cho khoảng 10k một năm (rất nhiều - với bộ nhớ cache phía máy chủ bạn nên không đạt đến giới hạn này trừ khi bạn là một trang web lớn hoặc đang xử lý dữ liệu nặng). Nếu không có bộ nhớ đệm phía máy chủ và sử dụng phương pháp hiện tại của bạn, bạn sẽ chỉ có thể thực hiện 800 lượt xem trang mỗi ngày!

Khi bạn nhận ra rằng các nhà cung cấp khác tính phí theo mã địa lý , bạn sẽ hiểu rằng bạn nên lưu trữ kết quả trong db. Với phương pháp này, bạn sẽ mất khoảng 10 xu Mỹ cho mỗi lượt xem trang!

Câu hỏi của bạn là, bạn có thể làm việc xung quanh giới hạn ga mà Google cung cấp cho bạn không? Chắc chắn rồi. Chỉ cần thực hiện một yêu cầu từ các địa chỉ IP khác nhau. Heck, bạn có thể ủy quyền các cuộc gọi thông qua ips đàn hồi amazon và sẽ luôn có 2500 cuộc gọi được phân bổ mới. Nhưng tất nhiên, bên cạnh việc là bất hợp pháp (bạn đang tránh một cách hiệu quả các hạn chế được cung cấp cho bạn bởi các điều khoản dịch vụ của Google Maps), bạn sẽ thực hiện một bản hack để che lấp lỗ hổng thiết kế vốn có trong hệ thống của bạn.

Vì vậy, cách đúng đắn cho trường hợp sử dụng là gì? Trước khi bạn gọi api mã địa lý google, hãy gửi nó đến máy chủ của bạn và truy vấn nếu nó nằm trong bộ đệm của bạn. Nếu không, hãy gọi mã địa lý, lưu nó vào bộ đệm của bạn và trả về kết quả.

Có những cách tiếp cận khác, nhưng điều này sẽ giúp bạn bắt đầu đi đúng hướng.

Cập nhật: Từ các bình luận của bạn bên dưới, nó cho biết bạn đang sử dụng PHP, vì vậy đây là một mẫu mã về cách thực hiện chính xác (đề xuất từ ​​chính nhóm Google) https://developers.google.com/maps/articles/phpsqlsearch_v3


Bạn đã có một ví dụ tôi có thể làm theo để gửi nó đến máy chủ, v.v.?
Cướp

CMS phụ trợ của bạn là gì? (Tôi giả sử bạn có thể / biết cách thay đổi nó và chỉ muốn một ví dụ đơn giản chỉ ra cách thực hiện điều đó bằng ngôn ngữ bạn chọn. Bạn không cần một ví dụ về phía khách hàng js, hay bạn? Bạn có đang sử dụng bất kỳ js nào không khuôn khổ như jquery?
Ragi Yaser Burhum

Ngoài ra, bạn sẽ cần cung cấp thêm ngữ cảnh về cách dữ liệu đánh dấu vào hệ thống của bạn ở nơi đầu tiên
Ragi Yaser Burhum

1
ĐƯỢC. Php rồi. Bit này từ tài liệu Google nên bao gồm các mysql và phần php code.google.com/apis/maps/articles/phpsqlgeocode.html
Ragi Yaser Burhum

1
Xem 10.1.3 (b) để biết chi tiết về các loại bộ đệm được cho phép. developers.google.com/maps/terms#section_10_12
Paul Ramsey

14

Tôi nghĩ Sasa đúng, trên cả hai tính.

Về mặt gửi tất cả các địa chỉ của bạn cùng một lúc, một tùy chọn là gửi các yêu cầu theo chu kỳ. Trước đây khi sử dụng JavaScript, tôi đã chọn trì hoãn các yêu cầu 0,25 (dường như hoạt động!) Giây bằng cách sử dụng

setTimeout( [FUNCTION CALL] , 250 )

phương pháp.

Trong .NET tôi đã chọn:

System.Threading.Thread.Sleep(250);

Có vẻ để làm việc.

EDIT: Không thể thực sự kiểm tra nó, nhưng điều này nên / có thể hoạt động!

Ví dụ Javascript. Địa chỉArray chứa các chuỗi là địa chỉ ...

for (var i = 0; i < addressArray.length; i++0 
{

setTimeout('googleGeocodingFunction(' + addressArray[i] + ')' , 250);

}

CHỈNH SỬA:

for (var i = 0; i < address.length; i++) {
    function(i) {
        setTimeout(geocoder.geocode({ 'address': address[i] }, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                places[i] = results[0].geometry.location;

                var marker = new google.maps.Marker({ position: places[i], map: map });
                markers.push(marker);
                mc.addMarker(marker);
                google.maps.event.addListener(marker, 'click', function() {
                    if (!infowindow) {
                        infowindow = new google.maps.InfoWindow();
                    }

                    // Setting the content of the InfoWindow
                    infowindow.setContent(popup_content[i]);

                    // Tying the InfoWindow to the marker 
                    infowindow.open(map, marker);
                });

                // Extending the bounds object with all coordinates 
                bounds.extend(places[i]);

                // Adjusting the map to new bounding box 
                map.fitBounds(bounds)
            } else {
                alert("Geocode was not successful for the following reason: " + status);
            }
        }), 250);// End of setTimeOut Function - 250 being a quarter of a second. 
    } 
}

Cảm ơn vi đa trả lơi. Làm thế nào tôi có thể nhận được điều đó vào mã của tôi. Đây là tất cả một chút mới vì vậy cần một số nắm tay. Bạn sẽ có thể xem mã nguồn của tôi.
Cướp

Mà bit? Ngôn ngữ của bạn đang sử dụng là gì?
CatchingMonkey

Tôi đang sử dụng javascript, làm cách nào tôi có thể đặt khoảng?
Cướp

Chỉnh sửa câu trả lời của tôi.
CatchingMonkey

Cũng thực tế tôi có nghĩa là setTimeout () ... Cảm ơn Casey.
CatchingMonkey

9

Có vẻ như bạn đang đạt giới hạn yêu cầu đồng thời do Google áp đặt (mặc dù tôi không thể tìm thấy tài liệu tham khảo về giới hạn thực sự là gì). Bạn sẽ cần loại bỏ các yêu cầu của mình để không gửi tất cả 125 yêu cầu cùng một lúc. Lưu ý rằng cũng có yêu cầu 2500 mã địa lý mỗi ngày.

Tham khảo tài liệu Chiến lược mã hóa địa lý của Google để biết thêm thông tin.

Cập nhật: Là một giải pháp bổ sung được lấy cảm hứng từ bài đăng của Mapperz, bạn có thể nghĩ về việc tạo Bảng Google Fusion mới , lưu trữ địa chỉ của bạn và bất kỳ dữ liệu liên quan nào trong bảng và mã hóa bảng thông qua giao diện web của họ. Có giới hạn về số lượng yêu cầu mã địa lý mà Bảng tổng hợp sẽ thực hiện, tuy nhiên giới hạn này khá lớn. Khi bạn đạt đến giới hạn, bạn sẽ cần gửi lại yêu cầu mã địa lý và Fusion Table sẽ chọn nơi nó rời đi. Phần thưởng cho phương pháp này là một cải tiến tốc độ rất lớn, vì bạn sẽ chỉ cần mã hóa địa lý ONCE, trong đó với giải pháp hiện tại của bạn, bạn sẽ cần mã hóa địa lý trên mỗi tải, nhanh chóng đạt đến giới hạn hàng ngày.


Tôi đoán tôi đã đạt đến giới hạn, tôi còn quá mới với điều này và tôi nghĩ rằng tôi cần một ví dụ mã để giúp đỡ.
Cướp

Tôi đã xem xét Google Fusion Table và gặp một vài vấn đề. 1. Bạn phải tự điền địa chỉ mã địa lý (thông qua tệp-> mã địa lý) trong bảng, điều này có thể được thực hiện tự động không? 2. Một số điểm đánh dấu chỉ xuất hiện ở các mức thu phóng nhất định trong khi một số khác hiển thị bất kỳ mức thu phóng nào. Đây là ví dụ - mediwales.com/mapping/example. Điều cuối cùng tôi muốn làm là xuất dữ liệu Wordpress của mình (tức là tất cả các địa chỉ công ty) sang bảng tổng hợp, mã hóa địa lý tự động sau đó lấy tất cả các địa chỉ được mã hóa địa lý đó và lập bản đồ ngay lập tức.
Cướp

7

Đây là cách tôi điều tiết các yêu cầu mã địa lý của mình trong javascript, địa chỉ là một mảng chứa mỗi địa chỉ thành mã địa lý:

for (i=0;i<=addresses.length;i++) {
    setTimeout( function () {
            geocoder.geocode( { 'address': addresses[i]}, function(results, status) {

                if (status == google.maps.GeocoderStatus.OK) { 

                    //create and add marker to map based off geocode result
                    var marker = new google.maps.Marker({  
                        map: map,
                        title: results[0].formatted_address,
                        position: results[0].geometry.location
                    });

                 } //EDIT, was missing the closing bracket here
            });

    }, i * 1500);
}

Điều này về cơ bản thêm một giây và một nửa giữa mỗi yêu cầu mã hóa địa lý.


Cảm ơn câu trả lời. Tôi tiếp tục nhận được một trang trống khi cố gắng tích hợp vào mã của mình - mediwales / ánh xạ
Rob

Bạn có đang sử dụng bất kỳ công cụ sửa lỗi nào có thể chỉ ra lỗi không? Nếu bạn không, hãy thử sử dụng công cụ chữa cháy plugin FireFox. Nó có thể khá tiện dụng trong các tình huống như thế này.
Casey

Tôi không phải là không. Tôi không tự tin Tôi đã đặt mã đúng chỗ, tôi sẽ cập nhật câu hỏi của mình với nỗ lực của mình.
Cướp

Tôi đã thiếu một khung đóng trong mẫu mã của tôi. Tôi chỉnh sửa câu trả lời của tôi và thêm nó, với một bình luận. Tuy nhiên, có vẻ như đây không phải là một vấn đề trong mã mẫu của bạn. Bạn đang nhận được một trang trống hoặc bản đồ trống? Một trang trống sẽ cho biết có lỗi cú pháp trong mã javascript. Một bản đồ trống (không có điểm đánh dấu) sẽ chỉ ra rằng mã địa lý có vấn đề.
Casey

1
Chào. Tôi đã có một câu trả lời khác. Hiện tại, độ trễ đang hoạt động nhưng không thể lấy các điểm đánh dấu. Từ mã của tôi, đây là các bit quan trọng vẽ đồ thị cho các điểm đánh dấu - (function (i) {và}) (i); không có những thứ đó sẽ không âm mưu, thậm chí không thêm độ trễ.
Cướp

5

Tôi đã thử trang này và nó dường như đang hoạt động ngay bây giờ .

Mặc dù tôi nghĩ rằng cách tiếp cận bộ đếm thời gian bạn hiện đang sử dụng là chính xác và theo như tôi biết cách duy nhất sẽ hoạt động với yêu cầu hỗ trợ phía máy chủ, tôi nên đề xuất các thay đổi sau (Tôi đã tự do viết lại các chức năng mã hóa địa lý của bạn) để tận dụng lợi thế của localStorage .

LocalStorage là một công nghệ tương đối mới được tích hợp trong hầu hết các trình duyệt cho phép trang web lưu trữ dữ liệu trên máy khách. Nó hơi giống với cookie, nhưng nó mạnh hơn nhiều và không phải lúc nào cũng bực bội với máy chủ (không giống như cookie).

Mục đích của tôi là lưu địa chỉ mã hóa địa lý trên máy khách để nếu người dùng làm mới trang, không cần phải gọi lại các chức năng mã hóa địa lý của Google trên chúng. Việc triển khai dưới đây rất thô sơ (chúng ta nên thêm mã để kiểm tra các bản ghi cũ và có thể cần một khóa bộ đệm tốt hơn chỉ mục) nhưng đủ để bạn bắt đầu. Hy vọng nó giúp.

(function() { 

window.onload = function() { 
 var mc;
// Creating an object literal containing the properties we want to pass to the map 
var options = { 
zoom: 0, maxZoom: 0, 
center: new google.maps.LatLng(52.40, -3.61), 
mapTypeId: google.maps.MapTypeId.ROADMAP 
}; 

// Creating the map 
var map = new google.maps.Map(document.getElementById('map'), options); 

// Creating a LatLngBounds object 
var bounds = new google.maps.LatLngBounds(); 

// Creating an array that will contain the addresses 
var places = []; 

// Creating a variable that will hold the InfoWindow object 
var infowindow; 
mc = new MarkerClusterer(map);
var popup_content = [..redacted..];

var geocoder = new google.maps.Geocoder(); 

var markers = [];

// Adding a LatLng object for each city 
function geocodeAddress(i) {
     // check if localStorage is available (it is now available on most modern browsers)
     // http://html5tutorial.net/tutorials/working-with-html5-localstorage.html
     // NB: this *must* be improved to handle quota limits, age/freshness, etc
     if(localStorage && localStorage['address_'+i]) {
        places[i]=JSON.parse(localStorage['address_'+i]);
        addPlace(i);
     } else {
      geocoder.geocode( {'address': address[i]}, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            places[i] = results[0].geometry.location;
            if(localStorage) {
               // cache result locally on the browser, this will help reducing the number of requests
               // to the google geocoder in case the user refreshes the page
               // remember: the more he will refresh, the more he's likely to hit the limit
               // (this is one case where refreshing or closing the browser does not work)
               localStorage['address_'+i]=JSON.stringify(results[0].geometry.location);
            }

            addPlace(i);
        } else { 
            console.log("Geocoding of address "+address[i]+" failed");
        }
    })
}

function addPlace(i) {
    // Adding the markers 
    var marker = new google.maps.Marker({position: places[i], map: map});
    markers.push(marker);
    mc.addMarker(marker);

    // Creating the event listener. It now has access to the values of i and marker as they were during its creation
    google.maps.event.addListener(marker, 'click', function() {
        // Check to see if we already have an InfoWindow
        if (!infowindow) {
            infowindow = new google.maps.InfoWindow();
        }

        // Setting the content of the InfoWindow
        infowindow.setContent(popup_content[i]);

        // Tying the InfoWindow to the marker 
        infowindow.open(map, marker);
    });

    // Extending the bounds object with each LatLng 
    bounds.extend(places[i]); 

    // Adjusting the map to new bounding box 
    map.fitBounds(bounds);
}

function geocode() {
    if (geoIndex < address.length) {
        geocodeAddress(geoIndex);
        ++geoIndex;
    }
    else {
        clearInterval(geoTimer);
    }
}
var geoIndex = 0;
var geoTimer = setInterval(geocode, 600);  // 200 milliseconds (to try out)

var markerCluster = new MarkerClusterer(map, markers); 
} 
})
(); 

Cảm ơn rất nhiều, chỉ cần cho một cái gì đó khác đi nhưng sẽ thử điều này trong một phút. Nghe có vẻ như một ý tưởng tốt.
Cướp

Chỉ cần thử nó (bây giờ đã trở lại trước đó), nó hoạt động lần đầu tiên sau đó khi tôi làm mới nó chỉ hiển thị một trang trống.
Cướp

thử ngay bây giờ, đã xảy ra lỗi, cũng xin lưu ý rằng biến popup_content đã được điều chỉnh lại cho ngắn gọn.
unicoletti

3

sử dụng trình mã hóa địa lý địa lý Tôi có thể mã hóa địa lý một số lượng lớn địa chỉ mà không gặp trở ngại nào (tôi không chắc chắn về việc thiết lập áp phích hoặc nếu anh ta có thể bao gồm một phụ thuộc trăn vào dự án của mình)

đây là bài kiểm tra của tôi

from geopy import geocoders

g = geocoders.GoogleV3()  #https://geopy.readthedocs.io/en/latest/#geopy.geocoders.GoogleV3

for x in xrange(1,10000):
    print x
    a = g.geocode("AV JOAO NAVES DE AVILA " + str(x) + " UBERLANDIA MG BRASIL")
    print a

đoạn kết quả

7595 (u'Av. Jo \ xe3o Naves de \ xc1vila, 7595 - Segismundo Pereira, Uberl \ xe2ndia - Minas Gerais, 38408-288, Brazil ', (-18.9388154, -48.2220562))

7596 (u'Av. Jo \ xe3o Naves de \ xc1vila, 7596 - Segismundo Pereira, Uberl \ xe2ndia - Minas Gerais, 38408-680, Brazil ', (-18.938814, -48.2217423))

7597 (u'Av. Jo \ xe3o Naves de \ xc1vila, 7597 - Segismundo Pereira, Uberl \ xe2ndia - Minas Gerais, 38408-288, Brazil ', (-18.9388128, -48.2220381))

7598 (u'Av. Jo \ xe3o Naves de \ xc1vila, 7598 - Segismundo Pereira, Uberl \ xe2ndia - Minas Gerais, 38408-680, Brazil ', (-18.9388114, -48.2217242))

7599 (u'Av. Jo \ xe3o Naves de \ xc1vila, 7599 - Segismundo Pereira, Uberl \ xe2ndia - Minas Gerais, 38408-288, Brazil ', (-18.9388102, -48.2220201))

7600 (u'Av. Jo \ xe3o Naves de \ xc1vila, 7600 - Segismundo Pereira, Uberl \ xe2ndia - Minas Gerais, 38408-680, Brazil ', (-18.9388088, -48.2217062))

Điều này vẫn đang chạy và tôi có kết quả 7k.

EDIT: Sau một thời gian tôi đã đi đến cuối phố và google bắt đầu cho tôi những điểm giống nhau, nhưng có vẻ như nó vẫn đưa ra yêu cầu và cho tôi câu trả lời chính xác.


Geopy không phải là phép thuật, những hạn chế sử dụng vẫn được áp dụng.
alphasoup

1

Hàm php này (tôi không biết bạn đang làm việc với ngôn ngữ nào, nhưng bạn có thể tách nó ra, tôi chắc chắn) sử dụng api geolocator google. Cho một địa chỉ, nó sẽ trả về địa chỉ đã chuẩn hóa và latlong. HTH.

// GEOLOCATEBYADDRESS
// @arg (string)address
// @return (array) ((int)flag,(array)address,array(rawresponse))

function geolocatebyaddress($lookupaddress){

    $lookupaddress=trim("$lookupaddress New Zealand");
    $lookupaddress=urlencode($lookupaddress);

    //send off google api lookup request
    $apiurl="http://maps.google.com/maps/api/geocode/json";
    $apiurl.="?address=$lookupaddress";
    $apiurl.="&region=NZ";
    $apiurl.="&sensor=false";

    if (function_exists("curl_init")) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $apiurl);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $json = curl_exec($ch);
        curl_close($ch);
    }
    else     $json= file_get_contents($apiurl);

    //process response
    $response= json_decode($json,true);
    $approxflag=0;
    if ($response['status']=='OK' and count($response['results'])) {

        $aa= array();
        foreach($response['results'] as $cc=>$result) {
            //set keys
            foreach(array('street_number','road','suburb','city','postcode','region','lat','long') as $t){
                $aa[$cc][$t]='';
            }
            if ($result['geometry']){
                $aa[$cc]['lat']= $result['geometry']['location']['lat'];
                $aa[$cc]['long']=$result['geometry']['location']['lng'];
         }

            if (count($result['address_components'])){
                foreach ($result['address_components'] as $acs){
                    if ($acs['types'][0]=='street_number')               $aa[$cc]['street_number']= $acs['long_name']; 
                    if ($acs['types'][0]=='route')                       $aa[$cc]['road']=      $acs['long_name']; 
                    if ($acs['types'][0]=='sublocality')                 $aa[$cc]['suburb']=   $acs['long_name']; 
                    if ($acs['types'][0]=='locality')                    $aa[$cc]['city']=    $acs['long_name']; 
                    if ($acs['types'][0]=='postal_code')                 $aa[$cc]['postcode']= $acs['long_name']; 
                    if ($acs['types'][0]=='administrative_area_level_1') $aa[$cc]['region']=   $acs['long_name']; 
                }    
            }
            //successful?
            if ($result['geometry']['location_type']=='APPROXIMATE') $approxflag++;
            if (isset($result['partial_match']))  $approxflag++;
            if (!$aa[$cc]['street_number'])         $approxflag++;
        }
        if ($approxflag) return (array(1,$aa,$response));
        else return (array(2,$aa,$response));
    }
    else return (array(0,array(),$response));
}    

Cảm ơn đã trả lời, làm thế nào tôi có thể kết hợp điều này vào mã của tôi?
Cướp

Xin lỗi tôi cho rằng bạn đã mã hóa trang web. Hàm đó được sử dụng như một phần của kịch bản phía máy chủ, ví dụ như lấy địa chỉ đầu vào của người dùng, sử dụng api của trình mã hóa địa lý google để lấy các chuỗi. Sau đó, bạn có thể đặt các hợp đồng đó vào db của mình và khi bạn cần tạo bản đồ, chỉ cần truy vấn các hợp đồng và tạo bản đồ bằng các điểm đánh dấu. Bằng cách đó, bạn sẽ không lạm dụng trình mã hóa địa lý cho mỗi trang hiển thị dưới dạng bị nhiễu. (bạn có đánh giá thấp nhận xét của tôi không? Tôi đang cố gắng giúp đỡ và việc phạt tôi sẽ không khuyến khích tôi chút nào). Ngoài ra tôi cũng đề cập đến việc api yêu cầu bạn sử dụng nó với một gmap.
Peter

1

Chỉ cần nhìn thấy truy vấn của bạn. Bạn có thể thử mã sau đây. Trên phần kiểm tra trạng thái mã địa lý khác, gọi đệ quy hàm tương tự với khoảng cách thời gian cho các địa chỉ bị mất.

function spotPosition(address) {
        geocoder.geocode({ 'address': address }, function (results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                var lat = results[0].geometry.location.lat();
                var lang = results[0].geometry.location.lng();
                setMarker(lat, lang);
            }
            else if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
                setTimeout(function () {
                    //Recursively calling spotPosition method for lost addresses
                    spotPosition(address);
                }, 1000);
            }
        });
    }

0

Đây là giải pháp của tôi:

phụ thuộc: Gmaps.js, jQuery

var Maps = function($) {
   var lost_addresses = [],
       geocode_count  = 0;

   var addMarker = function() { console.log('Marker Added!') };

   return {
     getGecodeFor: function(addresses) {
        var latlng;
        lost_addresses = [];
        for(i=0;i<addresses.length;i++) {
          GMaps.geocode({
            address: addresses[i],
            callback: function(response, status) {
              if(status == google.maps.GeocoderStatus.OK) {
                addMarker();
              } else if(status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
                lost_addresses.push(addresses[i]);
              }

               geocode_count++;
               // notify listeners when the geocode is done
               if(geocode_count == addresses.length) {
                 $.event.trigger({ type: 'done:geocoder' });
               }
            }
          });
        }
     },
     processLostAddresses: function() {
       if(lost_addresses.length > 0) {
         this.getGeocodeFor(lost_addresses);
       }
     }
   };
}(jQuery);

Maps.getGeocodeFor(address);

// listen to done:geocode event and process the lost addresses after 1.5s
$(document).on('done:geocode', function() {
  setTimeout(function() {
    Maps.processLostAddresses();
  }, 1500);
});

0

Bạn không thể tránh giới hạn mã địa lý của google map: bạn phải lấy và lưu trữ thông tin LatLng .

Nếu bạn có một số thành phố và bạn không muốn lấy LatLng theo cách thủ công, bạn có thể sử dụng thời gian chờ để gọi liên tục geocoder.geocode và lưu thông tin bên trong một đối tượng javascript và sau đó sử dụng console.log(JSON.stringify(object, null, 4));để có được trong bảng điều khiển một đối tượng được in đẹp thí dụ

            var locationsPosition = {
                    "Johannesburg - ZA": {
                        "lat": -26.2041028,
                        "lng": 28.047305100000017
                    },
                    "Chennai - IN": {
                        "lat": 13.0826802,
                        "lng": 80.27071840000008
                    }
             }

vì vậy bây giờ bạn có thể thêm điểm đánh dấu bằng locationsPosition["Johannesburg - ZA"].lat.lng


-1

Có vẻ như bạn cần phải làm một trong hai điều sau:

  1. thay đổi quy trình của bạn thành kết quả bộ đệm nếu bạn không nhận được nhiều kết quả duy nhất mỗi ngày; hoặc là
  2. nâng cấp lên dịch vụ cho phép bạn xử lý nhiều hơn mỗi ngày

Như mọi người đã đề cập nhiều lần, nhưng tôi không có kinh nghiệm cá nhân, có vẻ như giấy phép Google với giá 100 nghìn mỗi ngày là khoảng $ 10k USD mỗi năm.

Nếu bạn muốn cùng một mức độ chính xác hoặc tốt hơn (và không phải trả giá đó), bạn có thể thử dịch vụ của chúng tôi. Với chi phí thấp hơn nhiều so với Google (gần bằng 10 chi phí), bạn có thể nhận được giới hạn cao hơn nhiều so với giới hạn 2500 (giới hạn thấp nhất của chúng tôi là 25k / ngày).

Tất nhiên, sử dụng API mã hóa địa lý trả phí của chúng tôi không phải là giải pháp tôi khuyên bạn nên trung thực 100%, mặc dù ý nghĩa kinh doanh tồi là phải thừa nhận như vậy. Thay vào đó tôi sẽ đề nghị đi với tùy chọn 1, tối ưu hóa dịch vụ của bạn vào bộ đệm. Trừ khi bạn đang cần hơn 2500 mã địa lý UNIITE mỗi ngày.

Tuyên bố miễn trừ trách nhiệm : Tôi làm việc cho Geocode Farm (dịch vụ mà tôi giới thiệu).


Tại sao điều này đã bỏ phiếu? Tôi không thấy bất cứ điều gì ở đây là không chính xác hoặc không chính xác?
Geocode.Farm Nhân viên
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.