Создать круг из Мин Макс Макс Широта Широта Долгота - PullRequest
0 голосов
/ 19 сентября 2018

В следующем примере TSQL создается RECTANGLE из минимальной максимальной широты долготы

DECLARE @MinLat     VARCHAR (10)    = N'53.811446';
DECLARE @MaxLat     VARCHAR (10)    = N'53.809166';
DECLARE @MinLong    VARCHAR (10)    = N'-1.594991';
DECLARE @MaxLong    VARCHAR (10)    = N'-1.591515';

DECLARE
    @boundingRect   VARCHAR (150)
    ,@geom          GEOMETRY;

SET @boundingRect = 'POLYGON((' +   @MinLong + ' ' + @MinLat + ', ' + 
                                    @MaxLong + ' ' + @MinLat + ', ' + 
                                    @MaxLong + ' ' + @MaxLat + ', ' + 
                                    @MinLong + ' ' + @MaxLat + ', ' + 
                                    @MinLong + ' ' + @MinLat 
                            + '))';
SET @geom = @boundingRect;
SELECT @geom;

enter image description here

Как создать КРУГ от тех же координат?Предположим, что прямая линия между координатами представляет диаметр круга.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Возможно, я решил это на основе комментариев @ ZoharPeled

Используя комбинацию STDistance , STCentroid и STBuffer

Примечание : документ для STCentroid говорит, что он был введен с 2012 года, но работает на 2008r2

Используйте STCentroid, чтобы получить центральную точку многоугольника. Используйте STDistance, чтобы получить радиусИспользуйте STBuffer для создания многоугольника (с несколькими точками) круга

Итак, следуя примеру кода в вопросе, получите центральную точку

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

дает вам

POINT (-1.5932529999990948 53.8103059999994)

Получить радиус

DECLARE @h geometry;  
SET @g = geometry::STGeomFromText('POINT (-1.594991 53.811446)', 0);    --one end of the radius
SET @h = geometry::STGeomFromText('POINT (-1.5932529999990948 53.8103059999994)', 0);  --from STCentroid
SELECT @g.STDistance(@h);   --0.00207851966661527

дает вам

0.00207851966661527

Создать многоугольник

DECLARE @poly NVARCHAR(MAX)
SET @g = geometry::STGeomFromText('POINT (-1.5932529999990948 53.8103059999994)', 0);  
SELECT @poly = @g.STBuffer(0.00207851966661527).ToString(); --from STDistance()
SET @h = geometry::STGeomFromText(@poly, 0); 
SELECT @h

Дает вам

enter image description here

Теперь, есть ли менее запутанный способ сделать это?

0 голосов
/ 19 сентября 2018

Может ли это быть полезным?Я не могу проверить это прямо сейчас

SET @boundingCircle = 'CURVEPOLYGON(CIRCULARSTRING(' 
                     + @MaxLong + ' ' + (@MinLat+(@MaxLat-@MinLat)/2) + ', ' 
                     + @MinLong + ' ' + (@MinLat+(@MaxLat-@MinLat)/2) + ', ' 
                     + @MaxLong + ' ' + (@MinLat+(@MaxLat-@MinLat)/2) + ', ' 
                     + '))';
...