【问题标题】:Create Circle from Min Max Lat Long Latitude Longitude从最小最大纬度经纬度经度创建圆
【发布时间】:2018-09-19 09:38:40
【问题描述】:

以下 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;

如何从相同的坐标创建 CIRCLE?假设坐标之间的直线代表圆的直径。

【问题讨论】:

  • 那个圆圈会是什么样子?创建一个圆所需的最小点数是两个点,其中一个是中间点,另一个在圆上(所以你有半径),或者是圆上的 3 个点。你不能让一个圆接触矩形的所有 4 个点,因为它不是正方形。
  • 嗯,我有两点。圆周两侧的直线。彼此直接相对。这条线到中心的一端将是半径。
  • 那么你有两个点,它们之间的直线是直径还是圆?
  • 对对对
  • 我只是好奇。为什么要在 T-SQL 中这样做?

标签: sql-server sql-server-2008-r2 gis geospatial


【解决方案1】:

这有帮助吗?我现在无法测试它

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

【讨论】:

  • 谢谢你,但CURVEPOLYGON 是在 SQL2012 中引入的,我正在开发 2008r2。
  • 我明白了,抱歉我没注意到..!
【解决方案2】:

我可能已经根据@ZoharPeled 的 cmets 解决了这个问题

使用STDistanceSTCentroidSTBuffer 的组合

注意:STCentroid 的文档说这是从 2012 年引入的,但它适用于 2008r2

使用 STCentroid 获取多边形的中心点 使用 STDistance 获取半径 使用STBuffer生成圆的Polygon(多点)

所以,继续问题中的代码示例 获取中心点

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

给你

现在,有没有更简单的方法来做到这一点?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 2013-09-09
    • 2016-08-29
    • 2019-07-04
    相关资源
    最近更新 更多