mzrax Ответов: 2

Получить центроид из KML в SQL server 2016


Всем привет,

У меня есть вопрос о функциях SQL Server и Geography. Я ищу, чтобы получить центроид определенной формы в файле KML.

Вот мой маленький вопрос

DECLARE @h VARCHAR(MAX);

    set @h = 'SELECT [Id]
          ,[Name]
          ,[placemark_sd_id]
          ,[ACC]
          ,[EXS]
          ,[NAM]
          ,[TXT]
          ,[UID_1]
          ,[placemark]
      FROM [dbKMLTemp].[dbo].[myTable]
      where [NAM] = "G";'

    DECLARE @g geometry;
    SET @g = geometry::STGeomFromText (@h,0)
    select @g.STCentroid().ToString();


Я получаю эту ошибку.

Msg 6522, Уровень 16, Состояние 1, Строка 6
А .Framework произошла ошибка во время выполнения определяемой пользователем подпрограммы или статистической "геометрия":
Система.Formatexception версия: 24114: надписи выберите [код],[имя],[ во входном известного текста (WKT) не является допустимым. Допустимые метки: точка, линия, полигон, МУЛЬТИТОЧКА, МУЛЬТИЛИНИЙ, МУЛЬТИПОЛИГОН, коллекции geometrycollection, circularstring, можно получить, экземпляр compoundcurve, curvepolygon и объект fullglobe (география тип данных только).
Система.Formatexception версия:
в Microsoft. SqlServer.Типы.OpenGisTypes.ParseLabel(строковый ввод)
в Microsoft. SqlServer.Типы.Хорошо известный текстовый редактор.ParseTaggedText(тип OpenGisType)
в Microsoft. SqlServer.Типы.WellKnownTextReader. Read(тип OpenGisType, Int32 srid)
в Microsoft. SqlServer.Типы.Типы данных sqlgeometry.GeometryFromText(тип OpenGisType, текст SqlChars, Int32 srid)

То что я пытаюсь сделать это взять следующий запрос но там где он говорит полигон я хочу получить полигон из оператора select:

DECLARE @g geometry;
SET @g = geometry::STGeomFromText('POLYGON((0 0, 3 0, 3 3, 0 3, 0 0),(2 2, 2 1, 1 1, 1 2, 2 2))', 0);
SELECT @g.STCentroid().ToString();


Я получил это от https://docs.microsoft.com/en-us/sql/t-sql/spatial-geometry/stcentroid-geometry-data-type

Как мне объединить их? У меня есть многоугольник из файла KML, и теперь мне нужно найти его центр.

Спасибо

Майк

Что я уже пробовал:

Посмотрите на мой код в вопросе.

2 Ответов

Рейтинг:
9

mzrax

Вот решение.

Немного запутался,но теперь начинаю понимать. Спасибо всем за помощь.

DECLARE @h geography;

set @h = (SELECT [placemark] FROM [dbKMLTemp].[dbo].[myTable]  where [NAM] = 'G')

DECLARE @g geometry;
SET @g = geometry::STGeomFromWKB(@h.STAsBinary(),4326)
select @g.STCentroid().ToString();


Изначально я выбирал слишком много столбцов и не использовал STGeomFromWKB.

Майк


RedDk

Я смотрел на это сегодня и заметил, что вы объявили "географию", но установили переменную так, как будто это потенциально "геометрия", что, я думаю, круто, потому что, когда я пытаюсь работать с этим равенством, я использую "геометрию", но поскольку я рассматривал двоичный файл как "географию", переводя текст с долготы и широты, я не могу использовать STCentroid() ... такого не бывает. Но я предполагаю, что @H-это, действительно, географии и, используя идентификатор srid 4326 работал! Что загадочно, потому что ... только вы можете видеть, на что ссылается этот оператор SELECT в myTable. Что такое тип данных [NAM]?

Рейтинг:
0

Patrice T

Помочь вам невозможно.

Цитата:
Msg 6522, Уровень 16, Состояние 1, Строка 6
Ошибка .NET Framework произошло во время выполнения пользовательской подпрограммы или агрегата " геометрия":
Система.Formatexception версия: 24114: надписи выберите [код],[имя],[ во входном известного текста (WKT) не является допустимым. Допустимые метки: точка, линия, полигон, МУЛЬТИТОЧКА, МУЛЬТИЛИНИЙ, МУЛЬТИПОЛИГОН, коллекции geometrycollection, circularstring, можно получить, экземпляр compoundcurve, curvepolygon и объект fullglobe (география тип данных только).

Внимательно прочитав сообщение об ошибке, вы должны были бы это увидеть ошибка не в SQL.


mzrax

Невозможно помочь мне, если ты не знаешь, о чем говоришь.

Тогда как же получить центральную точку многоугольника из запроса выбранных точек?

RedDk

Вы абсолютно правы в том, что не знаете, о чем они говорят, и я бы добавил, что ПМ-это точечный грабитель, но это может быть истолковано как начало огненной войны здесь, на КП. Все это легальное в стороне, я думаю, что ваш запрос неверен, потому что он выбирает многие вещи. Попробуйте выбрать то, к чему применяется" геометрия "(или" география", в зависимости от случая). Что в одиночку.