本文实例为大家分享了python射线法判断点是否位于区域内的具体代码,供大家参考,具体内容如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2018-10-07 15:49:37 # @Author : Sheldon (thisisscret@qq.com) # @Blog : 谢耳朵的派森笔记 # @Link : https://www.cnblogs.com/shld/ # @Version : 0.0.1 def isinpolygon(point,vertex_lst: list , contain_boundary = True ): #检测点是否位于区域外接矩形内 lngaxis, lataxis = zip ( * vertex_lst) minlng, maxlng = min (lngaxis), max (lngaxis) minlat, maxlat = min (lataxis), max (lataxis) lng, lat = point if contain_boundary: isin = (minlng< = lng< = maxlng) & (minlat< = lat< = maxlat) else : isin = (minlng<lng<maxlng) & (minlat<lat<maxlat) return isin def isintersect(poi,spoi,epoi): #输入:判断点,边起点,边终点,都是[lng,lat]格式数组 #射线为向东的纬线 #可能存在的bug,当区域横跨本初子午线或180度经线的时候可能有问题 lng, lat = poi slng, slat = spoi elng, elat = epoi if poi = = spoi: #print("在顶点上") return None if slat = = elat: #排除与射线平行、重合,线段首尾端点重合的情况 return False if slat>lat and elat>lat: #线段在射线上边 return False if slat<lat and elat<lat: #线段在射线下边 return False if slat = = lat and elat>lat: #交点为下端点,对应spoint return False if elat = = lat and slat>lat: #交点为下端点,对应epoint return False if slng<lng and elat<lat: #线段在射线左边 return False #求交点 xseg = elng - (elng - slng) * (elat - lat) / (elat - slat) if xseg = = lng: #print("点在多边形的边上") return None if xseg<lng: #交点在射线起点的左侧 return False return True #排除上述情况之后 def isin_multipolygon(poi,vertex_lst, contain_boundary = True ): # 判断是否在外包矩形内,如果不在,直接返回false if not isinpolygon(poi, vertex_lst, contain_boundary): return False sinsc = 0 for spoi, epoi in zip (vertex_lst[: - 1 ],vertex_lst[ 1 ::]): intersect = isintersect(poi, spoi, epoi) if intersect is None : return ( False , True )[contain_boundary] elif intersect: sinsc + = 1 return sinsc % 2 = = 1 if __name__ = = '__main__' : vertex_lst = [[ 0 , 0 ],[ 1 , 1 ],[ 1 , 2 ],[ 0 , 2 ],[ 0 , 0 ]] poi = [ 0.82 , 0.75 ] print (isin_multipolygon(poi,vertex_lst, contain_boundary = True )) |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://www.cnblogs.com/shld/p/9758303.html