Вопрос:
Сочетание абстрактного программирования, плохой/неполной документации и загадочных ошибок заставило меня почесывать голову, чтобы выяснить, что вызывает эту ошибку:
- MySql 5.6
- Entity Framework 6.0.2
- MySql Connector для.NET 6.8.3
Просто используя EntityFramework для загрузки моделей из таблицы с геометром. Значение столбца было установлено:
var example = DbGeometry.FromText(string.Format(«POINT({0} {1})», 51.5 /* Lat /*, -1.28 /* LON * /), 4326)
Считывание возвращаемого значения генерирует исключение:
24114: метка SRID = 4326; POINT (51,5 во входном широко известном тексте (WKT)). Действующие метки: POINT, LINESTRING, POLYGON, MULTILINESTRING, MULTIPOLYGON, GEOMETRYCOLLECTION, CIRCULARSTRING, COMPOUNDCURVE, CURVEPOLYGON и FULLGLOBE ( география Тип данных).
С помощью stacktrace:
[FormatException: 24114: The label SRID=4326;POINT(51.5 in the input well-known text (WKT) is not valid. Valid labels are POINT, LINESTRING, POLYGON, MULTIPOINT, MULTILINESTRING, MULTIPOLYGON, GEOMETRYCOLLECTION, CIRCULARSTRING, COMPOUNDCURVE, CURVEPOLYGON and FULLGLOBE (geography Data Type only).] Microsoft.SqlServer.Types.OpenGisTypes.ParseLabel(String input) +326 Microsoft.SqlServer.Types.WellKnownTextReader.ParseTaggedText(OpenGisType type) +99 Microsoft.SqlServer.Types.WellKnownTextReader.Read(OpenGisType type, Int32 srid) +47 Microsoft.SqlServer.Types.SqlGeometry.GeometryFromText(OpenGisType type, SqlChars text, Int32 srid) +485 Microsoft.SqlServer.Types.SqlGeometry.Parse(SqlString s) +222
Мое первое наблюдение – использование пространства имен Microsoft.SqlServer, которое кажется непоследовательным, поскольку я использую поставщик MySQL.
Разве MySQL.NET Connector не поддерживает SRID? Не зарегистрировано ли это правильно? (В основном я пытаюсь определить, какие единицы. Метод Distance() на объекте DbGeometry возвращается, пока он кажется случайным десятичным.
Ответ №1
Это не полный ответ на ваш вопрос, и я не совсем уверен, почему вы получаете ошибку, но у меня были некоторые советы, и это было слишком долго для комментариев.
При создании точки вам нужно указать Долгота перед Широта. Ваши координаты являются технически обоснованными с учетом их значений, но, конечно, вы столкнетесь с проблемами в других регионах, и если бы вы когда-либо отображали его, эта координата не была бы в Великобритании, где вы ожидали бы с помощью координат образца.
Кроме того, если вы это знаете, используйте метод DbGeometry.PointFromText(WKT, SRID) – его проще читать.
double lng = -1.28; double lat = 51.5; var wkt = String.Format(«POINT({0} {1})», lng, lat); var geometry = DbGeometry.PointFromText(wkt, 4326);
Я бы также рекомендовал использовать географию, а не геометрию, если вы используете систему широты/долготы – или есть конкретная причина для использования геометрии? Вышеуказанные методы доступны в DbGeography.
Изменение: единица (или случайный десятичный знак, как вы выразились) для STDistance() находится в метрах.
Удачи в поиске источника ошибки.