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 射线法判断一个点坐标是否在一个坐标区域内的更多相关文章

  1. matlab练习程序(射线法判断点与多边形关系)

    依然是计算几何. 射线法判断点与多边形关系原理如下: 从待判断点引出一条射线,射线与多边形相交,如果交点为偶数,则点不在多边形内,如果交点为奇数,则点在多边形内. 原理虽是这样,有些细节还是要注意一下 ...

  2. [python语法]python中如何判断一个集合是另一个集合的子集?

    问:python中如何判断一个集合是另一个集合的子集? 答:用issubset()方法 语法: A.issubset(B) 返回: True 如果A是B的子集. False 如果A不是B的子集. 样例 ...

  3. 判断一个IP地址是否是本局域网内地址

    //        /// <summary>        /// 判断一个IP地址是否是本局域网内地址,是返回true 否则返回false,        /// </summa ...

  4. delphi 判断两个时间差是否在一个指定范围内

    WithinPastYears.WithinPastMonths.WithinPastWeeks.WithinPastDays ... 判断两个时间差是否在一个指定范围内DateUtils.Withi ...

  5. JS 判断一个字符串是否包含在一个数组中

    var arr = ["白色", "黑色", "红色", "粉色"]; var sel = "黑色" ...

  6. Spring Data MongDB空间索引(判断一个点Point是否在一个区域Polygon内)

    这里要连接MongoDB数据库,在配置文件里:spring.data.mongodb.uri = mongodb://root:root@localhost:27017/happy 两个root分别是 ...

  7. 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)) 以上代码执行后打印出来的结果是 预期目 ...

  8. php 判断一个点是否在一个多边形区域内

    <?php class pointMap{ private static $coordArray; private static $vertx = []; private static $ver ...

  9. 百度地图API 地图圈区域并计算坐标点是否在区域内

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. springmvc之文件上传、下载

    1.接收到的是图片的流时 //上传头像 @RequestMapping(value = "/uploadHeadSculpture", method = RequestMethod ...

  2. Java并发(三):重排序

    在执行程序时为了提高性能,提高并行度,编译器和处理器常常会对指令做重排序.重排序分三种类型: 编译器优化的重排序.编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序. 指令级并行的重排序 ...

  3. jquery ajax 的封装

    var tooAjaxData = new Object(); tooAjaxData = function () { this.AjaxUrl =" ";}; bookInfoC ...

  4. Codeforces Round #345 (Div. 1) E. Clockwork Bomb 并查集

    E. Clockwork Bomb 题目连接: http://www.codeforces.com/contest/650/problem/E Description My name is James ...

  5. ubuntu中使用apt-get install 安装的软件的一些目录所在地

    apt-get 所下载的用于安装的软件包,在 /var/cache/apt/archives中.如果执行过 apt-get clean ,那么原始下载的包就找不到了. 1.下载的软件存放位置/var/ ...

  6. mysql常见故障问题汇总

    Auth: JinDate: 20140414 UpdateDate: 继续更新 导库字符集的问题http://www.cnblogs.com/diege/p/3640618.htmlmysql-pr ...

  7. go排序后索引

    最近碰上了一个需求,要得到排序后的原索引序列. 我又不希望自己重新实现一快排出来,所以在接口上重新封装了一下. package main import ( "fmt" " ...

  8. Word中设置三栏式表格

    一般期刊要求三栏式表格,我原来是选中表格,用橡皮差擦去不必要的线,但是今天发现只能查去横线,竖线一插曲格式就乱了,我想起了上图,不选“内部竖框线”就好了.

  9. 基于tiny4412的Linux内核移植 -- PWM子系统学习(七)

    作者信息 作者: 彭东林 邮箱:pengdonglin137@163.com QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本 ...

  10. MySQL 连接错误Can't connect to MySQL server on (61)

    链接数据库时忽然遇到一个问题.Mac Navicat链接时报错Can’t connect to MySQL server on ‘xx.xx.xx.xx’ (61). PS. win版Navicat ...