处理经纬度表格这几年,被反复问到同一个问题:「两点距离怎么算」「高德抓的坐标和 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 / gcj02ToWgs84 | GPS 原始坐标 ↔ 高德/腾讯坐标 |
gcj02ToBd09 / bd09ToGcj02 | 高德 ↔ 百度坐标 |
wgs84ToBd09 / bd09ToWgs84 | GPS ↔ 百度坐标 |
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



