判断点是否在区域的python实现(射线法)
#!/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))
判断点是否在区域的python实现(射线法)的更多相关文章
- 判断一个点是否在多边形内部,射线法思路,C#实现
感谢原作者,原理请看原作者的文章 http://www.html-js.com/article/1517 C#实现 public string rayCasting(PointF p, PointF[ ...
- c# 判断点是否在区域内 点在区域内 在多边形内 判断
方法一 算法 : public int isLeft(Point P0, Point P1,Point P2) { int abc= ((P1.X - P0.X) ...
- matlab练习程序(射线法判断点与多边形关系)
依然是计算几何. 射线法判断点与多边形关系原理如下: 从待判断点引出一条射线,射线与多边形相交,如果交点为偶数,则点不在多边形内,如果交点为奇数,则点在多边形内. 原理虽是这样,有些细节还是要注意一下 ...
- LightOj1190 - Sleepwalking(判断点与多边形的位置关系--射线法模板)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1190 题意:给你一个多边形含有n个点:然后又m个查询,每次判断点(x, y)是否在多边 ...
- Python基于回溯法解决01背包问题实例
Python基于回溯法解决01背包问题实例 这篇文章主要介绍了Python基于回溯法解决01背包问题,结合实例形式分析了Python回溯法采用深度优先策略搜索解决01背包问题的相关操作技巧,需要的朋友 ...
- Python 射线法判断一个点坐标是否在一个坐标区域内
class Point: lng = '' lat = '' def __init__(self, lng, lat): self.lng = lng self.lat = lat # 求外包矩形 d ...
- 如何判断一个Http Message的结束——python源码解读
HTTP/1.1 默认的连接方式是长连接,不能通过简单的TCP连接关闭判断HttpMessage的结束. 以下是几种判断HttpMessage结束的方式: 1. HTTP协议约定status ...
- Canvas.Pixels 实例:判断一点是否在区域中
The Windows 3.1 and Windows 95 GDI heap is limited in regards to scan converting large and complex r ...
- 判断字符串是否为回文 python
回文正序和逆序一样的字符串,例如abccba 方法一 def is_palindrome1(text): l = list(text) l.reverse() t1 = ''.join(l) if t ...
随机推荐
- 【收藏】15个常用的javaScript正则表达式(转)
0 前言 收集整理了15个常用的javaScript正则表达式,其中包括用户名.密码强度.整数.数字.电子邮件地址(Email).手机号码.身份证号.URL地址. IPv4地址. 十六进制颜色. 日期 ...
- Atitit.嵌入式web 服务器 java android最佳实践
Atitit.嵌入式web 服务器 java android最佳实践 1. Android4.4.21 2. 自己的webserver1 3. CyberHTTP for Java cybergar ...
- gtx官方example仿真
一.应用ISE中仿真器ISim 进行仿真: 1.用CORE Generator 产生gtx IP核(重新改IP配置只需在CORE Generator中打开coregen.cgp文件进入点击IP修改参数 ...
- jquery中绑定点击事件
$("body").on("click",".tab-contentBox td",function(){}; $(".tab-c ...
- python简单处理xml文件
Python若是想从xml里读点信息,用BeautifulSoup可能会容易一点,但是如果要修改xml,BeatifulSoup就搞不定了,其实直接用lxml就好. from lxml import ...
- Lucene.Net 介绍
1 lucene简介1.1 什么是lucenepowered by 25175.netLucene是一个全文搜索框架,而不是应用产品.因此它并不像www.baidu.com 或者google Desk ...
- CodeAreaFX
CodeAreaFX is a text area for JavaFX with API to style ranges of text. It is intended as a base for ...
- Hibernate标准查询语言
Hibernate标准(Criteria)查询语言(HCQL)用于根据具体条件获取记录.Criteria接口提供了应用标准的方法,例如检索薪水大于50000的表的所有记录. HCQL的优势 HCQL提 ...
- Unity3D学习笔记——NGUI之UITable
UITable:这个控件可以方便的排列其他小组件,并能控制小组件之间的距离. 效果如下: 这个控件的效果和UIGrid很相似,区别是UIGrid能控制每个小组件的大小,而这个 控件控制的是小组件之前的 ...
- java.lang.IllegalArgumentException: Invalid 'log4jConfigLocation 解决办法
MyEclipse 启动tomcat 报错: java.lang.IllegalArgumentException: Invalid 'log4jConfigLocation' parameter: ...