Как обновить таблицу из пространственного запроса - PullRequest
0 голосов
/ 02 марта 2012

У меня есть две таблицы, A и B, в SQL Server 2008:

A
lon(float)
lat(float)
name (nvarchar)

B
name (nvarchar)
the_geom (geometry)

В основном таблица B содержит полигоны области, а таблица A содержит координаты точек в двух столбцах.Я хочу обновить таблицу A именем области, если точка, определенная в столбцах lon / lat, находится внутри многоугольника в таблице B. Какая команда T-SQL является правильной?Пока это мой неудачный запрос:

UPDATE A SET name = (SELECT name FROM B WHERE
the_geom.STIntersects(geography::Point([A.lat], [A.Lon], 4326))>0)

Ответы [ 3 ]

1 голос
/ 24 марта 2012

У меня работает следующее:

UPDATE Deals SET Area = (
    SELECT NAME FROM Areas WHERE 
        the_geom.STIntersects(
            geometry::STGeomFromText(
                'POINT(' + CAST(Deals.Lon AS varchar) + ' ' + CAST(Deals.Lat AS varchar) + ')',4326)
                ) = 1
    )
0 голосов
/ 06 марта 2012

Это может звучать как 'dahh', но разве вы не должны использовать deal.lon вместо A.lon?

ОБНОВЛЕНИЕ сделок SET area = (ВЫБРАТЬ имя из областей, ГДЕ the_geom.STIntersects (geometry ::STPointFromText ('POINT (' + [сделки]. [Долг] + '' + [сделки]. [Лат] + ')', 4326)) = 1)

0 голосов
/ 02 марта 2012

Кажется, вы смешиваете пространственные типы и х / у. (Геометрия и география разные).

Вы можете написать свой запрос как:

UPDATE A SET name = (SELECT name FROM B WHERE 
    the_geom.STIntersects(
          geometry::STPointFromText(
               'POINT(' + [A.long] + ' ' + [A.lat] + ')', 4326
          )
    )=1)

На самом деле не пробовал выше, но это должно дать все, что вам нужно для решения проблемы Если вы хотите продолжить использовать географию, вы также можете создать ее, вернув ее в WKB, а затем в экземпляр геометрии через WKB (geometry :: STGeomFromWKB (geography :: AsBinary ())

...