【发布时间】:2015-08-12 16:44:56
【问题描述】:
Google 地图和 MSSQL 在如何使用 SRID 4326 计算折线/线串的距离/长度方面似乎存在分歧。
MSSQL:
SELECT geography::STGeomFromText('LINESTRING(-98.78 39.63,2.98 27.52)', 4326).STLength()
结果:9030715.95721209
然后是谷歌地图:
http://jsbin.com/niratiyojo/1/
结果:9022896.239500616
起初我以为这只是地球测量的不同半径,所以我尝试了一下,结果发现它更多。
我需要我的 JavaScript 界面与 MSSQL 报告的内容相匹配,以保持一致和准确。我在哪里或如何找到 MSSQL 如何计算它们的 STLength() 以及它可以在 JavaScript 中复制吗?
更新:
我意识到如果我这样做了
SELECT GEOGRAPHY::STGeomFromText('LINESTRING(-98.78 39.63,2.98 27.52)', 104001).STLength() * 6378137
然后MSSQL返回9022896.23950062
MSSQL 中的新 SRID:
新的“单位球体”空间参考 ID 默认空间参考 SQL Server 2012 中的 ID (SRID) 是 4326,它使用公制作为 它的计量单位。这个 SRID 也代表了真实的 地球的椭球体形状。虽然这种表示是 最准确,计算精确椭球也更复杂 数学。 SQL Server 2012 在速度和 准确度,通过添加新的空间参考 ID (SRID) 104001, 使用半径为 1 的球体来表示一个完美的圆形地球。
所以问题是谷歌地图在计算中没有使用真正的椭球体。我正在寻找一个 javascript 函数,它得到 9030715.95721209 的见证。
我在这里尝试了 Vincenty 直接公式:http://jsbin.com/noveqoqepa/1/edit?html,js,console,虽然它更接近我仍然无法匹配 MSSQL
编辑 2:
我能够找到它使用的测量值:
SridList._sridList.Add(4326, new SridInfo(4326, "EPSG", 4326, "GEOGCS[\"WGS 84\", DATUM[\"World Geodetic System 1984\", ELLIPSOID[\"WGS 84\", 6378137, 298.257223563]], PRIMEM[\"Greenwich\", 0], UNIT[\"Degree\", 0.0174532925199433]]", "metre", 1.0, 6378137.0,
6356752.314));
但似乎将这些插入 Vincenty 并没有运气。
【问题讨论】:
-
我唯一能发现的是,半短轴倾向于多表示两位小数,这对整体结果的影响为零。我真的不知道 MSSQL 是如何确定它的距离的。
-
使用Live examples on the Vincenty solutions of geodesics on the ellipsoid page 下的表格我得到 9,030,706.728 m,这非常接近 9030715.95721209(9x10^9 米中的 9 米)
-
是的,这也是我使用帖子底部发布的 jsbin 解决方案获得的相同距离。它非常接近,但我需要更准确。
-
我不认为 Maps API 中提供的功能适用于需要您正在寻找的极端精度的重型 GIS 应用程序。对于这些类型的应用程序,您最好找到一些其他满足您特定需求的库并使用它。你可以试试github.com/chrisveness/geodesy,虽然我不确定它是否会给你比其他人提到的库更准确的计算。
标签: javascript sql-server google-maps gis sqlgeography