Tôi muốn phát hiện rằng google.maps.LatLng
nằm trong một số google.maps.Polygon
.Làm thế nào để phát hiện ra rằng một điểm nằm trong một Đa giác bằng cách sử dụng Google Maps?
Tôi có thể làm như thế nào?
Chúc mừng,
Tôi muốn phát hiện rằng google.maps.LatLng
nằm trong một số google.maps.Polygon
.Làm thế nào để phát hiện ra rằng một điểm nằm trong một Đa giác bằng cách sử dụng Google Maps?
Tôi có thể làm như thế nào?
Chúc mừng,
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 đó ...
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;
Rất đẹp, nó hoạt động. Chỉ cần thay đổi 'var x = point.getPosition(). Lng();' và 'var y = point.getPosition(). Lat();' –
Google cung cấp triển khai của riêng họ trong thư viện hình học mà tôi chưa chọn, nhưng có lẽ bao gồm các trường hợp cạnh được thảo luận trong các câu trả lời khác.
Xem phương pháp containsLocation described here. Lưu ý rằng bạn sẽ phải import the geometry library explicitly, as it is not in the base map API
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
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.
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;
}
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
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. –
Đố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
@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
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