Jeodezi
Jeodezi 是 Jeodezi (Kotlin 版本) 的 Dart 版本,它基于 Chris Veness 的优秀作品 Geodesy Functions。 Geodesy Functions 是用 JavaScript 编写的,包含数十种用于进行以下计算的函数:
- 大地测量计算(距离、方位角等),涵盖球面地球和椭球地球模型,以及三角学方法和向量方法。
- 椭球地球坐标系,涵盖历史基准和现代陆地参考系(TRFs)。
- 地图函数,包括 UTM/MGRS 和英国 OS 网格参考。
安装
在终端运行以下代码
dart pub add jeodezi
或者将以下代码添加到您的 pubspec.yaml 文件中
dependencies:
jeodezi: ^latest_version
用法
大圆计算
距离
要计算两个地理坐标之间的距离,可以使用 distance 方法。此方法将使用 Haversine 公式 计算两点之间的距离。结果将是以公里为单位的大圆距离。
final istCoordinates = Coordinate(41.28111111, 28.75333333); // The coordinates of Istanbul Airport
final jfkCoordinates = Coordinate(40.63980103, -73.77890015); // The coordinates of New York JFK Airport
final greatCircle = GreatCircle();
final distance = greatCircle.distance(istCoordinates, jfkCoordinates);
如果您想获得以海里为单位的距离,可以使用 distanceInNm 方法,参数相同。
方位角
此方法用于计算初始方位角(有时称为前向方位角),沿着大圆弧直线行驶可从起点到达终点。方位角以 0° 到 360° 为单位。
final istCoordinates = Coordinate(41.28111111, 28.75333333); // The coordinates of Istanbul Airport
final jfkCoordinates = Coordinate(40.63980103, -73.77890015); // The coordinates of New York JFK Airport
final greatCircle = GreatCircle();
final bearing = greatCircle.bearing(istCoordinates, jfkCoordinates);
中点
此方法计算大圆上起点和终点之间的中点。结果类型为 Coordinate。
final istCoordinates = Coordinate(41.28111111, 28.75333333); // The coordinates of Istanbul Airport
final jfkCoordinates = Coordinate(40.63980103, -73.77890015); // The coordinates of New York JFK Airport
final greatCircle = GreatCircle();
final midpoint = greatCircle.midpoint(istCoordinates, jfkCoordinates);
目标点
此方法根据给定的起点、初始方位角和距离,沿着(最短距离)大圆弧计算目标点和最终方位角。结果类型为 Coordinate。
final istCoordinates = Coordinate(41.28111111, 28.75333333); // The coordinates of Istanbul Airport
final jfkCoordinates = Coordinate(40.63980103, -73.77890015); // The coordinates of New York JFK Airport
final greatCircle = GreatCircle();
final bearing = greatCircle.bearing(istCoordinates, jfkCoordinates);
final distance = 1000; // km
final destination = greatCircle.destination(istCoordinates, distance, bearing); // The coordinates of point which is at 1000th km great circle between Istanbul Airport and JFK Airport
中间点
此函数返回起点和终点之间给定比例处的点。
final istCoordinates = Coordinate(41.28111111, 28.75333333); // The coordinates of Istanbul Airport
final jfkCoordinates = Coordinate(40.63980103, -73.77890015); // The coordinates of New York JFK Airport
final fraction = 0.25;
final intermediate = greatCircle.intermediate(istCoordinates, jfkCoordinates, fraction);
交叉点
此函数返回两条路径的交叉点,一条路径从第一个点开始,具有第一个方位角,另一条路径从第二个点开始,具有第二个方位角。
final istCoordinates = Coordinate(41.28111111, 28.75333333); // The coordinates of Istanbul Airport
final fcoCoordinates = Coordinate(41.8002778,12.2388889); // The coordinates of Roma Fiumicino Airport
final bearingFromIstanbulToWest = 270.0;
final bearingFromRomeToNorthEast = 45.0;
final intersection = greatCircle.intersection(istCoordinates, bearingFromIstanbulToWest, fcoCoordinates, bearingFromRomeToNorthEast);
横向距离
此函数返回当前点到起点和终点之间大圆的距离。
final istCoordinates = Coordinate(41.28111111, 28.75333333); // The coordinates of Istanbul Airport
final jfkCoordinates = Coordinate(40.63980103, -73.77890015); // The coordinates of New York JFK Airport
final fcoCoordinates = Coordinate(41.8002778,12.2388889); // The coordinates of Roma Fiumicino Airport
final crossTrackDistanceInKm = greatCircle.crossTrackDistance(fcoCoordinates, istCoordinates, jfkCoordinates);
纵向距离
此函数返回当前点沿从起点到终点的路径的距离。也就是说,如果从当前点向(大圆)路径绘制一条垂直线,纵向距离就是从起点到垂直线与路径交叉点的距离。
final istCoordinates = Coordinate(41.28111111, 28.75333333); // The coordinates of Istanbul Airport
final jfkCoordinates = Coordinate(40.63980103, -73.77890015); // The coordinates of New York JFK Airport
final fcoCoordinates = Coordinate(41.8002778,12.2388889); // The coordinates of Roma Fiumicino Airport
final alongTrackDistanceTo = greatCircle.alongTrackDistanceTo(fcoCoordinates, istCoordinates, jfkCoordinates);
最大纬度
此函数使用(Clairaut 公式)根据给定方位角从起点在圆上移动时达到的最大纬度。取负值可获得(南半球的)最小纬度。
final istCoordinates = Coordinate(41.28111111, 28.75333333); // The coordinates of Istanbul Airport
final bearingFromIstanbulToWest = 270.0;
final maxLatitude = greatCircle.maxLatitude(istCoordinates, bearingFromIstanbulToWest);
穿越子午线
此函数返回由两点定义的大圆穿过给定纬度的子午线对。如果大圆未达到给定纬度,则返回 null。
final istCoordinates = Coordinate(41.28111111, 28.75333333); // The coordinates of Istanbul Airport
final jfkCoordinates = Coordinate(40.63980103, -73.77890015); // The coordinates of New York JFK Airport
final latitude = 60.0; // means 60 degrees north
final crossingParallels = greatCircle.crossingParallels(istCoordinates, jfkCoordinates, latitude);
示例
您可以在仓库中找到一个使用 Jeodezi 库的示例应用程序。
贡献
Jeodezi 正在开发中。目前只有 Geodesy Functions 的一小部分函数被移植到了 Dart。还有很多工作要做,非常欢迎您的贡献。请随意 fork 仓库并提交 Pull Request。您可以帮助我们
- 单元测试
- 更好的示例
- 代码重构和优化
- 问题/错误
许可证
Jeodezi 根据 MIT 许可证 发布。