2010-06-20 30 views

Trả lời

47

Thuật toán:

Chạy qua tất cả các điểm trong đa giác. Đối với tất cả các điểm tìm thấy;

  • x1, mức thấp nhất x phối hợp
  • y1, mức thấp nhất y phối hợp
  • x2, mức cao nhất x phối hợp
  • y2, mức cao nhất y phối hợp

Bây giờ bạn có bounding hình chữ nhật, và có thể làm việc ra trung tâm chúng tôi ing:

center.x = x1 + ((x2 - x1)/2); 
center.y = y1 + ((y2 - y1)/2); 
+3

Vâng, tôi đã tìm thấy rằng trong v2, tôi đã có thể làm điều đó chỉ bằng cách gọi polygon.getBounds(). GetCenter(), nhưng tôi đoán tôi sẽ phải làm theo cách của bạn. Cảm ơn – ANd

+0

Tôi không có ý tưởng, có thể làm việc trong v3 quá. Tôi không nhìn quá gần API Google Maps. Nhưng theo cách này thì về cơ bản là vậy. –

+0

Có vẻ như Google đã quên phương thức 'Polygon.getBounds()'. Nó có sẵn cho 'Circle' và' Rectangle', nhưng không có sẵn cho lớp 'Polygon'. –

163

Matthew's answer là giải pháp tốt. Tuy nhiên, khi sử dụng API Google Maps v3, bạn có thể muốn chuyển mỗi điểm của đa giác đến đối tượng LatLngBounds thông qua phương thức extend() và sau đó cuối cùng gọi phương thức getCenter() trên đối tượng LatLngBounds. Hãy xem xét ví dụ sau:

var bounds = new google.maps.LatLngBounds(); 
var i; 

// The Bermuda Triangle 
var polygonCoords = [ 
    new google.maps.LatLng(25.774252, -80.190262), 
    new google.maps.LatLng(18.466465, -66.118292), 
    new google.maps.LatLng(32.321384, -64.757370), 
    new google.maps.LatLng(25.774252, -80.190262) 
]; 

for (i = 0; i < polygonCoords.length; i++) { 
    bounds.extend(polygonCoords[i]); 
} 

// The Center of the Bermuda Triangle - (25.3939245, -72.473816) 
console.log(bounds.getCenter()); 
+23

+1 cho Tam giác Bermuda :-) – Mawg

+2

Được gói gọn ở đây: http://code.google.com/p/google-maps-extensions/source/browse /google.maps.Polygon.getBounds.js – Steve

+3

Tại sao giải pháp này lại tốt hơn? Đối với tôi có vẻ như cả hai giải pháp phải luôn luôn nhận được cùng một câu trả lời. Đây có phải là nhanh hơn? – Nicolas

36

bạn có thể mở rộng các lớp Polygon với phiên bản riêng của bạn về chức năng còn thiếu, chúng ta hãy gọi nó my_getBounds():

google.maps.Polygon.prototype.my_getBounds=function(){ 
    var bounds = new google.maps.LatLngBounds() 
    this.getPath().forEach(function(element,index){bounds.extend(element)}) 
    return bounds 
} 

và hơn sử dụng nó trong mã như thế này:

myPolygon.my_getBounds().getCenter() 

... vv, nó phải là tương đương với hành vi v2

+1

Tìm thấy bài đăng này khi thực hiện tìm kiếm trên google cho cùng một vấn đề .. Đề xuất này đã làm việc hoàn hảo cho tôi! cảm ơn .. – Dennis

+1

wow nó hoạt động như một sự quyến rũ !! giải pháp tốt nhất tôi nghĩ, Cảm ơn @furiozo – chespinoza

+0

Vì một số lý do, điều này không hiệu quả đối với tôi. Hàm 'my_getBounds()' không xác định khi tôi cố gắng gọi nó trên các đối tượng Đa giác. – CoreDumpError

4

@Matthew Scharley của câu trả lời này là thuật toán của tôi. Nó có thể là xấu. Hãy nhẹ nhàng. Tôi đã viết nó bởi vì hàm getCenter() trong api V3 chỉ hoạt động cho các hình chữ nhật và hình tròn, chứ không phải các đa giác.

function polygonCenter(poly) { 
    var lowx, 
     highx, 
     lowy, 
     highy, 
     lats = [], 
     lngs = [], 
     vertices = poly.getPath(); 

    for(var i=0; i<vertices.length; i++) { 
     lngs.push(vertices.getAt(i).lng()); 
     lats.push(vertices.getAt(i).lat()); 
    } 

    lats.sort(); 
    lngs.sort(); 
    lowx = lats[0]; 
    highx = lats[vertices.length - 1]; 
    lowy = lngs[0]; 
    highy = lngs[vertices.length - 1]; 
    center_x = lowx + ((highx-lowx)/2); 
    center_y = lowy + ((highy - lowy)/2); 
    return (new google.maps.LatLng(center_x, center_y)); 
    } 
1

Lưu ý rằng trong trường hợp đa giác lõm, tâm của hình chữ nhật có thể nằm hoàn toàn bên ngoài đa giác. Nếu đa giác của bạn có thể được vẽ, tôi khuyên bạn nên sử dụng trung tâm của vòng tròn được ghi lớn nhất làm "trung tâm" của đa giác. Bạn có thể thấy một thuật toán đủ đơn giản here (p. 4). Nếu nhiệm vụ của bạn là đặt nhãn trên đa giác, điều này cũng sẽ cho kết quả thẩm mỹ nhất (trong trường hợp đó tôi khuyên bạn nên sử dụng phương pháp này ngay cả khi đa giác của bạn có thể không được lõm).

Các vấn đề liên quan