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的Tornado框架实现一个一对一聊天的程序
Apr 25 Python
python查看zip包中文件及大小的方法
Jul 09 Python
深入解析Python中的urllib2模块
Nov 13 Python
python数据结构之链表详解
Sep 12 Python
Python实现矩阵加法和乘法的方法分析
Dec 19 Python
Python聊天室程序(基础版)
Apr 01 Python
Django学习教程之静态文件的调用详解
May 08 Python
使用Python如何测试InnoDB与MyISAM的读写性能
Sep 18 Python
解决pycharm 工具栏Tool中找不到Run manager.py Task的问题
Jul 01 Python
python3实现斐波那契数列(4种方法)
Jul 15 Python
pytorch中的transforms模块实例详解
Dec 31 Python
OpenCV实现机器人对物体进行移动跟随的方法实例
Nov 09 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
Fatal error: Call to undefined function curl_init()解决方法
2010/04/09 PHP
php解析url的三个示例
2014/01/20 PHP
php查询whois信息的方法
2015/06/08 PHP
PHP中iconv函数知识汇总
2015/07/02 PHP
Yii2增删改查之查询 where参数详细介绍
2016/08/08 PHP
PHP simplexml_load_string()函数实例讲解
2019/02/03 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
PHP 加密 Password Hashing API基础知识点
2020/03/02 PHP
TP框架实现上传一张图片和批量上传图片的方法分析
2020/04/23 PHP
运用Windows XP附带的Msicuu.exe、Msizap.exe来彻底卸载顽固程序
2007/04/21 Javascript
js常见表单应用技巧
2008/01/09 Javascript
jQuery表单验证插件formValidator(改进版)
2012/02/03 Javascript
用JavaScript修改CSS属性的代码
2013/05/06 Javascript
javascript:FF/Chrome与IE动态加载元素的区别说明
2014/01/26 Javascript
一个Action如何调用两个不同的方法
2014/05/22 Javascript
jquery validate demo 基础
2015/10/29 Javascript
jQuery日历插件datepicker用法详解
2016/03/03 Javascript
javascript编程开发中取色器及封装$函数用法示例
2017/08/09 Javascript
利用jqprint插件打印页面内容的实现方法
2018/01/09 Javascript
js实现一个简单的MVVM框架示例
2018/01/15 Javascript
微信小程序事件流原理解析
2019/11/27 Javascript
[01:36:17]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第一场 1月31日
2021/03/11 DOTA
python之wxPython菜单使用详解
2014/09/28 Python
django模板结构优化的方法
2019/02/28 Python
matplotlib更改窗口图标的方法示例
2021/02/03 Python
初中政治教学反思
2014/01/17 职场文书
项目建议书怎么写
2014/05/15 职场文书
新颖的化妆品活动方案
2014/08/21 职场文书
小学家长学校培训材料
2014/08/24 职场文书
委托书的写法
2014/09/16 职场文书
党的群众路线教育实践活动方案
2014/10/31 职场文书
答谢词范文
2015/01/05 职场文书
2015年国培研修感言
2015/08/01 职场文书
Python torch.flatten()函数案例详解
2021/08/30 Python
Redis三种集群模式详解
2021/10/05 Redis
68行Python代码实现带难度升级的贪吃蛇
2022/01/18 Python