Non-existent987头像

把 TableGIS 里的地理算法开源了:Haversine、坐标系互转、度分秒,JS / C# / Python 三份

处理经纬度表格这几年,被反复问到同一个问题:「两点距离怎么算」「高德抓的坐标和 GPS 对不上」「度分秒怎么批量转十进制」。

这些都不是难题,但每次都要重新翻一遍公式、重新对一遍常数,很浪费时间。所以我把 TableGIS 插件里用的那套通用地理算法单独拎出来,开源成了一个 core/ 目录,JS、C#、Python 三种实现,零依赖,MIT。

仓库里有什么

目录内容
core/地理计算算法核心,JS / C# / Python 三份实现,与插件内部实现一致
docs/完整功能清单、安装激活、表格公式用法、FAQ、更新日志
screenshots/插件界面截图

core/ 的文件很少:

core/js/geo.js
core/csharp/GeoCalculator.cs
core/csharp/CoordinateConverter.cs
core/python/tablegis_geo.py

提供的函数:

函数说明
distance(lon1, lat1, lon2, lat2)Haversine 球面距离,米,地球半径 6371000
azimuth(lon1, lat1, lon2, lat2)大圆初始方位角,0–360°,正北 0°、顺时针
wgs84ToGcj02 / gcj02ToWgs84GPS 原始坐标 ↔ 高德/腾讯坐标
gcj02ToBd09 / bd09ToGcj02高德 ↔ 百度坐标
wgs84ToBd09 / bd09ToWgs84GPS ↔ 百度坐标
decToDms / dmsToDec十进制 ↔ 度分秒,兼容常见书写格式

三种语言结果一致,已互校。

直接能用

JavaScript:

import { distance, azimuth, wgs84ToGcj02 } from './core/js/geo.js';

distance(116.3975, 39.9087, 121.4737, 31.2304);  // 1068138.868(米)
azimuth(116.3975, 39.9087, 121.4737, 31.2304);   // 153.038361(东南)
wgs84ToGcj02(116.3975, 39.9087);                 // { lng: 116.40374357, lat: 39.91010350 }

Python(附了 pandas 向量化示例,整列一起算):

from tablegis_geo import distance, azimuth, wgs84_to_gcj02

distance(116.3975, 39.9087, 121.4737, 31.2304)   # 1068138.868
wgs84_to_gcj02(116.3975, 39.9087)                # (116.40374357, 39.9101035)

C#:

using TableGis.Core;

double m  = GeoCalculator.CalculateDistance(116.3975, 39.9087, 121.4737, 31.2304);
double az = GeoCalculator.CalculateAzimuth(116.3975, 39.9087, 121.4737, 31.2304);
var (lng, lat) = CoordinateConverter.Wgs84ToGcj02(116.3975, 39.9087);

三个容易忽略的坑

坐标系不统一,是表格数据里最大的坑。 手机 GPS 记的是 WGS84,高德抓的是 GCJ02,百度抓的是 BD09。同一套点混着算距离,误差从几米到几百米。天安门那个点,WGS84 是 116.391184, 39.907826,GCJ02 是 116.397428, 39.90923,差约 500 米。放进地图就是两条街。

境外坐标不做偏移。 GCJ02 的加密偏移只在中国境内生效,实现里按 73.66 < lng < 135.05 && 3.86 < lat < 53.55 判断,境外原样返回。拿境外点做批量转换时,别看到「数值没变」就以为函数坏了。

GCJ02 → WGS84 是近似逆算。 正向偏移有明确公式,反向没有解析解,实现用迭代逼近。做区域统计、点位展示完全够,做厘米级测绘请走专业测绘数据源。

另外度分秒解析兼容 116°23′45″、116 23 45、116°23'45"E 这类写法,从工参表里粘过来的脏格式基本能直接吃。

在插件里对应哪些功能

这套 core/ 就是 TableGIS 里下列功能底下的计算:

  • 距离 / 方位角:选中四列,一次算出所有点对的球面距离和方位角
  • 表格公式 =tablegis.DIS(...) / =tablegis.AZ(...):在单元格里直接算,支持下拉填充;跟点按钮的区别是它是活的,源数据改了结果跟着变
  • 坐标转换六个方向:GPS转百度、GPS转高德、高德转GPS、百度转GPS,以及反向
  • 十进制 ↔ 度分秒:批量互转
  • 单表 / 双表最近点、经纬度距离聚类、站间距计算:距离矩阵都基于同一个 Haversine 实现

最后

docs/ 目录里有完整的功能清单、公式用法和 FAQ,写脚本处理经纬度的时候可以直接翻。算法有对不上的地方、或者想补一种语言的实现,欢迎提 issue。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/u011263442/article/details/170490690

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--