1

我在谷歌地圖上動態地繪製了幾個點。我試圖找到找到給定點的中心的最佳方法。我試過使用以下內容:找到lats/lng的平均(中心)

var mapArray = new Array; 
mapArray[0] = new Array(42, 35.391228, -119.008401); 
mapArray[1] = new Array(34, 33.874277, -118.131555); 
mapArray[2] = new Array(214, 32.6922592, -115.4962203); 
mapArray[3] = new Array(216, 33.3818875, -117.2449785); 
mapArray[4] = new Array(40, 36.805231, -119.770192); 
mapArray[5] = new Array(47, 37.638266, -122.117398); 
mapArray[6] = new Array(218, 37.638266, -122.117398); 
mapArray[7] = new Array(39, 33.70677, -116.241719); 
mapArray[8] = new Array(219, 33.666489, -117.30137); 
mapArray[9] = new Array(37, 34.0625743, -118.354077); 
mapArray[10] = new Array(217, 34.0625743, -118.354077); 
mapArray[11] = new Array(43, 34.195561, -119.179495); 
mapArray[12] = new Array(220, 37.671111, -121.873443); 
mapArray[13] = new Array(215, 33.736294, -116.405587); 
mapArray[14] = new Array(35, 33.978778, -117.383186); 
mapArray[15] = new Array(36, 32.8321559, -117.1264585); 
mapArray[16] = new Array(46, 37.312298, -121.930904); 
mapArray[17] = new Array(221, 1, 1); 
mapArray[18] = new Array(41, 33.7453974, -117.8502537); 
mapArray[19] = new Array(44, 34.426024, -119.697417); 
mapArray[20] = new Array(45, 34.952801, -120.440045); 
mapArray[21] = new Array(38, 34.199697, -118.571618); 

var avgLat = 0; 
var avgLng = 0; 
var j = 0; 

for (var i in mapArray) { 

    avgLat = (avgLat + mapArray[i][1]); 
    avgLng = (avgLng + mapArray[i][2]); 

    j++; 
} 

avgLat = avgLat/j; 
avgLng = avgLng/j; 

map.setCenter(new GLatLng(avgLat, avgLng), 6); 

但是,這並沒有給我一個準確的中心。動態繪製地圖中心的最佳方式是什麼?

回答

2

查找經度和緯度的最大值和最小值,然後以 (max-min)/ 2 爲中心。

這應該是(最大+最小)/ 2,平均值。

+0

如何分鐘+((最大值 - 最小值)/ 2)如果最大= 100分鐘= 20 ... 20 +((100-20)/ 2)= 60。 – DogLimbo

+1

@DogLimbo:它d更快計算'(max + min)/ 2' – Blazemonger

+0

這是不準確的http://i.imgur.com/Ivmxr.png –

2

請注意,你計算的centroid,這在地理稱爲geographic center.

這並沒有真正的工作,以及如果你沒有一個明確的形狀,因爲這是一個平均數,這樣你就可以在一個區域有一組點,這些點將中心朝向它們傾斜。

取而代之,您可以查找最大和最小緯度和經度,並將每個中點作爲新座標。

你也可以做一些更復雜的事情,試着弄清楚這些點跟蹤出來的區域是什麼樣的。我對你沒有一個好的算法,但想法是刪除「太靠近」的點,其中「關閉」由點之間的距離定義。一旦刪除了一些羣集,就可以使用質心方法並獲得更好的結果。

1

Stever我看到您的圖片並且遇到同樣的問題。要解決它,我所做的就是將第一個點的值分配給最小值和最大值。

這裏是代碼,您可以查看它。注意:「Point」是我用來存儲lat和lng值的結構。

 x = 0; 
     y = 0; 

     Point point; 

     if (points.Count.Equals(0)) 
      return; 

     Double minLat = points[0].lat, maxLat = points[0].lat; 
     Double minLng = points[0].lng, maxLng = points[0].lng; 

     for (int index = 1, count = points.Count; index < count; index++) 
     { 
      point = points[index]; 

      if (minLat > point.lat) 
       minLat = point.lat; 

      if (maxLat < point.lat) 
       maxLat = point.lat; 

      if (minLng > point.lng) 
       minLng = point.lng; 

      if (maxLng < point.lng) 
       maxLng = point.lng; 
     } 

     x = (minLat + maxLat)/2; 
     y = (minLng + maxLng)/2;