c# - GIS 查找表示为长纬度集合的多边形所包含的点(长纬度)

标签 c# sql-server-2005 gis

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

谢谢。

最佳答案

我有一些为 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))

返回 float 作为 开始

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

关于c# - GIS 查找表示为长纬度集合的多边形所包含的点(长纬度),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/788469/

相关文章:

sql-server-2005 - 如何在 SQL Server 2005 中撤消删除操作?

google-maps - 带有大陆轮廓/边界的 KML 文件

gis - 以编程方式访问 ArcGIS Pro 地理处理历史记录

javascript - 要素绘制完成后如何触发功能?

c# 在彼此之间转换谓词

c# - 如何将运行时已知的类型转换为给定类型的列表?

c# - C#asp.net中UPDATE语句中的语法错误

c# - C# 从资源文件中获取文件字节

java - SQL Server 2005 :how to connect to sql server 2005 on platform jboss 3. 0?

SQL查询填充0的缺失数据