如果需要在地圖中繪制一個矩形嫁盲,例如停車位,長10米烈掠,寬5米羞秤,我們希望在地圖縮放過程中,這個停車位是可以根據(jù)地圖縮放放大縮小的左敌,我使用的辦法是通過停車位的中心點坐標瘾蛋,計算出四個頂點的坐標,然后繪制這個矩形矫限,這樣就可以保證無論怎么縮放和旋轉(zhuǎn)哺哼,這個停車位顯示的大小和角度都是符合實際的佩抹。
實現(xiàn)效果如下
地圖停車位截圖.png
/**
* 繪制旋轉(zhuǎn)的矩形 傳入該矩形的長寬 中心點的經(jīng)緯度 航向角
* @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;
}
左上角偏移角度計算,需要注意的是對角線的角度不是矩形的航向角取董,根據(jù)正北方向時的狀態(tài)推算出旋轉(zhuǎn)后的角度棍苹,圖中灰色對角線和紅色對角線的夾角就是我們的目標圖形的航向角和360的差值。
矩形左上角角度示例.png
/**
* 計算某點指定距離和角度的新的點的經(jīng)緯度
* @param lat 中心點的緯度
* @param lng 中心點的經(jīng)度
* @param angle 角度(相對于正北方向茵汰,順時針方向)
* @param distance 距離(單位:米)
* @return 新點的經(jīng)緯度數(shù)組 [緯度, 經(jīng)度]
*/
public static double[] getEndpoint(double lat, double lng, double angle, double distance) {
double angleRad = Math.toRadians(angle);
// 計算緯度變化
double dLat = distance / EARTH_RADIUS;
// 計算經(jīng)度變化
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);