2010-06-14 7 views

Trả lời

11

giải pháp khác: Google-Maps-Point-in-Polygon

Javascript Google Maps v3 e xtension cho lớp Polygon để phát hiện có hay không một điểm nằm trong đó ...

+0

Đối với một số lý do kỳ lạ này hoạt động nhưng tôi không bao giờ có thể nhận được của Google containsLocation () chức năng để làm việc ..... – WildBill

+0

@WildBill - Bạn sẽ cần thư viện hình học để làm cho nó hoạt động. Ví dụ:? Sensor = false & libraries = drawing, geometry – jjwdesign

+0

Tôi đã thêm thư viện hình học từ Google nhưng nó vẫn không hoạt động cho tôi – AllJs

4

tôi đã sử dụng thuật toán này để phát hiện rằng điểm là bên trong đa giác: http://alienryderflex.com/polygon/

tôi đã thêm một phương pháp mới contains đến Polygon:

// Add a function contains(point) to the Google Maps API v.3 

google.maps.Polygon.prototype.contains = function(point) { 
    var j=0; 
    var oddNodes = false; 
    var x = point.lng(); 
    var y = point.lat(); 

    var paths = this.getPath(); 

    for (var i=0; i < paths.getLength(); i++) { 
    j++; 
    if (j == paths.getLength()) {j = 0;} 
    if (((paths.getAt(i).lat() < y) && (paths.getAt(j).lat() >= y)) 
    || ((paths.getAt(j).lat() < y) && (paths.getAt(i).lat() >= y))) { 
     if (paths.getAt(i).lng() + (y - paths.getAt(i).lat()) 
    /(paths.getAt(j).lat()-paths.getAt(i).lat()) 
     * (paths.getAt(j).lng() - paths.getAt(i).lng())<x) { 
     oddNodes = !oddNodes 
     } 
    } 
    } 
    return oddNodes; 
} 

google.maps.Polyline.prototype.contains = google.maps.Polygon.prototype.contains; 
+0

Rất đẹp, nó hoạt động. Chỉ cần thay đổi 'var x = point.getPosition(). Lng();' và 'var y = point.getPosition(). Lat();' –

21

Bạn có thể sử dụng trong google bản đồ V3: -

google.maps.geometry.poly.containsLocation(google.maps.LatLng(latitude, longitude),polygons); 

đa giác là một đối tượng được trả về bởi chức năng sau polygoncomplete.

var polygons=null; 
google.maps.event.addDomListener(drawingManager, "polygoncomplete", function(polygon) { 
     polygons=polygon; 
}); 

tham khảo https://developers.google.com/maps/documentation/javascript/reference

2

Mỗi phương pháp mô tả ở đây không bằng cách này hay cách khác.

Các phương pháp được đưa ra bởi Andrei I và Natim không xem xét đa giác với các cạnh trắc địa. Những phương pháp này cũng không nhận ra rằng một cạnh phi trắc địa trong Google Maps chỉ nằm ngay trong phép chiếu Mercator. Các phương thức này giả định các đỉnh nằm trên một lưới vĩ độ/khoảng cách bằng nhau, trong đó một vĩ độ bằng với một mức kinh độ. Do lỗi này, các phương thức này sẽ chỉ ra một điểm nằm ngoài đa giác, trong khi được hiển thị bên trong cho một số trường hợp. Điều này có thể dễ dàng quan sát thấy đối với các cạnh dài không thẳng đứng/không nằm ngang. Để giải quyết vấn đề này, tất cả các điểm trước tiên phải được chuyển đổi từ Latitude, kinh độ sang X, Y tọa độ trong phép chiếu Mercator. Here is the method to convert the coordinates from lat/lon to x/y in Mercator. (Thiếu độ chính xác) Rhumb line navigation can be used as a basis for an alternative method. Phiên bản thử nghiệm Google Maps 3.10 triển khai phương pháp này.

Phương pháp được đề cập bởi Paul Gibbs, Swapnil udare, và Adi Lester không xem xét cạnh đo đạc, nhưng như Google Maps v3.9 nó sử dụng cùng một phương pháp nêu trên cho đa giác không đo đạc. Như vậy nó cũng bị cùng một vấn đề mô tả ở trên.

Cập nhật - Sự cố với Google Maps đã được sửa trong phiên bản thử nghiệm hiện tại của Google Maps v3.10.

2

Không cần thuật toán phức tạp, tôi có thể đạt được điều này bằng phương pháp isPointInPath() của canvas html.

http://www.w3schools.com/tags/canvas_ispointinpath.asp

Tạo phần tử canvas. Vẽ đa giác với nhiều điểm cuối bằng các phương thức moveTo(), lineTo(). Xác minh nếu một điểm (x, y) nằm bên trong đa giác sử dụng phương thức isPointInPath().

<canvas id="canvas"></canvas> 

//x,y are coordinate of the point that needs to be tested 
//coordinates contains all endpoint of a polygon in format of x1,y1,x2,y2,x3,y3.... 
function isPointInPolygon(x, y, coordinates) { 
var ctx = canvas.getContext("2d"); 
var coords = coordinates.split(','); 

if (coords != null && coords.length > 4) { 
    ctx.beginPath(); 
    ctx.moveTo(coords[0], coords[1]); 
    for (j = 2; j < coords.length; j++) { 
     ctx.lineTo(coords[j], coords[j + 1]); 
     j++; 
    } 
    ctx.closePath(); 
    if (ctx.isPointInPath(x, y)) 
     return true; 
    else 
     return false; 
} 
return false; 
} 
+0

Biểu ngữ đã hỏi về Đa giác trên bản đồ của Google. Không phải tất cả các trình duyệt đều hỗ trợ canvas và phương thức trên giả định một mạng X, Y chuẩn. Nếu một là vẽ trên vải, phương pháp trên là hoàn hảo nếu không nó chỉ là lãng phí. Các phương pháp khác được đề cập ở trên có thể tính toán điều này mà không cần chi phí vẽ trên canvas. Phương pháp tốt nhất là của Google maps v3.10 là google.maps.geometry.poly.containsLocation() vì nó xử lý các đa giác trắc địa cũng như đa giác của mercator. – deAtog

+0

Tôi đồng ý. Nó không chính xác trả lời câu hỏi này nhưng có thể giúp những người đang làm việc trong môi trường html5 và kết thúc trong bài viết này để phát hiện điểm trong đa giác. Tôi đã đến bài viết này và cố gắng thực hiện tất cả các thuật toán nhưng không có gì làm việc một cách hoàn hảo. Về cơ bản, tôi đã triển khai bản đồ tùy chỉnh trên hình ảnh sơ đồ tầng bằng canvas. Tôi đã phải hiển thị chú giải công cụ trên một phần khác của hình ảnh và bắt chước chức năng bản đồ hình ảnh html. –