python 判断一个点(坐标)是否在一个多边形内利用射线法
看了一篇博客写的用射线法判断一个经纬度点是否在一个多边形的内部的方法 经验证可行所以拿来用作备份:
class Point:lng = ''lat = ''def __init__(self, lng, lat):self.lng = lngself.lat = lat
求外包矩形
def get_polygon_bounds(points):length = len(points)top = down = left = right = points[0]for i in range(1, length):if points[i].lng > top.lng:top = points[i]elif points[i].lng < down.lng:down = points[i]else:passif points[i].lat > right.lat:right = points[i]elif points[i].lat < left.lat:left = points[i]else:passtop_left = Point(top.lng, left.lat)top_right = Point(top.lng, right.lat)down_right = Point(down.lng, right.lat)down_left = Point(down.lng, left.lat)return [top_left, top_right, down_right, down_left]
判断点是否在外包矩形外 如果不在外包矩形内部那肯定不在多边形内部
def is_point_in_rect(point, polygon_bounds):top_left = polygon_bounds[0]top_right = polygon_bounds[1]down_right = polygon_bounds[2]down_left = polygon_bounds[3]return (down_left.lng <= point.lng <= top_right.lngand top_left.lat <= point.lat <= down_right.lat)def is_point_in_polygon(point, points):polygon_bounds = get_polygon_bounds(points)if not is_point_in_rect(point, polygon_bounds):return Falselength = len(points)point_start = points[0]flag = Falsefor i in range(1, length):point_end = points[i]# 点与多边形顶点重合if (point.lng == point_start.lng and point.lat == point_start.lat) or (point.lng == point_end.lng and point.lat == point_end.lat):return True# 判断线段两端点是否在射线两侧if (point_end.lat < point.lat <= point_start.lat) or (point_end.lat >= point.lat > point_start.lat):# 线段上与射线 Y 坐标相同的点的 X 坐标if point_end.lat == point_start.lat:x = (point_start.lng + point_end.lng) / 2else:x = point_end.lng - (point_end.lat - point.lat) * (point_end.lng - point_start.lng) / (point_end.lat - point_start.lat)# 点在多边形的边上if x == point.lng:return True# 射线穿过多边形的边界if x > point.lng:flag = not flagelse:passelse:passpoint_start = point_endreturn flagdef test(input_lng=116.732617, input_lat=39.722676):# polyline 是多个坐标点,形如# ['116.732617,39.722676', '116.732617,39.722676', '116.732617,39.722676',# '116.732617,39.722676', '116.732617,39.722676']polyline = []points = []for line in polyline:if line:try:lng, lat = line.split(',')points.append(Point(float(lng), float(lat)))except ValueError:passif points:return is_point_in_polygon(Point(float(input_lng), float(input_lat)), points)
判断一个点是否在多边形内部有多种写法,比如利用面积计算但是利用面积计算有一个缺点就是计算结果不是很准确,因为利用经纬度计算出来的距离本身就有偏差,所以将多边形分成多个小三角形相加后就会有误差导致最后不能作为判断的依据,我看大多数都是用的射线方法计算.
python 判断一个点(坐标)是否在一个多边形内利用射线法相关推荐
- 如何判断一个点在矩形或多边形内
先说一下,两个方法均是js实现,均是转载自其他大佬的文章,地址贴在下面 我最近接了个单子,里面有很多大棚,要求鼠标进入大棚范围高亮,我试过网上很多方法.大多不准确,或者说不适合有很多矩形.多边形的这种 ...
- 如何判断一个点是否落在一个平面内
最近有个朋友问起的一个问题,给定一个荷质比和保留时间构成的平面,想看下哪些化合物落在这个平面里面. 假如有下面一个平面,哪些点在平面里?哪些点在平面外?怎么判断呢? 最简单的方法是目测! 如果采用程序 ...
- 判断一个点是否在某个区域内(多边形)
判断一个点是否在某个区域内(多边形) 背景: 比如滴滴会根据乘客所在的不同区域,给出不同的价格.市区堵一点,那么价格也高点.获取服务范围只规定在某个范围内 原理: 求解从该点向右发出的水平线射线与多边 ...
- python判断一个或者多个字符串,是否出现在一段话中
python判断一个或者多个字符串,是否出现在一段话中 要判断一段话中是否有几个字符串,只要一个出现就为True,刚开始想用map函数,后来发现也挺麻烦. 查了一些资料,发现用 any比较好 比如 p ...
- 用python 判断一个单链表是否有环
文章目录 用python 判断一个单链表是否有环. 第二次做DAY20201130 [141. 环形链表](https://leetcode-cn.com/problems/linked-list-c ...
- python判断一个列表是否包含另一个列表_Python判断一个list中是否包含另一个list全部元素的方法分析...
Python判断一个list中是否包含另一个list全部元素的方法分析 本文实例讲述了Python判断一个list中是否包含另一个list全部元素的方法.分享给大家供大家参考,具体如下: 你可以用fo ...
- 如何用Python判断一个文件是否被占用?
今天有同学问,用os模块的access()能否判断一个文件是否被占用?直觉上,这是行不通的,因为access()返回的是文件的读写属性.为了确认这一点,我简单测试了一下. >>> i ...
- python判断一个值是否为Nan,NULL
python判断一个值是否为Nan,NULL 在实际的实验中,我们经常会遇到输出为Nan或者NULL的情况,那么我们该如何去判断它,然后用if语句将其规避勒 方案一如下: import numpy a ...
- 地图处理方法-判断一个点是否在某个区域内
判断一个点是否在某个区域内(多边形) 背景: 比如滴滴会根据乘客所在的不同区域,给出不同的价格.市区堵一点,那么价格也高点.获取服务范围只规定在某个范围内 原理: 求解从该点向右发出的水平线射线与多边 ...
最新文章
- 踏向星辰的少年|敢与自己开“杠”,才能和一群人开挂
- vue 表格内容跳转页面_Vue项目实战系列文章(一)项目预热
- ArcGIS 网络分析[8.2] 资料2 使用IDatasetContainer2接口的CreateDataset方法创建网络数据集...
- 以太坊钱包_最大的以太坊钱包币数量还在增加
- 蒙特卡洛分析_随机模拟:马尔科夫链蒙特卡洛采样MCMC与EM算法「2.3」
- ant编译无法依赖rt.jar
- 阿里的程序员们如何解决复杂数据的查询优化问题?| 技术头条
- java中10个用户注册_JavaWeb(十)Session
- MySQL 获取物理表的主键字段
- CAD 部分快捷键注释
- 去APP Store评分撰写评论方案
- execl()函数与execlp()函数
- Python之修改图片像素值
- WDM内核驱动程序模型分析
- 线性表顺序存储的一些操作(初始化,添加,删除)
- ROM,RAM,FLASH知识,全面解释一下
- 【Neo4j实战】红楼梦知识图谱
- LwIP源码详解 - UDP
- 小型机器人底盘Apollo为机器人开发提供完整导航解决方案
- ❤️AI从入门到到精通❤️
热门文章
- 北京的林书豪,像一把小李飞刀
- Linux 内核宏 time_after解析
- STM32F7xx —— QSPI
- pythonb超分辨成像_Papers | 超分辨 + 深度学习(未完待续)
- mysql cluster linux_【完美】Mysql-cluster数据库集群搭建(linux)
- php解析xml数据格式,PHP解析xml格式数据工具类实例分享
- kstools工具是什么牌子_2020年平衡车推荐,电动平衡车哪个牌子好?老司机教你如何选购电动平衡车...
- 基于JWT的身份认证学习笔记
- Packet Tracer实验——使用三层交换机实现vlan间的通信(详解)
- LeetCode MySQL 1479. 周内每天的销售情况(dayname星期几)