如何根据缩放级别获得等于 Geozone 圆半径的像素数?或区域圆到屏幕像素的半径?
How to get number of pixels equals to a radius of Geozone circle according to zoom level? OR Radius of zone circle to screen pixels?
我正在 google 地图上创建地理区域。地图 API 提供的默认 Circle 在滚动地图时会滞后。所以,我想创建自己的圈子(覆盖在地图上)。我创建了半径为 300 米的固定圆。这个圆的宽度应该像默认的地图圆一样根据缩放级别改变。我写了一个如下的方法,通过将半径和缩放级别作为参数来计算像素。我还添加了默认圈子以验证我的圈子对不同地址的准确性。
//Adjusts the width and height of circle according to radius and zoom level
private void adjustCircleWidth(final LatLng center, final double zoom) {
//With inputs from topic "Zoom" from https://developers.google.com/maps/documentation/android-api/views
double widthOfWorldDP = 256 * Math.pow(2, zoom);
int radius = 300; //meters.
int circleWidthMeters = radius * 2; // *2 to get diameter or width.
//From google and alsop from this SOF post
int EQUATOR_LENGTH_METERS = 40075004; //in meters..
float dpOfCircle = (float) ((widthOfWorldDP * circleWidthMeters) / EQUATOR_LENGTH_METERS);
//converts dp to pixels depending on device density..
int pixels = (int) convertDpToPixels(dpOfCircle);
mCircleView.requestLayout();
mCircleView.getLayoutParams().height = pixels;
mCircleView.getLayoutParams().width = pixels;
}
好吧,这很好用。我开始验证其他位置然后它开始显示变化。圆形宽度小于地图的默认圆形。我对其进行了分析,以了解当我围绕赤道上的任何位置设置圆圈时,它会完美显示(与默认圆圈同步)。例如,圆圈与肯尼亚的默认位置完美同步,因为肯尼亚位于赤道上。请参阅随附的截图。如果我继续远离赤道,圆圈会从默认圆圈变得越来越小。比如说,对于德国来说,因为定位圈几乎是默认圈的一半...请参阅附件截图。
这是因为我使用的公式与赤道有关。
你能帮忙提供一些线索吗?
非常感谢Android Maps API v2 draw circle post。
我可以在给定纬度、经度和半径(从给定的纬度、经度)(以米为单位)的情况下以像素为单位计算圆的宽度。
private int convertZoneRadiusToPixels(double lat, double lng, double radiusInMeters) {
double EARTH_RADIUS = 6378100.0;
double lat1 = radiusInMeters / EARTH_RADIUS;
double lng1 = radiusInMeters / (EARTH_RADIUS * Math.cos((Math.PI * lat / 180)));
double lat2 = lat + lat1 * 180 / Math.PI;
double lng2 = lng + lng1 * 180 / Math.PI;
Point p1 = mMap.getProjection().toScreenLocation(new LatLng(lat, lng));
Point p2 = mMap.getProjection().toScreenLocation(new LatLng(lat2, lng2));
return Math.abs(p1.x - p2.x);
}
我正在 google 地图上创建地理区域。地图 API 提供的默认 Circle 在滚动地图时会滞后。所以,我想创建自己的圈子(覆盖在地图上)。我创建了半径为 300 米的固定圆。这个圆的宽度应该像默认的地图圆一样根据缩放级别改变。我写了一个如下的方法,通过将半径和缩放级别作为参数来计算像素。我还添加了默认圈子以验证我的圈子对不同地址的准确性。
//Adjusts the width and height of circle according to radius and zoom level
private void adjustCircleWidth(final LatLng center, final double zoom) {
//With inputs from topic "Zoom" from https://developers.google.com/maps/documentation/android-api/views
double widthOfWorldDP = 256 * Math.pow(2, zoom);
int radius = 300; //meters.
int circleWidthMeters = radius * 2; // *2 to get diameter or width.
//From google and alsop from this SOF post
int EQUATOR_LENGTH_METERS = 40075004; //in meters..
float dpOfCircle = (float) ((widthOfWorldDP * circleWidthMeters) / EQUATOR_LENGTH_METERS);
//converts dp to pixels depending on device density..
int pixels = (int) convertDpToPixels(dpOfCircle);
mCircleView.requestLayout();
mCircleView.getLayoutParams().height = pixels;
mCircleView.getLayoutParams().width = pixels;
}
好吧,这很好用。我开始验证其他位置然后它开始显示变化。圆形宽度小于地图的默认圆形。我对其进行了分析,以了解当我围绕赤道上的任何位置设置圆圈时,它会完美显示(与默认圆圈同步)。例如,圆圈与肯尼亚的默认位置完美同步,因为肯尼亚位于赤道上。请参阅随附的截图。如果我继续远离赤道,圆圈会从默认圆圈变得越来越小。比如说,对于德国来说,因为定位圈几乎是默认圈的一半...请参阅附件截图。
这是因为我使用的公式与赤道有关。
你能帮忙提供一些线索吗?
非常感谢Android Maps API v2 draw circle post。
我可以在给定纬度、经度和半径(从给定的纬度、经度)(以米为单位)的情况下以像素为单位计算圆的宽度。
private int convertZoneRadiusToPixels(double lat, double lng, double radiusInMeters) {
double EARTH_RADIUS = 6378100.0;
double lat1 = radiusInMeters / EARTH_RADIUS;
double lng1 = radiusInMeters / (EARTH_RADIUS * Math.cos((Math.PI * lat / 180)));
double lat2 = lat + lat1 * 180 / Math.PI;
double lng2 = lng + lng1 * 180 / Math.PI;
Point p1 = mMap.getProjection().toScreenLocation(new LatLng(lat, lng));
Point p2 = mMap.getProjection().toScreenLocation(new LatLng(lat2, lng2));
return Math.abs(p1.x - p2.x);
}