Par*_*roX 16 javascript sql-server gis google-maps sqlgeography
谷歌地图和MSSQL似乎不同意如何使用SRID 4326计算折线/线串的距离/长度.
MSSQL:
SELECT geography::STGeomFromText('LINESTRING(-98.78 39.63,2.98 27.52)', 4326).STLength()
Run Code Online (Sandbox Code Playgroud)
结果: 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
Run Code Online (Sandbox Code Playgroud)
然后MSSQL返回 9022896.23950062
MSSQL中的新SRID:
新的"单位球体"空间参考ID SQL Server 2012中的默认空间参考ID(SRID)为4326,它使用公制系统作为其度量单位.该SRID也代表地球真正的椭球形状.虽然这种表示最准确,但计算精确椭球数学也更复杂.SQL Server 2012通过添加新的空间参考ID(SRID)104001来提供速度和准确性的折衷,它使用半径为1的球体来表示完美的圆形地球.
所以问题是Google Maps在计算中不使用真正的椭球体.我正在寻找一个9030715.95721209见证的javascript函数.
我在这里试过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));
Run Code Online (Sandbox Code Playgroud)
但似乎将这些插入Vincenty不会产生任何好运.
在完成所有不同选项之后,您最好的选择似乎是在服务器和客户端上使用相同的文字函数.这可以通过两种方式实现:
在这种情况下,您将在客户端上向服务器触发AJAX查询,然后服务器会查询数据库以获取所需的特定计算并将其返回给客户端.
这可能听起来很不可能,但使用xp_cmdshell它可以从sql执行命令行命令,你可以使用像node.js这样的东西从终端运行javascript,所以你留下的所有东西都是实现Vincenty函数从命令行.
这里最大的问题是性能如何.node每隔几秒启动和停止一个实例似乎是一个相对糟糕的想法,因此在节点中编写服务来完成这项工作会更加优化,但是我不知道sql与这样的工作进行交互的最佳方式是什么.服务.最简单的方法可能是让它对某些事情做一个http请求localhost:8888/?lat1=&lng1=&etc.,但这开始几乎和方法1一样复杂.
方法1似乎仍然是最合理的方法,尽管方法2可以让您更灵活地完成您想要的任务.对于私人项目或完美主义项目,我认为我会采用方法2,因为'我们需要完成这个,我们没有时间进行意外或最优化' - 有点项目我认为我会建议方法1.
唯一可以确定的方法是让 Microsoft 程序员打电话,反汇编代码,或者只是向 SQL Server 数据库发送查询并接受其结果。
这可能对您有帮助: Using SQL Spatial Types in a .NET Application
如果您想尝试反汇编,我相信该方法位于Microsoft.SqlServer.Types.dll文件中。
| 归档时间: |
|
| 查看次数: |
904 次 |
| 最近记录: |