如果需要在地图中绘制一个矩形,例如停车位,长10米,宽5米,我们希望在地图缩放过程中,这个停车位是可以根据地图缩放放大缩小的,我使用的办法是通过停车位的中心点坐标,计算出四个顶点的坐标,然后绘制这个矩形,这样就可以保证无论怎么缩放和旋转,这个停车位显示的大小和角度都是符合实际的。
实现效果如下
地图停车位截图.png
/**
* 绘制旋转的矩形 传入该矩形的长宽 中心点的经纬度 航向角
* @param centerLat
* @param centerLon
* @param width
* @param height
* @param heading
* @return
*/
public static GeoPoint[] calculateCornerCoordinates(double centerLat, double centerLon, double width, double height, double heading) {
double angle = calculateAngle(width/2,height/2);
double offsetangle = 360-heading; //相对于正北方向偏移的角度
double topLeft = 360-(90-(angle-offsetangle)); //如下图
double botomRight = 90+(angle-offsetangle);
double topRight = 90-angle-offsetangle;
double botomLeft = 180+ (90-angle-offsetangle);
double c = Math.sqrt(width * width + height * height); //矩形对角线的长度
double[] point1 = MapPointUtil.getEndpoint(centerLat, centerLon, topLeft, c/2);
double[] point2 = MapPointUtil.getEndpoint(centerLat, centerLon, botomRight, c/2);
double[] point3 = MapPointUtil.getEndpoint(centerLat, centerLon, topRight, c/2);
double[] point4 = MapPointUtil.getEndpoint(centerLat, centerLon, botomLeft, c/2);
double[][] corners = {
{point1[0],point1[1]},
{point3[0],point3[1]},
{point2[0],point2[1]},
{point4[0],point4[1]}
};
GeoPoint[] geoPoints = new GeoPoint[corners.length];
for (int i = 0; i < corners.length; i++) {
geoPoints[i] = new GeoPoint(corners[i][0], corners[i][1]);
}
return geoPoints;
}
左上角偏移角度计算,需要注意的是对角线的角度不是矩形的航向角,根据正北方向时的状态推算出旋转后的角度,图中灰色对角线和红色对角线的夹角就是我们的目标图形的航向角和360的差值。
矩形左上角角度示例.png
/**
* 计算某点指定距离和角度的新的点的经纬度
* @param lat 中心点的纬度
* @param lng 中心点的经度
* @param angle 角度(相对于正北方向,顺时针方向)
* @param distance 距离(单位:米)
* @return 新点的经纬度数组 [纬度, 经度]
*/
public static double[] getEndpoint(double lat, double lng, double angle, double distance) {
double angleRad = Math.toRadians(angle);
// 计算纬度变化
double dLat = distance / EARTH_RADIUS;
// 计算经度变化
double dLng = distance / (EARTH_RADIUS * Math.cos(Math.toRadians(lat)));
double newLat = lat + Math.toDegrees(dLat * Math.cos(angleRad));
double newLng = lng + Math.toDegrees(dLng * Math.sin(angleRad));
return new double[]{newLat, newLng};
}
通过上面的计算就可以得到矩形四个顶点的坐标,然后绘制到地图中即可
GroundOverlay groundOverlay2 = new GroundOverlay();
groundOverlay2.setImage(pointBit);
// 计算四个顶点的坐标
GeoPoint[] corners2 = MapPointUtil.calculateCornerCoordinates("alt", "lng", 6, 10, 171.850f);
groundOverlay2.setPosition(corners2[0],
corners2[1],
corners2[2],
corners2[3]
);
binding.mapview.getOverlays().add(groundOverlay2);