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 ...
随机推荐
- bzoj 4627: [BeiJing2016]回转寿司
4627: [BeiJing2016]回转寿司 Description 酷爱日料的小Z经常光顾学校东门外的回转寿司店.在这里,一盘盘寿司通过传送带依次呈现在小Z眼前.不同的寿 司带给小Z的味觉感受是不 ...
- 输入sql语句,将结果写入到xml文件
import java.io.FileOutputStream; import java.sql.Connection; import java.sql.DriverManager; import j ...
- Java中的服务器与客户端的简单连接
Java中重点之一就是服务器与客户端的连接,因为是在同一台PC上,所以就设置服务器的地址为“localhost”,注意,我当时试着设置其他名称,但都不行,这个原因还请老司机告一下.另外还要注意,服务端 ...
- ucenter创始人密码忘记了,修改方法
简单的:1.在UCenter/data/下找到config.inc.php,打开找到下面2行代码: define('UC_FOUNDERPW', '3858cdf66b0794bfd435af8c0c ...
- NServiceBus入门:发送一个命令(Introduction to NServiceBus: Sending a command)
原文地址:https://docs.particular.net/tutorials/intro-to-nservicebus/2-sending-a-command/ 侵删. 能够发送和接收mess ...
- HDU 4630 No Pain No Game(2013多校3 1010题 离线处理+树状数组求最值)
No Pain No Game Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- 动画clip仅仅读的解决的方法,以及动画关键帧回调的办法
之前在Asset store上面下载了一个模型,有动画,可是想在Animation窗体编辑动画,插入关键帧的时候,出现了一点问题,发现动画切片是可读的. 在网上查了一下解决方式,后来在这里找到了答案: ...
- 常见Linux版本
一 常见Linux版本 website feature description http://www.ubuntu.com/ 当前最流行 Ubuntu 正是基于 Debian 之上,旨在创建一个可 ...
- Helm安装和项目使用
整体架构 1.为什么要用? 首先在原来项目中都是基于yaml文件来进行部署发布的,而目前项目大部分微服务化或者模块化,会分成很多个组件来部署,每个组件可能对应一个deployment.yaml,一个s ...
- [Guava] EventBus
1. 发布-订阅模式 发布-订阅模式(publish-subscribe)是一种编程范式,发布方不发布消息给特定的接收方,而是由订阅方选择性接收.这使得发布方和订阅方相对独立,减少了耦合性. 在发布 ...