Google Maps и MSSQL, похоже, не согласны с тем, как рассчитать расстояние/длину полилинии /linestring с помощью SRID 4326.
MSSQL:
SELECT geography::STGeomFromText('LINESTRING(-98.78 39.63,2.98 27.52)', 4326).STLength()
Результат: 9030715.95721209
Затем Карты Google:
http://jsbin.com/niratiyojo/1/
Результат: 9022896.239500616
Мне нужен мой JavaScript-интерфейс, чтобы он соответствовал тому, что MSSQL будет сообщать, чтобы он был последовательным и точным. Где и как я могу узнать, как MSSQL вычисляет их STLength()
и может ли он быть реплицирован в JavaScript?
Update:
Я понял, что если я делаю
SELECT GEOGRAPHY::STGeomFromText('LINESTRING(-98.78 39.63,2.98 27.52)', 104001).STLength() * 6378137
Затем MSSQL возвращает 9022896.23950062
Новый SRID в MSSQL:
Новый идентификатор пространственной ссылки "Единица измерения" По умолчанию пространственная ссылка ID (SRID) в SQL Server 2012 - 4326, который использует метрическую систему как его единица измерения. Этот SRID также представляет эллипсоидальная сферическая форма земли. Хотя это представление наиболее точным, его также более сложно вычислить точные эллипсоидальные математика. SQL Server 2012 предлагает компромисс в скорости и путем добавления нового идентификатора пространственной привязки (SRID), 104001, который использует сферу радиуса 1 для представления совершенно круглой земли.
Таким образом, проблема заключается в том, что Google Maps не использует истинную эллипсоидальную сферу при расчетах. Я ищу функцию 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));
но, похоже, их включение в Винценти не приносит никакой пользы.