CoordCalc 测绘计算器

开发者指南:URL 参数、嵌入与 JavaScript API

每一个 CoordCalc 计算器都可以从页面外部驱动。有三条入口,彼此独立:查询字符串可以为任意工具预填参数; 嵌入模式把工具变成一块无外壳的面板,供 iframe 使用;以及 window.Geo, 即计算器背后、可直接调用的大地测量库。不需要 API 密钥、不需要账号、没有频率限制—— 算术都在访问者的浏览器里完成。

三条入口

入口什么时候用从这里开始
查询字符串 你手上有一个坐标、一个数值或一整份清单,想让计算器打开时就已经填好—— 来源可以是电子表格、CMS 字段、邮件里的链接或一个 <a href>。 参数速查
iframe 嵌入 这个计算器该出现在你自己的页面或内网里,但你不想重做一遍。 加上 embed=1,页头、正文和页脚就都不见了。 嵌入方法
window.Geo 你要的是数字,不是界面——批量处理坐标文件、构建步骤中调用, 或者在同一个引擎上搭你自己的 UI。 JavaScript API

查询字符串 API

参数只在页面加载时读取一次。工具不认识的内容一律忽略, 所以 URL 里混进一个多余参数绝不会弄坏计算器——它只是不起作用,工具照常使用默认值。 参数值必须做 URL 编码,而 + 会被解码为空格,所以粘贴进来的坐标清单可以安全传递。

一旦你开始操作某个工具,它就用 history.replaceState 改写自己的地址, 因此刷新、收藏或复制地址栏,都能原样复现屏幕上的状态。这个过程不会重新加载页面, 也不会多出一条可以往回点的历史记录。在嵌入模式下,工具完全不碰 URL。

坐标类工具

参数含义可接受的值
lat正算标签页的纬度十进制度或度分秒:43.642567、N 43 38 33.2
lon正算标签页的经度-79.387139、79°23′13.7″W。别名:lng、long、longitude
e反算标签页的东坐标,单位米任意数字。别名:easting、x
n反算标签页的北坐标,单位米任意数字。别名:northing、y
zoneUTM 带号17 或 17N——末尾的 N 或 S 同时会设定半球
hemi半球,用于带号不带字母时N 或 S
mode强制指定标签页,而不做推断fwd、inv、batch
text供批量标签页使用的粘贴坐标清单URL 编码,换行写作 %0A。别名:coords、csv
dir批量换算方向fwd、inv、mgrs
digitsMGRS 精度0(100 km)到 5(1 m),默认 5
mgrs在批量结果中隐藏 MGRS 列0
dms在批量结果中增加一列度分秒1
embed无外壳布局1

如果没有传 mode,标签页就由你实际传了的参数来推断: 一对经纬度选中正算标签页,一对东西坐标选中反算标签页,带 text 则选中批量。

下面四个链接是现成可用的——点开,答案就在屏幕上:

单位换算器

参数含义可接受的值
mode哪一类单位len、area、ang——也接受 length 和 angle
value要换算的数值任意数字。别名:v
from源单位键见下方键列表
to目标单位键见下方键列表

长度键: m ft usft in cm km yd ch lk rd fur fath mi nmi lea vara.
面积键: m2 ft2 acre ha usacre km2 mi2 yd2 are rood sqch sqrd section township.
角度键: deg dms rad grad milN milA turn amin asec.

你不一定要传 mode。如果没传,换算器会查 from 这个键, 自动切到包含它的那一类,所以 ?value=1&from=acre&to=ha 不用再给别的提示就会落到面积标签页。无法识别的单位键会被忽略,改用该类别的默认单位。

实时构建一个链接

改一下字段,下面的 URL 会立刻更新。按 预览 把这个 URL 原样加载到下方的框架里, 效果就等同于你自己页面上的一枚 iframe 会显示的内容。

在新标签页打开

把计算器嵌入你自己的页面

加上 embed=1,页面会隐藏除计算器以外的一切:没有页头、没有面包屑、 没有大标题、没有正文、没有页脚。剩下的就是工具卡片本身,按它的自然高度呈现,随时可以放进框架。

<iframe
  src="https://coordcalc.com/utm-coordinate-converter?embed=1&lat=43.642567&lon=-79.387139"
  title="UTM 与经纬度互转"
  width="100%" height="560" style="border:1px solid #cfd6e0;border-radius:12px"
  loading="lazy"></iframe>

有三个细节值得保留。给框架一个 title,因为屏幕阅读器会朗读它, 而没有标题的框架在无障碍上是一条死路。用 loading="lazy", 这样长页面下方的工具在你滚动到它之前不产生任何开销。最后,按最高的那个标签页来设定框架高度, 而不是按你链接过去的那个,这样在框架内切换标签页时不会冒出滚动条。

被嵌入的工具建议高度说明
utm-coordinate-converter560 px批量标签页是最高的状态;如果你直接链接到它,再加 120 px
unit-converter620 px结果列表很长;角度标签页最高
dms-converter560 px单个坐标对
mgrs-converter560 px单条格网参考号
state-plane-converter640 px投影带选择器加上若干结果行
land-area-calculator720 px坐标输入表会随点数增加而变高

被嵌入的工具与独立页面是同一份文档,所以每种行为都保留:标签页可以切换、 结果随输入实时重算、复制链接能生成 URL、批量标签页照旧导出 CSV。 它同时也很安静——嵌入环境下的计算不写 Cookie、不发请求,也绝不触碰父页面。 请在承载嵌入的页面上保留一个指向该工具的可见链接;没有任何署名的孤立框架,是我们唯一请你避免的用法。

实时示例——下面的框架就是 utm-coordinate-converter?embed=1&lat=43.642567&lon=-79.387139:

JavaScript API — window.Geo

所有计算器都运行在同一个共享库上,它被内联进每个工具页面,并以全局 Geo 暴露。 打开任意一个工具,进到浏览器控制台,它就在那里:

> Geo.utmForward(43.642567, -79.387139)
{ zone: 17, north: true, band: "T", centralMeridian: -81,
  easting: 630084.3008341495, northing: 4833438.585674161,
  convergence: 1.1133056360734274, scaleFactor: 0.9998080873147939 }

它是无依赖、不访问 DOM 的纯 ES5,所以同一个文件在 Node 下也能用: 库的结尾是 module.exports = Geo,这意味着构建脚本或测试框架 可以直接把它从页面里取出来 require。

函数

调用返回
Geo.utmForward(lat, lon){ zone, north, band, centralMeridian, easting, northing, convergence, scaleFactor }
Geo.utmInverse(easting, northing, zone, north){ lat, lon, iterations }
Geo.utmZone(lon)仅由经度得到的带号,1–60
Geo.utmZoneAt(lat, lon)带号,已计入挪威与斯瓦尔巴的例外
Geo.centralMeridian(zone)该带中央经线的经度,单位度
Geo.utmBand(lat)纬度带字母 C–X,超出南纬 80°–北纬 84° 时返回 ""
Geo.mgrsForward(lat, lon, digits){ mgrs, square, zone, band, digits, easting, northing },超出 UTM 纬度带时返回 null
Geo.mgrsInverse("17TPJ3008433438"){ lat, lon, zone, band, easting, northing },字符串不是有效参考号时返回 null
Geo.vincentyInverse(lat1, lon1, lat2, lon2){ distance, initialBearing, finalBearing, converged }——单位米与度
Geo.haversineDistance(lat1, lon1, lat2, lon2)球面距离,单位米,用于 Vincenty 不收敛的近对跖点
Geo.polygonArea([[lat, lon], …]){ area, perimeter, centroid, orientation, span, geodesicPerimeter, box },点数少于三个时返回 null
Geo.localPlane(coords, lat0, lon0)[{ x, y }, …]——以 lat0, lon0 为中心的切平面上的多边形
Geo.parseAngle(text, "lat" | "lon")带符号的十进制度,或 NaN
Geo.formatDMS(value, dp, "lat" | "lon")格式化字符串,例如 N 43° 38′ 33.200″
Geo.bearingToAzimuth(angle, "N", "W")圆周方位角,单位度
Geo.azimuthToBearing(135){ quadrant, angle, ns, ew, text }——text 形如 "S 45.0000° E"
Geo.compassPoint(112.5)"ESE"——十六方位之一
Geo.isNorthBand(band)从 N 带起为 true
Geo.fmt(value, dp)带千分位的字符串,数值非有限时返回 "—"

算例

下面的每个数值都由这个库自己算出;在任何工具页面上跑同样的代码,得到的就是同样的数字。

// 多伦多 CN 塔:经纬度 -> UTM
var u = Geo.utmForward(43.642567, -79.387139);
Geo.fmt(u.easting, 3);      // "630,084.301"
Geo.fmt(u.northing, 3);     // "4,833,438.586"
u.zone + u.band;            // "17T"
Geo.fmt(u.scaleFactor, 7);  // "0.9998081"

// 再转回去
var g = Geo.utmInverse(630084.301, 4833438.586, 17, true);
Geo.fmt(g.lat, 8);          // "43.64256700"
Geo.fmt(g.lon, 8);          // "-79.38713900"

// MGRS
Geo.mgrsForward(43.642567, -79.387139, 5).mgrs;   // "17TPJ3008433438"
Geo.mgrsInverse("17TPJ3008433438");               // { lat, lon, zone: 17, band: "T", … }

// 椭球距离与方位角,多伦多到北京
var d = Geo.vincentyInverse(43.642567, -79.387139, 39.906111, 116.3974);
Geo.fmt(d.distance, 1);      // "10,616,473.2"  metres
Geo.fmt(d.initialBearing, 4);// "347.9204"      degrees
d.converged;                 // true

// 由地块各角点算地表面积与周长
var parcel = [[43.641000, -79.388000], [43.641000, -79.385517],
              [43.642356, -79.385517], [43.642356, -79.388000]];
var a = Geo.polygonArea(parcel);
Geo.fmt(a.area, 1);          // "30,184.0"      square metres
Geo.fmt(a.perimeter, 2);     // "702.01"        metres
a.orientation;               // "counter-clockwise"

polygonArea 需要多解释一句。它把多边形环投影到以自身重心为中心的切平面上 (也就是 localPlane 返回的东西),所以得到的是地表面积而不是 Web 墨卡托面积, 并且在任何纬度都成立。顶点的绕行方向无所谓:鞋带公式取的是绝对值, orientation 只是告诉你绕行方向是哪一边。 perimeter 由各边上的 Vincenty 距离累加而成,因此是椭球长度; geodesicPerimeter 告诉你 Vincenty 是否在每一条边上都收敛。

常量

Geo.UNITS 带着这些工具赖以建立的换算系数,调用方无需重述: M_PER_FT 0.3048、M_PER_MI 1609.344、 M_PER_NM 1852、HA_M2 10000、ACRE_M2 4046.8564224, 以及 SQFT_PER_M2 10.763910416709722。椭球参数在 Geo.A(6378137 m)和 Geo.F(1 / 298.257223563)上,对应 WGS84。

精度,以及一个注意事项

横轴墨卡托级数用的是公开那一套,反算用牛顿迭代求解而不是截断的反向级数。 对照 PROJ——pyproj 与 QGIS 背后的参考实现——在从赤道到北纬 78°、经度 0° 到 180° 的测试点上,东坐标优于 0.1 mm,北坐标优于 0.9 mm。 正算再反算的往返闭合差在几纳米量级,也就是说,这已经是双精度浮点的极限。

注意事项是 MGRS。17TPJ3008433438 这样的五位参考号命名的不是一个点, 而是一个 1 m 见方的方格,mgrsInverse 返回的是该方格的西南角。 转成 MGRS 再转回来,你应该预期落点离出发点最多差约 1.4 m——这是格式使然,不是错误。 改用六位数字,方格就是 0.1 m 见方。

参考值

纬度, 经度投影带东坐标 (m)北坐标 (m)MGRS
43.642567, −79.38713917N630,084.3014,833,438.58617TPJ3008433438
51.4779, −0.001530N708,213.4955,707,235.66130UYC0821307235
−33.856944, 151.21527856S334,898.8116,252,272.74856HLH3489852272
39.906111, 116.397450N448,491.6964,417,510.31550SMK4849117510

南半球的北坐标包含 10,000,000 m 的假北向平移值,与测量图纸上印的一致。

注意事项、限制与条款

相关计算器

常见问题

可以直接用链接预填计算器吗?

可以。每个工具都会从查询字符串读取状态。?lat=43.642567&lon=-79.387139 打开 UTM 转换器时已经换算完毕;?value=100&from=usft&to=m 打开单位换算器并停在测量英尺换算上。缺失或无法识别的参数会被忽略,工具回退到自己的默认值。

需要 API 密钥吗?有调用频率限制吗?

都不需要。页面是静态的,每次计算都在访问者的浏览器里完成,因此没有什么需要授权,也没有什么是需要计量的。任何坐标都不会被发送到服务器。

怎么把计算器嵌入我自己的页面?

加上 embed=1,再用 iframe 加载这个 URL。它会隐藏页头、面包屑、正文和页脚,单坐标类工具的框架高度约 520 px。框架内一切照常工作,包括切换标签页和导出 CSV。

window.Geo 是什么?

是内联在工具页面里的共享大地测量库,基于 WGS84 椭球。它暴露 utmForward、utmInverse、mgrsForward、mgrsInverse、vincentyInverse、polygonArea、parseAngle 等函数,以及单位常量。它是无依赖的 ES5,同时通过 module.exports 导出,可在 Node 中使用。

UTM 转换的精度如何?

对照 PROJ,从赤道到北纬 78° 的测试点上东坐标优于 0.1 mm、北坐标优于 0.9 mm,正算再反算的往返闭合差在几纳米量级。反算是用牛顿迭代求解的,不是截断的反向级数。

为什么 MGRS 往返换算会差出一米左右?

因为五位参考号命名的是一个 1 m 见方的方格而不是一个点,反算返回的是该方格的西南角。偏差可达约 1.4 m。用六位数字,方格就是 0.1 m 见方。

所有计算均在浏览器本地完成,结果仅供核对与参考;用于施工、放样或结算前, 请按项目采用的坐标系统与技术标准复核。 关于 · 隐私与 Cookie · 使用条款 · 开发者