判断 点 是否 在 任意多边形 内部 采用射线法

本文介绍了一个SQL函数ufn_PointInPolygon,用于判断一个点是否位于特定ID标识的多边形内部。该函数已在SQL Server 2005上验证通过。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法

算法思路是从W. Randolph Franklin的这篇文章而来:
http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html

SQL 代码

数据表: polygon

polygonID vertexID latitude longitude
1 1 -79.64452 44.06773
1 2 -79.62194 43.97181
1 3 -79.45356 43.92827
1 4 -79.31599 44.02789
1 5 -79.36526 44.13045
1 6 -79.45459 44.04116

下面是SQL函数 ufn_PointInPolygon 的定义,这个函数会判断一个点是否在多边形中。代码在SQL Server 2005中测试通过。

  1. SET ANSI_NULLS ON  
  2. GO  
  3. SET QUOTED_IDENTIFIER ON  
  4. GO  
  5. -- =============================================  
  6. -- http://www.sql-statements.com/point-in-polygon.html  
  7. -- Test: select dbo.ufn_PointInPolygon(-79.37553, 44.06699,1)  
  8. -- =============================================  
  9. CREATE FUNCTION [dbo].[ufn_PointInPolygon]  
  10. (  
  11.     -- Add the parameters for the function here  
  12.     @pointLat REAL, @pointLon REAL, @polygonID INT  
  13. )  
  14. RETURNS INT  
  15. AS  
  16. BEGIN  
  17.   
  18.     DECLARE @insidePolygon INT  
  19.   
  20.     DECLARE @nvert INT  
  21.     DECLARE @lineLat1 REAL  
  22.     DECLARE @lineLon1 REAL  
  23.     DECLARE @lineLat2 REAL  
  24.     DECLARE @lineLon2 REAL  
  25.   
  26.     DECLARE @i INT  
  27.     DECLARE @j INT  
  28.   
  29.     SELECT @nvert=count(*) FROM polygon WHERE polygonID=@polygonID  
  30.   
  31.     SET @insidePolygon = -1  
  32.     SET @i=0  
  33.     SET @j=@nvert-1  
  34.   
  35.     WHILE (@i<@nvert)  
  36.     BEGIN  
  37.         SELECT @lineLat1 = latitude, @lineLon1 = longitude  
  38.         FROM polygon  
  39.         WHERE polygonID=@polygonID AND vertexID = @i  
  40.   
  41.         SELECT @lineLat2 = latitude, @lineLon2 = longitude  
  42.         FROM polygon  
  43.         WHERE polygonID=@polygonID AND vertexID = @j  
  44.   
  45.         IF( ((@lineLon1>@pointLon and @lineLon2<=@pointLon) OR (@lineLon1<=@pointLon and @lineLon2>@pointLon))  
  46.             AND (@pointLat < (  
  47.                         (@lineLat2 - @lineLat1) * (@pointLon - @lineLon1) / (@lineLon2 - @lineLon1)    + @lineLat1  
  48.                     )  
  49.                 )  
  50.             )  
  51.             SET @insidePolygon = -1 * @insidePolygon  
  52.   
  53.         SET @j = @i  
  54.         SET @i = @i + 1  
  55.   
  56.     END  
  57.   
  58.     IF (@@ERROR <> 0) RETURN 0  
  59.   
  60.     RETURN @insidePolygon  
  61.   
  62. END  
  63. GO  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值