SQL Server Circle

Я пытаюсь создать круг в SQL Server на основе средней точки и радиуса.

Это похоже на решение, но оно создает овал или эллипс против круга. Есть ли другой способ создать круг?

DECLARE @g geometry;
SET @g = geometry::STGeomFromText('POINT(-88.0 44.5)', 4326);
select @g.BufferWithTolerance(5, .01, 1)

В настоящее время я использую SQL Server 2008.

Этот код также демонстрирует проблему. Пространственные результаты выглядят как круг, но когда я рисую круг на картах Google, он овальный. Кроме того, когда я использую STContains, чтобы увидеть, какие точки находятся в круге, он определенно следует овальному контуру.

IF EXISTS (SELECT * FROM [tempdb].[sys].[objects] WHERE [name] = N'##circle')
    DROP TABLE ##circle;

CREATE TABLE ##circle
(
    [Polygon] [geometry] NOT NULL
)

DECLARE @g geometry;
SET @g = geometry::STGeomFromText('POINT(-88.0 44.5)', 4326);

insert into ##circle (Polygon) 
values (@g.BufferWithTolerance(.5,.01,1))

select Polygon from ##circle

person randy    schedule 03.02.2016    source источник
comment
Я запустил оба ваших фрагмента кода в 2012 году, и они образовали круги. Возможно, у вас есть какие-то забавные вещи, происходящие с вашей глобальной временной таблицей. Я бы переключился на временную таблицу для локальной / конкретной сессии и посмотрел, сохраняется ли ваша проблема.   -  person John Specko    schedule 04.02.2016


Ответы (1)


Ваша проблема в том, что вы рисуете круг в географических координатах. Карты Google используют проекцию веб-меркатора https://en.wikipedia.org/wiki/Web_Mercator , так что ваш круг будет овалом. Если вы хотите создать что-то похожее на круг на Картах Google, вы должны сделать это в наборе данных с помощью проекции веб-меркатора. (Я намеренно говорю «выглядит как круг», поскольку, если вы проецируете его на другую систему, например, utm для крупномасштабной карты, он может снова оказаться овалом.)

код epsg для web_mercator - 3857, поэтому, если вы проецируете свои координаты x и y на web_mercator

DECLARE @g geometry;
SET @g = geometry::STGeomFromText('POINT(-9796115.18981 5543147.20386)', 3857);
SELECT @g.BufferWithTolerance(5, .01, 1)

Должен работать (просто введите -9796 ... 5543 ... Координаты web_mercator для ваших географических X и Y)

Похоже, вам нужно использовать пространственные инструменты SQL-сервера (https://gis.stackexchange.com/questions/2723/is-it-possible-to-reproject-spatial-data-using-sql-server) или внешний инструмент для выполнения перепроецирования. Если у вас всего несколько баллов, может оказаться полезным http://cs2cs.mygeodata.eu/.

person MortenSickel    schedule 03.02.2016