如何从Polyline对象中提取两点间0°~360°方位角
解答
关于Polyline内置方法的说明
主流地图SDK(包括Google Maps、高德地图、百度地图、OSMDroid等)提供的Polyline类均无直接提取两点方位角的内置方法,Polyline仅负责线段渲染、样式配置、点集管理等视图相关能力,不包含地理计算类接口。
可行实现方案
你可以直接通过myPoint1和myPoint2的坐标自行计算0°~360°范围的方位角,分两种场景处理:
场景1:GeoPoint存储的是经纬度坐标
绝大多数MapView的GeoPoint默认存储WGS84/GCJ02等坐标系的经纬度,使用球面方位角公式计算即可:
// 计算起点到终点的方位角,返回值范围0°~360°,正北为0°,顺时针递增 private double calculateGeoAzimuth(GeoPoint start, GeoPoint end) { double lat1Rad = Math.toRadians(start.getLatitude()); double lon1Rad = Math.toRadians(start.getLongitude()); double lat2Rad = Math.toRadians(end.getLatitude()); double lon2Rad = Math.toRadians(end.getLongitude()); double dLon = lon2Rad - lon1Rad; double y = Math.sin(dLon) * Math.cos(lat2Rad); double x = Math.cos(lat1Rad) * Math.sin(lat2Rad) - Math.sin(lat1Rad) * Math.cos(lat2Rad) * Math.cos(dLon); double azimuth = Math.toDegrees(Math.atan2(y, x)); // 转换负角度到0~360范围 return (azimuth + 360) % 360; }
调用示例:
double lineAzimuth = calculateGeoAzimuth(myPoint1, myPoint2);
场景2:GeoPoint存储的是屏幕像素坐标
如果是自定义MapView用像素坐标存储点,适配屏幕Y轴向下的规则计算即可:
private double calculateScreenAzimuth(GeoPoint start, GeoPoint end) { double dx = end.getX() - start.getX(); double dy = end.getY() - start.getY(); // 屏幕Y轴向下,取反后适配正北向上的方位角规则 double azimuth = Math.toDegrees(Math.atan2(dx, -dy)); return (azimuth + 360) % 360; }
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

