Kiểm tra xem điểm lat / long có trong một tập hợp đa giác bằng google maps không


9

Tôi biết cách thực hiện các thao tác trên bằng Esri (Tác vụ truy vấn trên shapefile), nhưng điều này cũng có thể được thực hiện bằng Google Maps không? Tôi có phải truy vấn từng đa giác không hoặc có một phương thức để truy vấn một tập hợp đa giác không?

Câu trả lời:


9

API Google maps chưa cung cấp phương pháp kiểm tra các điểm trong đa giác. Sau khi nghiên cứu một chút, tôi tình cờ tìm thấy thuật toán đúc Ray sẽ xác định xem tọa độ XY có nằm trong hình được vẽ không. Điều này sẽ dịch sang vĩ độ và kinh độ. Sau đây mở rộng google.maps.polygon.prototype để sử dụng thuật toán này. Chỉ cần bao gồm mã này tại một điểm trong mã sau khi google.maps đã tải:

google.maps.Polygon.prototype.Contains = function (point) {
    var crossings = 0,
        path = this.getPath();

    // for each edge
    for (var i = 0; i < path.getLength(); i++) {
        var a = path.getAt(i),
            j = i + 1;
        if (j >= path.getLength()) {
            j = 0;
        }
        var b = path.getAt(j);
        if (rayCrossesSegment(point, a, b)) {
            crossings++;
        }
    }

    // odd number of crossings?
    return (crossings % 2 == 1);

    function rayCrossesSegment(point, a, b) {
        var px = point.lng(),
            py = point.lat(),
            ax = a.lng(),
            ay = a.lat(),
            bx = b.lng(),
            by = b.lat();
        if (ay > by) {
            ax = b.lng();
            ay = b.lat();
            bx = a.lng();
            by = a.lat();
        }
        // alter longitude to cater for 180 degree crossings
        if (px < 0) {
            px += 360;
        }
        if (ax < 0) {
            ax += 360;
        }
        if (bx < 0) {
            bx += 360;
        }

        if (py == ay || py == by) py += 0.00000001;
        if ((py > by || py < ay) || (px > Math.max(ax, bx))) return false;
        if (px < Math.min(ax, bx)) return true;

        var red = (ax != bx) ? ((by - ay) / (bx - ax)) : Infinity;
        var blue = (ax != px) ? ((py - ay) / (px - ax)) : Infinity;
        return (blue >= red);

    }

};

Ở đây, chúng tôi đã mở rộng chức năng của google.maps.Polygon bằng cách xác định hàm có tên 'Chứa' có thể được sử dụng để xác định xem kinh độ vĩ độ được cung cấp trong tham số hàm có nằm trong đa giác hay không. Ở đây chúng tôi sử dụng thuật toán đúc Ray và phát triển một hàm sử dụng tương tự. Sau khi thực hiện phần lớn bài tập này, chúng ta có thể kiểm tra một điểm như sau:

var point = new google.maps.LatLng(52.05249047600099, -0.6097412109375);
var polygon = new google.maps.Polygon({path:[INSERT_PATH_ARRAY_HERE]});
if (polygon.Contains(point)) {
    // point is inside polygon
}

Để có mã và bản demo hoàn chỉnh, vui lòng truy cập: http://counsellingbyabhi.blogspot.in/2013/01/google-map-check-whether-point-latlong.html


Vâng, tôi nghĩ rằng việc đúc tia là con đường để đi. Tôi thực sự đã sử dụng thuật toán đó cho mình thông qua một kịch bản python. Triển khai của tôi có thể được tìm thấy ở đây: gramsky.blogspot.com/2012/12/ Ấn
ngramsky

Tôi đã phải loại bỏ các bit đã thêm 360 vào tọa độ âm để điều này hoạt động chính xác quanh kinh độ 0.
user1431317

4

Tôi sẽ đi plugin Open Layer; tìm nạp nó và sau đó bạn thậm chí có thể thêm bất kỳ lớp động nào vào bản đồ và xuất.

* Trước khi làm như vậy, hãy đảm bảo rằng CRS dự án của bạn (EPSG) được đặt thành WGS84 và chuyển đổi CRS 'đang hoạt động' được bật trong cài đặt Thuộc tính dự án của bạn.

Hi vọng điêu nay co ich.


0

nếu bạn sử dụng chương trình của bên thứ ba làm geodjango, bạn có thể kiểm tra quan điểm của mình xem có trong một tập hợp đa giác hay không. Thêm thông tin ở đây .

contains

Availability: PostGIS, Oracle, MySQL, SpatiaLite

Tests if the geometry field spatially contains the lookup geometry.

Example:

Zipcode.objects.filter(poly__contains=geom)

Backend     SQL Equivalent
PostGIS     ST_Contains(poly, geom)
Oracle  SDO_CONTAINS(poly, geom)
MySQL   MBRContains(poly, geom)
SpatiaLite  Contains(poly, geom)

Tôi hy vọng nó sẽ giúp bạn...


0

Tôi biết điều này hơi muộn nhưng nó có thể hữu ích trong trường hợp Một số người không dùng thử thư viện Android-Map-Utils. Tôi đã đăng các phương pháp cụ thể của Câu hỏi này chỉ dành cho Android. Ở đây bạn đi:

https://stackoverflow.com/a/31988461/2054348

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.