Google Maps и MSSQL, кажется, не согласны о том, как рассчитать расстояние/длина ломаной линии/LINESTRING с помощью SRID 4326.Google Maps и длина LINESTRING SQL Server несовместимым
MSSQL:
SELECT geography::STGeomFromText('LINESTRING(-98.78 39.63,2.98 27.52)', 4326).STLength()
Результат: 9030715.95721209
Тогда Google Maps:
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:
Новый «Unit Сфера» Spatial Reference ID По умолчанию пространственная ссылка ID (SRID) в SQL Server 2012 - 432 6, который использует метрическую систему как свою единицу измерения. Этот SRID также представляет истинную форму эллипсоидальной сферы Земли . Хотя это представление является наиболее точным, также сложнее рассчитать точную эллипсоидальную математику . SQL Server 2012 предлагает компромисс в скорости и точность , добавив новый пространственный ссылочный идентификатор (SRID), 104001, который использует сферу радиуса 1 для представления совершенно круглой земли.
Таким образом, проблема заключается в том, что Google Maps не использует истинную эллипсоидальную сферу в расчетах. Я ищу функцию javascript, которая получает 9030715.95721209
в качестве свидетеля.
Я попробовал прямую формулу Vincenty здесь: http://jsbin.com/noveqoqepa/1/edit?html,js,console и в то время как это ближе я до сих пор не может сравниться с MSSQL
Edit 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));
но казалось бы, вставляя их в Винченти, не повезло.
Единственное, что я смог выяснить, это то, что полуосновная ось имеет тенденцию выражаться еще двумя десятичными знаками, что имеет ровно нулевое влияние на общий результат. Я искренне не знаю, как MSSQL определяет расстояние. –
Используя форму в [Live примеры на решениях Vincenty геодезических на странице эллипсоида] (http://movable-type.co.uk/scripts/latlong-vincenty.html), я получаю 9 030 706 728 м, что довольно близко к 9030715.95721209 (9 метров из 9x10^9 метров) – geocodezip
Да, это то же самое расстояние, которое я получил с помощью решения jsbin, которое я разместил в нижней части сообщения. Это очень близко, но мне нужно, чтобы это было точнее. – ParoX