惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
S
SegmentFault 最新的问题
Jina AI
Jina AI
D
DataBreaches.Net
人人都是产品经理
人人都是产品经理
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
爱范儿
爱范儿
大猫的无限游戏
大猫的无限游戏
C
Check Point Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
WordPress大学
WordPress大学
博客园 - 三生石上(FineUI控件)
B
Blog
博客园 - 【当耐特】
博客园 - Franky
M
MIT News - Artificial intelligence
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
L
LangChain Blog
MyScale Blog
MyScale Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - 叶小钗
Last Week in AI
Last Week in AI
Engineering at Meta
Engineering at Meta

博客园 - 卓如

混合使用Jquery Deferred和Angularjs的$timeout(转) AngularJs应用页面切换优化方案(转) 在IE7下使用angularjs(转) AngularJS 中的 Promise 和 设计模式(转) Installing Oracle and ArcSDE on separate servers 修改oracle内存占用 在设置窗体身份验证时设置个别页面不需要进行验证[转] 解决ASP.NET在IE10中Session丢失问题【转】 心理课堂:对付拖延症(转) Ado方式导入excel混用数据类型引起数据缺失问题解决方法 深入分析 Java 中的中文编码问题(转) 轻松实现坐标转换(转) WIN2003系统远程桌面多连接数设置终极大法 GIS理论(墨卡托投影、地理坐标系、地面分辨率、地图比例尺、Bing Maps Tile System)【转载】 两点坐标间距离的算法以及验证【转】 wpf \silverlight 保存控件为图片 - 卓如 WPF 自定义快捷键命令(Command)(转) SelectNodes 表达式 - 卓如 - 博客园 获得excel的sheet名字
[转]判断一个点是否落在多边形内
卓如 · 2011-07-21 · via 博客园 - 卓如

转自:

http://www.cnblogs.com/gis_gps/archive/2009/02/12/1389071.html

 备用

一、背景:

  如何判断一个指定的经纬度点是否落在一个多边形区域内?

二、实现代码(delphi)


Type
  TMyPoint 
= packed record
    X : double;
    Y : double;
  
end;{*------------------------------------------------------------------------------
  判断指定的经纬度坐标点是否落在指定的多边形区域内
  @param ALon   指定点的经度
  @param ALat   指定点的纬度
  @param APoints   指定多边形区域各个节点坐标
  @return True 落在范围内 False 不在范围内
------------------------------------------------------------------------------*
}
function IsPtInPoly(ALon, ALat: double; APoints: array of TMyPoint): Boolean;
var
  iSum, iCount, iIndex: Integer;
  dLon1, dLon2, dLat1, dLat2, dLon: double;
begin
  Result :
= False;
  
if (Length(APoints) < 3then
  
begin
    Result :
= False;
    Exit;
  
end;
  iSum :
= 0;
  iCount :
= Length(APoints);
  
for iIndex :=0 to iCount - 1 do
  
begin
    
if (iIndex = iCount - 1then
    
begin
      dLon1 :
= APoints[iIndex].X;
      dLat1 :
= APoints[iIndex].Y;
      dLon2 :
= APoints[0].X;
      dLat2 :
= APoints[0].Y;
    
end
    
else
    
begin
      dLon1 :
= APoints[iIndex].X;
      dLat1 :
= APoints[iIndex].Y;
      dLon2 :
= APoints[iIndex + 1].X;
      dLat2 :
= APoints[iIndex + 1].Y;
    
end;
    
if ((ALat >= dLat1) and (ALat < dLat2)) or ((ALat>=dLat2) and (ALat < dLat1)) then
    
begin
      
if (abs(dLat1 - dLat2) > 0then
      
begin
        dLon :
= dLon1 - ((dLon1 -dLon2) * (dLat1 -ALat)) / (dLat1 - dLat2);
        
if (dLon < ALon) then
          Inc(iSum);
      
end;
    
end;end;
  
if (iSum mod 2 <> 0then
    Result :
= True;
end;

____________________________________________________________________________________________________________________________

 C#算法:

  /// <summary>

        ///  判断指定的经纬度坐标点是否落在指定的多边形区域内

        /// </summary>

        /// <param name="ALon">指定点的经度</param>

        /// <param name="ALat">指定点的纬度</param>

        /// <param name="APoints">指定多边形区域各个节点坐标</param>

        /// <returns>True 落在范围内 False 不在范围内</returns>

        public bool isPtInPoly(double ALon, double ALat, Point[] APoints)

        {

            int iSum, iCount, iIndex;

            double dLon1, dLon2, dLat1, dLat2, dLon;

            if (APoints.Length < 3)

            {

                return false;

            }

            iSum = 0;

            iCount = APoints.Length;

            for (iIndex = 0; iIndex < iCount - 1; iIndex++)

            {

                if (iIndex == iCount - 1)

                {

                    dLon1 = APoints[iIndex].X;

                    dLat1 = APoints[iIndex].Y;

                    dLon2 = APoints[0].X;

                    dLat2 = APoints[0].Y;

                }

                else

                {

                    dLon1 = APoints[iIndex].X;

                    dLat1 = APoints[iIndex].Y;

                    dLon2 = APoints[iIndex + 1].X;

                    dLat2 = APoints[iIndex + 1].Y;

                }

                if (((ALat >= dLat1) && (ALat < dLat2)) || ((ALat >= dLat2) && (ALat < dLat1)))

                {

                    if (Math.Abs(dLat1 - dLat2) > 0)

                    {

                        dLon = dLon1 - ((dLon1 - dLon2) * (dLat1 - ALat)) / (dLat1 - dLat2);

                        if (dLon < ALon)

                            iSum++;

                    }

                }

            }

            if ((iSum % 2) != 0)

                return true;

            return false;

        }