【问题标题】:Find the average (center) of lats/lngs查找 lats/lngs 的平均值(中心)
【发布时间】:2011-11-06 07:38:21
【问题描述】:

我正在谷歌地图上动态绘制几个点。我正在尝试找到找到给定点中心的最佳方法。我试过使用以下方法:

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);

但这并没有给我一个准确的中心。动态绘制地图中心的最佳方法是什么?

【问题讨论】:

    标签: jquery multidimensional-array geocoding latitude-longitude average


    【解决方案1】:

    找出 lat 和 long 的最大值和最小值,然后以 (max-min)/2 为中心。

    这应该是 (max + min) / 2,平均值。

    【讨论】:

    • 如果 max = 100 & min = 20... 20 +((100-20)/2) = 60,那么 min + ((max-min)/2) 怎么样。
    • @DogLimbo:只计算 (max+min)/2 会更快
    • @mblase75 你的似乎效果最好。如果您想要积分,请回答。
    【解决方案2】:

    请注意,您计算了centroid,在地理上称为geographic center.

    如果您没有明确定义的形状,这实际上效果不佳,因为它是平均值,因此您可以在一个区域中拥有一组点,使中心向它们倾斜。

    相反,您可以找到最大和最小纬度和经度,并将每个纬度和经度的中点作为您的新坐标。

    您还可以做一些更复杂的事情,并尝试了解这些点所描绘的区域是什么样的。我没有适合您的算法,但想法是删除“太近”的点,其中“接近”是由您的点之间的距离定义的。一旦你削减了一些集群,你可以使用质心方法获得更好的结果。

    【讨论】:

      【解决方案3】:

      Stever 我看到了你的图片并且遇到了同样的问题。为了解决这个问题,我所做的是将第一个点的值分配给最小值和最大值。

      这是代码,您可以查看它。注意:“点”是我用来存储 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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-22
        • 2018-07-12
        • 2020-08-10
        • 1970-01-01
        • 2012-02-20
        相关资源
        最近更新 更多