有没有办法从中间点找到可见地图的半径?
我希望从API获取靠近地图中心点的近处,并且该API需要lat,lng和radius。我能够从中心点获得lat和lng,但无法找到获得半径的方法。
感谢
答案 0 :(得分:18)
对于Google Maps Android API,您可以通过...
获取界限从地图参考中,Projection
获取getProjection()。和,
投影用于在屏幕位置和地理坐标之间进行转换..
因此,从投影中,我们可以使用getVisibleRegion(),并获取地图的VisibleRegion,其中包含LatLngBounds,这是一个包含2 {{1}的类变量,一个用于边界的东北角,一个用于西南角。
所以代码看起来应该是这样的:
LatLng
= - = - = - = - = - = 编辑:
可能我太天真了,只考虑NE和SW可以解决这个问题,但仅限于用户没有旋转地图或向上倾斜3D地图的特殊情况。
相反,您可以抓住 googleMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition position) {
LatLngBounds bounds = googleMap.getProjection().getVisibleRegion().latLngBounds;
LatLng northeast = bounds.northeast;
LatLng southwest = bounds.southwest;
Context context = getApplicationContext();
CharSequence text = "ne:"+northeast+" sw:"+southwest;
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, text, duration);
toast.show();
}
});
,它提供了4个变量,farRight,farLeft,nearRight,nearLeft,每个代表该区域的4个连接器。
然后我们可以计算该4个点的区域的宽度和高度,并选择较小的一个(好吧,有时宽度可能比我猜的高度。)
为了计算,我们可以使用VisibleRegion
函数...
使代码如下所示:
Location.distanceBetween(x1,y1,x2,y2,result)
答案 1 :(得分:7)
非常感谢你的答案 @kaho ,它帮了我很多(甚至你以同样的方式计算了distanceWidth和distanceHeight)。
澄清:
farLeft LatLng对象,用于定义摄像机的左上角。
farRight LatLng对象,用于定义相机的右上角。
nearLeft LatLng对象,用于定义摄像机的左下角。
nearRight LatLng对象,用于定义相机的右下角。
已编辑:我不知道为什么我们进行简单的计算会变得有点复杂,可见半径只是 A HALF OF VISIBLE DIAGONAL LINE , #39;全部!
private double getMapVisibleRadius() {
VisibleRegion visibleRegion = map.getProjection().getVisibleRegion();
float[] diagonalDistance = new float[1];
LatLng farLeft = visibleRegion.farLeft;
LatLng nearRight = visibleRegion.nearRight;
Location.distanceBetween(
farLeft.latitude,
farLeft.longitude,
nearRight.latitude,
nearRight.longitude,
diagonalDistance
);
return diagonalDistance[0] / 2;
}
我还记录了我的搜索结果,以便与@ jossef-harush的搜索结果进行比较,大致如下:
答案 2 :(得分:2)
我没有看到其他答案涵盖整个地图区域;
见下面的图片,为了测试它我绘制了一个圆形覆盖图来查看计算半径的边界,它不会覆盖整个地图区域。
我的修改很简单,我已经使用Pythagorean theorem找到合适的半径来包含地图"矩形"。
private double getMapVisibleRadius() {
VisibleRegion visibleRegion = googleMap.getProjection().getVisibleRegion();
float[] distanceWidth = new float[1];
float[] distanceHeight = new float[1];
LatLng farRight = visibleRegion.farRight;
LatLng farLeft = visibleRegion.farLeft;
LatLng nearRight = visibleRegion.nearRight;
LatLng nearLeft = visibleRegion.nearLeft;
Location.distanceBetween(
(farLeft.latitude + nearLeft.latitude) / 2,
farLeft.longitude,
(farRight.latitude + nearRight.latitude) / 2,
farRight.longitude,
distanceWidth
);
Location.distanceBetween(
farRight.latitude,
(farRight.longitude + farLeft.longitude) / 2,
nearRight.latitude,
(nearRight.longitude + nearLeft.longitude) / 2,
distanceHeight
);
double radiusInMeters = Math.sqrt(Math.pow(distanceWidth[0], 2) + Math.pow(distanceHeight[0], 2)) / 2;
return radiusInMeters;
}
答案 3 :(得分:1)
对于Kotlin用户,请从setOnCameraIdleListener
调用此函数
private fun getMapVisibleRadius(): Double {
val visibleRegion: VisibleRegion? = mMap?.projection?.visibleRegion
val distanceWidth = FloatArray(1)
val distanceHeight = FloatArray(1)
val farRight: LatLng? = visibleRegion?.farRight
val farLeft: LatLng? = visibleRegion?.farLeft
val nearRight: LatLng? = visibleRegion?.nearRight
val nearLeft: LatLng? = visibleRegion?.nearLeft
Location.distanceBetween((farLeft!!.latitude + nearLeft!!.latitude) / 2,
farLeft.longitude,
(farRight!!.latitude + nearRight!!.latitude) / 2,
farRight.longitude, distanceWidth)
Location.distanceBetween(farRight.latitude,
(farRight.longitude + farLeft.longitude) / 2,
nearRight.latitude,
(nearRight.longitude + nearLeft.longitude) / 2,
distanceHeight)
return Math.sqrt((Math.pow(distanceWidth[0].toString().toDouble(), 2.0))
+ Math.pow(distanceHeight[0].toString().toDouble(), 2.0)) / 2
}
答案 4 :(得分:0)
编辑:以下答案适用于Google Maps JavaScript API v3
= - = - = - = - = - = - =
我认为答案是:是的,你可以。
根据documentation,您可以按以下方式计算2点之间的距离:computeDistanceBetween(LatLngFrom, LatLngTo)
您也可以使用getBounds()
中的{{1}}方法获取地图的边界。