【问题标题】:GIS find Points (long lats) that are contained by a polygon expressed as a collection of long latsGIS 查找由表示为长纬度集合的多边形所包含的点(长纬度)
【发布时间】:2009-04-25 07:40:16
【问题描述】:

我正在尝试查找所有具有 long/lats 的数据项,这些数据项包含在由 long lats 数组组成的多边形中,这些数据项可能是很多点。我知道您可以使用 SQL 2008 中的新地理空间数据类型来执行此类操作,但我使用的是 SQL 2005 和 C#。这最好在 DB 端还是在 C# 中完成。

谢谢。

【问题讨论】:

    标签: c# sql-server-2005 gis


    【解决方案1】:

    我为 SQL2000 编写了一些代码来执行此操作。它使用“角度”方法来确定一个点是否位于多边形内。

    一、GetAngle用户定义函数:

    ALTER Function [dbo].[GetAngle](
    @Ax Decimal(8,5), 
    @Ay Decimal(8,5), 
    @Bx Decimal(8,5), 
    @By Decimal(8,5), 
    @Cx Decimal(8,5), 
    @Cy Decimal(8,5))
    

    返回浮点数 作为 开始

    Declare @dot_product Float
    Declare @cross_product Float
    
    Declare @BAx Decimal(8,5)
    Declare @BAy Decimal(8,5)
    Declare @BCx Decimal(8,5)
    Declare @BCy Decimal(8,5)
    
    --' Get the vectors' coordinates.
    Set @BAx = Sign(@Ax - @Bx) * dbo.CalculateDistance(@Ax, @Ay, @Bx, @Ay)
    Set @BAy = Sign(@Ay - @By) * dbo.CalculateDistance(@Ax, @Ay, @Ax, @By)
    Set @BCx = Sign(@Cx - @Bx) * dbo.CalculateDistance(@Cx, @Cy, @Bx, @Cy)
    Set @BCy = Sign(@Cy - @By) * dbo.CalculateDistance(@Cx, @Cy, @Cx, @By)
    
    --' Calculate the dot product.
    Set @dot_product = @BAx * @BCx + @BAy * @BCy
    
    --' Calculate the Z coordinate of the cross product.
    Set @cross_product = @BAx * @BCy - @BAy * @BCx
    
    --' Calculate the angle.
    return ATn2(@cross_product, @dot_product)
    

    结束


    接下来我假设有一个纬度/经度对的表变量和一个序列号(指示 LAT/LONG 对定义多边形的顺序)。此表中的第一个点与表中的最后一个点相同,这一点很重要。

    另外,我有几个最小和最大纬度和经度的变量。这有效地创建了一个边界框,以便我可以快速消除不在多边形边界的矩形区域内的点。

    Select  Address.AddressId
    From    @Temp As A
            Inner Join @Temp As B
                On A.SequenceNumber = B.SequenceNumber - 1
            Inner Join Address
                On Address.XCoord Between @MinLongitude And @MaxLongitude
                And Address.YCoord Between @MinLatitude And @MaxLatitude
    Group By Address.AddressId
    Having Abs(Sum(dbo.GetAngle(A.Longitude, A.Latitude, Address.XCoord, Address.YCoord, B.Longitude, B.Latitude))) > 3.14
    

    【讨论】:

    • 我遇到了这个,我很感兴趣,但是dbo.CalculateDistance 是在哪里定义的?
    【解决方案2】:

    如果在 T-SQL 中完成,这听起来会让人头疼(不过,这或多或少是一切?)。当然,这取决于多边形的复杂性和数据项的定位方式,但通常最简单且效率适中的方法可能是在 C# 中进行一些初始计算,从而以非常粗略的方式限制数据项。所以类似于以下内容。

    1. 在 C# 中计算多边形的粗略边界。
    2. 从 SQL 服务器获取这些边界内的所有内容。
    3. 在 C# 中进行最终的精确过滤。

    性能当然取决于您计算初始边界的能力。我会先从一个简单的边界矩形开始,看看性能是否足够。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-03
      • 2014-09-06
      • 1970-01-01
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多