如何获得某些位置之间的中心点(LatLng)?

时间:2016-02-26 06:58:22

标签: android google-maps

任何人都可以帮助我获得中心点。我有6个LatLng对象,现在我需要让LatLng对象居中。非常感谢!

7 个答案:

答案 0 :(得分:5)

您需要计算由您的点定义的多边形的质心。 Wikipedia将质心定义为:

  

平面图形的质心或几何中心是形状中所有点的算术平均(“平均”)位置

要计算centroid of a finite set of points,您可以使用以下方法:

private LatLng computeCentroid(List<LatLng> points) {
    double latitude = 0;
    double longitude = 0;
    int n = points.size();

    for (LatLng point : points) {
        latitude += point.latitude;
        longitude += point.longitude;
    }

    return new LatLng(latitude/n, longitude/n);
}

答案 1 :(得分:1)

public static void midPoint(double lat1,double lon1,double lat2,double lon2){

    double dLon = Math.toRadians(lon2 - lon1);


    lat1 = Math.toRadians(lat1);
    lat2 = Math.toRadians(lat2);
    lon1 = Math.toRadians(lon1);

    double Bx = Math.cos(lat2) * Math.cos(dLon);
    double By = Math.cos(lat2) * Math.sin(dLon);
    double lat3 = Math.atan2(Math.sin(lat1) + Math.sin(lat2), Math.sqrt((Math.cos(lat1) + Bx) * (Math.cos(lat1) + Bx) + By * By));
    double lon3 = lon1 + Math.atan2(By, Math.cos(lat1) + Bx);


}

lat3和lon3是中点

答案 2 :(得分:1)

var bound = new google.maps.LatLngBounds();

for (i = 0; i < locations.length; i++) {
  bound.extend( new google.maps.LatLng(locations[i][2], locations[i][3]) );

  // OTHER CODE
}

console.log( bound.getCenter() );

你将你的位置写在名为locations的数组中然后在循环中执行它 Find center of multiple locations in Google Maps 这是js代码,所以你可以把它改成你的代码

答案 3 :(得分:0)

你可以得到如下的中点 -

double lat1, lng1, lat2, lng2;

double midlat = (lat1 + lat2)/2;
double midlng = (lng1 + lng2)/2;

答案 4 :(得分:0)

Java代码above

Dart 版本

LatLng computeCentroid(Iterable<LatLng> points) {
  double latitude = 0;
  double longitude = 0;
  int n = points.length;

  for (LatLng point in points) {
    latitude += point.latitude;
    longitude += point.longitude;
  }

  return LatLng(latitude / n, longitude / n);
}

答案 5 :(得分:0)

这包括两个主要步骤

  • 第 1 步:将所有 LatLng 简化为仅两个极端 LatLng
  • 第 2 步:获取这两个计算出的 LatLngs 的中心

1) 简化

我们想要获得所有给定坐标的最小和最大纬度,而不是从中选择最极端/最远的坐标。 这可以通过以下方式实现:

List<Object> getMapFittingDataWithLatLongs(List<LatLng> latLongs) {
  List<LatLng> extremeLatLongs = getExtremeLatLongs(latLongs);
  LatLng latLng1 = extremeLatLongs[0], latLng2 = extremeLatLongs[1];

  double extremeDistance = Geolocator.distanceBetween(
    latLng1.latitude,
    latLng1.longitude,
    latLng2.latitude,
    latLng2.longitude,
  );

  LatLng centeredLatLong = getCenterLatLong(latLng1, latLng2);

  return [centeredLatLong, 12.0];
}

2) 居中

我们将以类似的方式处理纬度和经度,但在此之前我们需要知道它们的限制是 180-180,并且这两个限制物理接触。所以我们需要小心,不要只是得到两个值的平均值(如 (180+ -180)/2 = 0 是地球的完全相反的一面!!)

求平均数不会有问题,但当距离值差异 <= 90 并且求平均值最安全的部分是在 -9090 之间时,换句话说,在第二和第三四分位数。

但是在第 1 和第 4 个四分位数中,我们需要小心一点。这取决于基于 lats/lngs 知道最终结果在第 1 或第 4 个四分位数的位置。

如果结果在第 1 个四分位数,那么我们得到两者的绝对平均值并从 180 中减去结果,以补偿平均后的径向偏移。但如果已知输出在第 4 个四分位数,那么我们将其添加到 -180 中,如下面的代码片段所示:

LatLng getCenterLatLong(LatLng latLng1, LatLng latLng2) {
  double midLat, midLong;

  // Calculating midLat
  int coefficient = 1;

  if ((latLng1.latitude > 90 && latLng2.latitude < -90) || (latLng2.latitude > 90 && latLng1.latitude < -90)) {
    midLat = 180 - ((latLng1.latitude - latLng2.latitude) / 2).abs();
    // If output will be in the 1st quartile then co-ef will remain 1, if in 4th then it will be -1
    if ((latLng1.latitude < 0 && latLng1.latitude.abs() < latLng2.latitude.abs()) ||
        (latLng2.latitude < 0 && latLng2.latitude.abs() < latLng1.latitude.abs())) coefficient = -1;
    // Applying coefficient
    midLat *= coefficient;
  } else
    midLat = (latLng2.latitude + latLng1.latitude) / 2;

  // Calculating midLong
  coefficient = 1;

  if ((latLng1.longitude > 90 && latLng2.longitude < -90) || (latLng2.longitude > 90 && latLng1.longitude < -90)) {
    midLong = 180 - ((latLng1.longitude.abs() - latLng2.longitude.abs()) / 2).abs();
    // If output will be in the 1st quartile then co-ef will remain 1, if in 4th then it will be -1
    if ((latLng1.longitude < 0 && latLng1.longitude.abs() < latLng2.longitude.abs()) ||
        (latLng2.longitude < 0 && latLng2.longitude.abs() < latLng1.longitude.abs())) coefficient = -1;

    // Applying coefficient
    midLong *= coefficient;
  } else
    midLong = (latLng2.longitude + latLng1.longitude) / 2;

  return LatLng(midLat, midLong);
}

祝你好运。

答案 6 :(得分:-2)

求和纬度或经度的所有纬度和/数量赞:

double CenterLat = (lat1 + lat2 + lat3 + lat4 + lat5 + lat6) / 6;
double CenterLon = (lon1 + lon2 + lon3 + lon4 + lon5 + lon6) / 6;
LatLng Center = new LatLng(CenterLat, CenterLon);