任何人都可以帮助我获得中心点。我有6个LatLng对象,现在我需要让LatLng对象居中。非常感谢!
答案 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)
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)
我们想要获得所有给定坐标的最小和最大纬度,而不是从中选择最极端/最远的坐标。 这可以通过以下方式实现:
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];
}
我们将以类似的方式处理纬度和经度,但在此之前我们需要知道它们的限制是 180
和 -180
,并且这两个限制物理接触。所以我们需要小心,不要只是得到两个值的平均值(如 (180+ -180)/2 = 0
是地球的完全相反的一面!!)
求平均数不会有问题,但当距离值差异 <= 90
并且求平均值最安全的部分是在 -90
和 90
之间时,换句话说,在第二和第三四分位数。
但是在第 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);