python射线法判断检测点是否位于区域外接矩形内


Posted in Python onJune 28, 2019

本文实例为大家分享了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 相关文章推荐
Python 除法小技巧
Sep 06 Python
Python语言技巧之三元运算符使用介绍
Mar 04 Python
python筛选出两个文件中重复行的方法
May 31 Python
python安装pywin32clipboard的操作方法
Jan 24 Python
浅析PEP572: 海象运算符
Oct 15 Python
python实现单张图像拼接与批量图片拼接
Mar 23 Python
python实现处理mysql结果输出方式
Apr 09 Python
python 实现任务管理清单案例
Apr 25 Python
Python+Kepler.gl轻松制作酷炫路径动画的实现示例
Jun 02 Python
Keras load_model 导入错误的解决方式
Jun 09 Python
Python Unittest原理及基本使用方法
Nov 06 Python
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
Apr 13 Python
python 列表转为字典的两个小方法(小结)
Jun 28 #Python
numpy和pandas中数组的合并、拉直和重塑实例
Jun 28 #Python
使用Python画股票的K线图的方法步骤
Jun 28 #Python
连接pandas以及数组转pandas的方法
Jun 28 #Python
python3实现猜数字游戏
Dec 07 #Python
浅谈Pandas Series 和 Numpy array中的相同点
Jun 28 #Python
python3使用腾讯企业邮箱发送邮件的实例
Jun 28 #Python
You might like
DW中链接mysql数据库时,建立字符集中文出现乱码的解决方法
2010/03/27 PHP
php中将字符串转为HTML的实体引用的一个类
2013/02/03 PHP
php获取目标函数执行时间示例
2014/03/04 PHP
PHP常用处理静态操作类
2015/04/03 PHP
8个必备的PHP功能开发
2015/10/02 PHP
PHP/HTML混写的四种方式总结
2017/02/27 PHP
Laravel 5.4重新登录实现跳转到登录前页面的原理和方法
2017/07/13 PHP
ASP SQL防注入的方法
2008/12/25 Javascript
javascript 解析后的xml对象的读取方法细解
2009/07/25 Javascript
js实现下拉框选择要显示图片的方法
2015/02/16 Javascript
jQuery事件的绑定、触发、及监听方法简单说明
2016/05/10 Javascript
jQuery EasyUI 获取tabs的实例解析
2016/12/06 Javascript
JavaScript判断浏览器及其版本信息
2017/01/20 Javascript
jQuery返回定位插件详解
2017/05/15 jQuery
使用proxy实现一个更优雅的vue【推荐】
2018/06/19 Javascript
JavaScript设计模式之代理模式简单实例教程
2018/07/03 Javascript
Vue路由前后端设计总结
2019/08/06 Javascript
vue 验证码界面实现点击后标灰并设置div按钮不可点击状态
2019/10/28 Javascript
JavaScript隐式类型转换代码实例
2020/05/29 Javascript
python中的列表推导浅析
2014/04/26 Python
解决python3中自定义wsgi函数,make_server函数报错的问题
2017/11/21 Python
python3.6 +tkinter GUI编程 实现界面化的文本处理工具(推荐)
2017/12/20 Python
PyQt5每天必学之弹出消息框
2018/04/19 Python
python如果快速判断数字奇数偶数
2019/11/13 Python
利用Python的sympy包求解一元三次方程示例
2019/11/22 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
2020/05/22 Python
django 获取字段最大值,最新的记录操作
2020/08/09 Python
 Alo Yoga官网:购买瑜伽服装
2018/06/17 全球购物
汉语专业应届生求职信
2013/10/01 职场文书
《望庐山瀑布》教学反思
2014/04/22 职场文书
ktv筹备计划书
2014/05/03 职场文书
班级课外活动总结
2014/07/09 职场文书
党校党性分析材料
2014/12/19 职场文书
《田忌赛马》教学反思
2016/02/19 职场文书
PostgreSQL存储过程实用脚本(二):创建函数入门
2021/04/05 PostgreSQL
CKAD认证中部署k8s并配置Calico插件
2022/03/31 Servers