2014-12-04 4 views
-12

Обновление: Об этом сообщается Microsoft.Ошибка в SQL География POINT Lat, Long


В простой таблицы (SQL Server 2012) с geography столбца (имя geopoint) заселенной несколькими простыми рядами точек похоже на это. POINT (-0.120875610750927 54.1165118880234) и т.д. выполнения

select [geopoint].[STAsText](), 
     [geopoint].Lat lat, 
     [geopoint].Long long 
from mytable 

производит этот

Untitled1 lat long 
POINT (-0.120875610750927 54.1165118880234) 54.1165118880234 -0.120875610750927 

, который выглядит как ошибка, но это слишком основной и должны были пойманы перед выпуском. Так что я делаю что-то неправильно?

Добавлена ​​информация

ИТ-специалисты должны искать детали реализации Microsoft о SQL-сервера на MSDN. Поскольку могут быть различия в реализации. В этом случае. В качестве доказательства этого я только что проверил реализацию PostGist ST_AsText для столбца geographic. Это прекрасно работает! и результат, как и следовало ожидать. Поэтому ошибка заключается в реализации SQL. Правильный результат для приведенного выше примера должен быть

POINT (54.1165118880234 -0.120875610750927) 54.1165118880234 -0.120875610750927 

Осмелюсь сказать, что есть высокая вероятность того, что есть и другие ошибки, связанные с функциями рабочих geographic колонн. Поскольку базовые функции в этой области не были полностью протестированы.

+4

Почему вы думаете, что есть ошибки, хорошо выглядит для меня! – Mithrandir

+1

«Я что-то не так?» - предположим, вы предположили, что аргументы «POINT» - это широта, за которой следует долгота, а не долгота, за которой следует широта. –

+0

при отображении [геосайт]. [STAsText]() Lat и Long должны быть другим способом. У меня есть двойная проверка возвращаемых значений для STAsText() как для точки географии, так и для точки геометрии. Для точки геометрии возвращаемые значения верны в соответствии с расширениями STX и STY. Для точек географии [STAsText]() возвращает неправильные значения для POINT. Он должен быть POINT (lat, long) Это ошибка, о которой я сообщу об этом. – Farjad

ответ

-4

Это ошибка. Возвращаемое значение для STAsText для столбца географии свопирует значения Lat и Long. Определенно ошибка, о которой люди должны знать.

+1

Нет, у вас есть это назад, координата y - долгота. Люди говорят о lat/lon, но это реализовано как lon/lat. Это не ошибка. –

+0

-Джон Барка и другие. MSDN четко определяет точку как точку (Lat, Long, SRID). Как я уже упоминал ранее. Геометрия версии STASText работает правильно, но НЕ версия географии. Поэтому при тестировании этой проблемы будьте осторожны, чтобы не путать две версии. – Farjad

+1

Я думаю, что может возникнуть проблема. Взгляните на мой модульный тест: latitude = 40.584474F; longitude = -111.633491F; var location = SqlGeography.Point (широта, долгота, 4326); var point = location .ToString(); На данный момент переменная точка имеет значение: POINT (-111.63349151611328 40.58447265625) Это похоже на ошибку. – Gunnar

11

Это работа по своему усмотрению.

По вашему вопросу, вы сохранили данные в этой схеме:

POINT (-0.120875610750927 54.1165118880234)

тогда вы утверждали, что широта/долгота восстанавливаются в соответствии с MSDN documentation из

Point(Lat, Long, SRID).

Вы можете понять, что синтаксис вы используете не то же самое, как один вы утверждаете:

POINT(aValue anotherValue) против Point(Lat, Long, SRID)

Теперь вопрос в том, что делает MS SQL делать с данными?

Оказывается, MS SQL интерпретирует данные как Open Geospatial Consortium (OGC) Хорошо Known Text (WKT), и таким образом использовать STPointFromText функцию, так как формат является наиболее подходящим для точки 2-D:

POINT(x y)

Теперь, следующий вопрос, означает ли это POINT(Lat Long)?

Из примера кода

SET @g = geography::STPointFromText('POINT(-122.34900 47.65100)', 4326); 

должно быть ясно, что первый параметр не является широта, долгота, но (диапазон широты диапазона от -90 до 90 только), так что теперь мы предполагаем, что формат составляет POINT(Long Lat). Но почему?

Как объяснены в this article,

Как вы можете видеть, [...], долгота указывается первым до широты. Причина в том, что в представлении «Открытый геопространственный консорциум (OGC)« Хорошо известный текст »(WKT) формат (x, y). Географические координаты обычно задаются Lat/Long, но между этими двумя, X является долготой, а Y - широтой.

Возможно, вам интересно, почему X-координата - это долгота, а Y-координата - Широта. Подумайте об экваторе Земли как о оси х, а главный меридиан - ось Y. Долгота определяется как расстояние от простого меридиана вдоль оси х (или экватора). Точно так же широта определяется как расстояние от экватора вдоль оси Y.

+0

Примечание: Это только результат исследования и сбора соответствующей информации. Я вообще не специалист по MS SQL или GIS. –

+0

Andrew спасибо за то, что нашли время, чтобы ответить на эту тему. Andrew Вы упомянули синтаксис, который я использую, это не то же самое, что я утверждаю. Список сообщений - это не что иное, как то, что производится с помощью SQL-движка. Синтаксис - это только возвращаемые значения STAsText(). Поэтому я НЕ меняю что-то. Это возвращаемые значения функции с помощью SQL-движка. В соответствии с определением MSDN возвращаемое значение для точки неверно. Нужно уметь подбирать этот текст и использовать его для преобразования точки (с lat, long) в версию геометрии. – Farjad

+0

Я вижу ... тогда, пожалуйста, уточните, как вы вводите данные. Вы использовали 'Point (Lat, Long, SRID)' или 'POINT (-0.120875610750927 54.1165118880234)'? В настоящее время я предполагаю, что вы использовали последний, и с вашего вывода он напечатал последний. Но все же я не считаю это ошибкой. вы можете ввести его с первым, но если он напечатан как последний, тогда нет ничего плохого. Подобно тому, как я вводил 2014-12-6, тогда он выводит 12/6/2014. Дело в том, что до тех пор, пока формат верен, проблем нет. –