如何判断一个指定的经纬度点是否落在一个多边形区域内?
答案:2 悬赏:80 手机版
解决时间 2021-02-10 01:44
- 提问者网友:爱了却不能说
- 2021-02-09 14:25
如何判断一个指定的经纬度点是否落在一个多边形区域内?
最佳答案
- 五星知识达人网友:孤独的牧羊人
- 2021-02-09 14:33
判断指定的经纬度坐标点是否落在指定的多边形区域内
@paramALon指定点的经度
@paramALat指定点的纬度
@paramAPoints指定多边形区域各个节点坐标
@returnTrue落在范围内False不在范围内
------------------------------------------------------------------------------*}functionIsPtInPoly(ALon,ALat:double;APoints:arrayofTMyPoint):Boolean;variSum,iCount,iIndex:Integer;
dLon1,dLon2,dLat1,dLat2,dLon:double;beginResult:=False;if(Length(APoints)<3)thenbeginResult:=False;Exit;end;iSum:=0;iCount:=Length(APoints);foriIndex:=0toiCount-1dobeginif(iIndex=iCount-1)thenbegindLon1:=APoints[iIndex].X;dLat1:=APoints[iIndex].Y;dLon2:=APoints[0
].X;dLat2:=APoints[0
].Y;endelsebegindLon1:=APoints[iIndex].X;dLat1:=APoints[iIndex].Y;dLon2:=APoints[iIndex+1
@paramALon指定点的经度
@paramALat指定点的纬度
@paramAPoints指定多边形区域各个节点坐标
@returnTrue落在范围内False不在范围内
------------------------------------------------------------------------------*}functionIsPtInPoly(ALon,ALat:double;APoints:arrayofTMyPoint):Boolean;variSum,iCount,iIndex:Integer;
dLon1,dLon2,dLat1,dLat2,dLon:double;beginResult:=False;if(Length(APoints)<3)thenbeginResult:=False;Exit;end;iSum:=0;iCount:=Length(APoints);foriIndex:=0toiCount-1dobeginif(iIndex=iCount-1)thenbegindLon1:=APoints[iIndex].X;dLat1:=APoints[iIndex].Y;dLon2:=APoints[0
].X;dLat2:=APoints[0
].Y;endelsebegindLon1:=APoints[iIndex].X;dLat1:=APoints[iIndex].Y;dLon2:=APoints[iIndex+1
全部回答
- 1楼网友:酒安江南
- 2021-02-09 15:54
在lbs开发中,可能要碰到这样的问题,如何判断一个指定的经纬度点是否落在一个多边形区域内,比如我在地图上画了一个多边形区域,然后给出一个经纬度点,怎样判断这个点是否在这个多边形范围之内,由于我用的是android平台上的高德地图,官网找了很久都没有找到,我用高德的api重写下,给大家提供个参考:
[java] view plain copy
// 功能:判断点是否在多边形内
// 方法:求解通过该点的水平线与多边形各边的交点
// 结论:单边交点为奇数,成立!
//参数:
// point p 指定的某个点
// lppoint ptpolygon 多边形的各个顶点坐标(首末点可以不一致)
public static boolean ptinpolygon(latlng point, list apoints) {
int ncross = 0;
for (int i = 0; i < apoints.size(); i++) {
latlng p1 = apoints.get(i);
latlng p2 = apoints.get((i + 1) % apoints.size());
// 求解 y=p.y 与 p1p2 的交点
if ( p1.longitude == p2.longitude) // p1p2 与 y=p0.y平行
continue;
if ( point.longitude < math.min(p1.longitude, p2.longitude)) // 交点在p1p2延长线上
continue;
if ( point.longitude >= math.max(p1.longitude, p2.longitude)) // 交点在p1p2延长线上
continue;
// 求交点的 x 坐标 --------------------------------------------------------------
double x = (double)(point.longitude - p1.longitude) * (double)(p2.latitude - p1.latitude) / (double)(p2.longitude - p1.longitude) + p1.latitude;
if ( x > point.latitude )
ncross++; // 只统计单边交点
}
// 单边交点为偶数,点在多边形之外 ---
return (ncross % 2 == 1);
}
注意,这个latlng类,是高德地图api提供的,代表经纬度,效果还好,亲测可用
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯