Python 射线法判断一个点坐标是否在一个坐标区域内
class Point:
lng = ''
lat = '' def __init__(self, lng, lat):
self.lng = lng
self.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:
pass
if points[i].lat > right.lat:
right = points[i]
elif points[i].lat < left.lat:
left = points[i]
else:
pass
top_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.lng
and 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 False
length = len(points)
point_start = points[0]
flag = False
for 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) / 2
else:
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 flag
else:
pass
else:
pass point_start = point_end
return flag def 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:
pass
if points:
is_point_in_polygon(Point(float(input_lng), float(input_lat)), points)
缺点:慢
替代方法,类似的坐标的需求可以集成 https://geoalchemy-2.readthedocs.io/en/latest/
Python 射线法判断一个点坐标是否在一个坐标区域内的更多相关文章
- matlab练习程序(射线法判断点与多边形关系)
依然是计算几何. 射线法判断点与多边形关系原理如下: 从待判断点引出一条射线,射线与多边形相交,如果交点为偶数,则点不在多边形内,如果交点为奇数,则点在多边形内. 原理虽是这样,有些细节还是要注意一下 ...
- [python语法]python中如何判断一个集合是另一个集合的子集?
问:python中如何判断一个集合是另一个集合的子集? 答:用issubset()方法 语法: A.issubset(B) 返回: True 如果A是B的子集. False 如果A不是B的子集. 样例 ...
- 判断一个IP地址是否是本局域网内地址
// /// <summary> /// 判断一个IP地址是否是本局域网内地址,是返回true 否则返回false, /// </summa ...
- delphi 判断两个时间差是否在一个指定范围内
WithinPastYears.WithinPastMonths.WithinPastWeeks.WithinPastDays ... 判断两个时间差是否在一个指定范围内DateUtils.Withi ...
- JS 判断一个字符串是否包含在一个数组中
var arr = ["白色", "黑色", "红色", "粉色"]; var sel = "黑色" ...
- Spring Data MongDB空间索引(判断一个点Point是否在一个区域Polygon内)
这里要连接MongoDB数据库,在配置文件里:spring.data.mongodb.uri = mongodb://root:root@localhost:27017/happy 两个root分别是 ...
- python多层数组合成一个数组后循环打印出数组内的每一项元素的方法
a=[1,2,3,4] b=[5,6,7,8] c=[a,b] def test(c): for i in c: return i print(test(c)) 以上代码执行后打印出来的结果是 预期目 ...
- php 判断一个点是否在一个多边形区域内
<?php class pointMap{ private static $coordArray; private static $vertx = []; private static $ver ...
- 百度地图API 地图圈区域并计算坐标点是否在区域内
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
随机推荐
- vue的开发环境搭建命令加图解
vue的开发环境的搭建 不管什么软件我们都要去官网下载安装,这是作为专业程序员的安全意识. 1.安装node.js 官方下载的页面:点击这里 大约展示的页面是这样子的!我们演示是windows 64位 ...
- [POI2010]Divine Divisor
[POI2010]Divine Divisor 题目大意: 给你\(m(m\le600)\)个数\(a_i(a_i\le10^{18})\).\(n=\prod a_i\).现在要你找到一个最大的\( ...
- JAVA使用POI如何导出百万级别数据(转载)
用过POI的人都知道,在POI以前的版本中并不支持大数据量的处理,如果数据量过多还会常报OOM错误,这时候调整JVM的配置参数也不是一个好对策(注:jdk在32位系统中支持的内存不能超过2个G,而在6 ...
- [经验]我的电脑只有IE64位浏览器能上网,其他软件都上不了网
[网上案例] 1.“我的电脑是VISTA 系统 昨天还好好的 进早上就显示什么Windows通信端口初始化失败 而且连不上网 求强人帮忙”2.“正常关机,第二天开机后,无法上网了所有浏览器,除了ie6 ...
- HDU 2859 Phalanx (DP)
Phalanx Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- 乐观锁悲观锁对应的JAVA代码和数据库
乐观锁悲观锁是一种思想.可以用在很多方面. 比如数据库方面.悲观锁就是for update乐观锁就是 version字段 JDK方面:悲观锁就是sync乐观锁就是原子类(内部使用CAS实现) 本质来说 ...
- 【docker】【redis】2.docker上设置redis集群---Redis Cluster部署【集群服务】【解决在docker中redis启动后,状态为Restarting,日志报错:Configured to not listen anywhere, exiting.问题】【Waiting for the cluster to join...问题】
参考地址:https://www.cnblogs.com/zhoujinyi/p/6477133.html https://www.cnblogs.com/cxbhakim/p/9151720.htm ...
- Netty游戏服务器之五Unity3d登陆消息
今天我们来讲客户端Unity和服务器收发消息的具体过程. 首先,我们要在unity上搭建登陆界面的UI,这里呢,我用的是NGUI插件. 相信做过unity3d前端的都对这个非常的熟悉,最近官方的UGU ...
- 手机APP上中下三层
代码如下: <template> <div class="container" id="app"> <header> < ...
- 客户端的javascript改变了asp.net webform页面控件的值,后台代码中如何获取修改后的值。
客户端的javascript改变了asp.net webform页面控件的值,后台代码中如何获取修改后的值. 无论是什么的html控件,只要加上了runat="server" ...