最近在工作中遇到了这个一个需求,用户设定地理围栏,后台获取到实时位置信息后通过与围栏比较,判断是否越界等。

这个过程需要用到数据协议为GEOjson,通过查阅资料后,发现python的shapely库可以非常简单的解决这个问题,接下来演示一下我处理这个问题的过程。

测试数据:

通过http://geojson.io/来获得测试数据,如下图,在地图上绘制了一个多边形设为地理围栏,分别取了围栏内外两个点来进行测试。

得到GEOjson数据如下:

{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[
114.3458104133606,
30.476167529462785
],
[
114.34512376785278,
30.475575748963195
],
[
114.34576749801636,
30.474540124433936
],
[
114.3467652797699,
30.475363076967565
],
[
114.34693694114685,
30.476102803645833
],
[
114.3458104133606,
30.476167529462785
]
]
]
}
},
{
"type": "Feature",
"properties": {},
"geometry": {
"type": "Point",
"coordinates": [
114.34605717658997,
30.475584995561178
]
}
},
{
"type": "Feature",
"properties": {},
"geometry": {
"type": "Point",
"coordinates": [
114.346604347229,
30.476518897432545
]
}
}
]
}

安装shapely

本测试基于python——python3.6

$ pip install shapely

windows安装shapely会报错

shapely解析地理围栏

话不多说直接上代码

from shapely.geometry import Point
from shapely.geometry.polygon import Polygon point = Point(0.5, 0.5)
polygon = Polygon([(0, 0), (0, 1), (1, 1), (1, 0)])
print(polygon.contains(point))

下面是实际的实例:

from shapely.geometry import Point
from shapely.geometry.polygon import Polygon polygon_data= [
[
114.3458104133606,
30.476167529462785
],
[
114.34512376785278,
30.475575748963195
],
[
114.34576749801636,
30.474540124433936
],
[
114.3467652797699,
30.475363076967565
],
[
114.34693694114685,
30.476102803645833
],
[
114.3458104133606,
30.476167529462785
]
] point1 = Point([114.34605717658997,30.475584995561178])
point2 = Point([114.346604347229,30.476518897432545])
polygon = Polygon(polygon_data)
print(polygon.contains(point1))
print(polygon.contains(point2))

输出结果:

True
False

这样一来我们就快速的实现了,目标点是否在地理围栏内的判断。

总结

Python还是挺好用的:)

参考资料:

https://stackoverflow.com/questions/36399381/whats-the-fastest-way-of-checking-if-a-point-is-inside-a-polygon-in-python

Python一行代码处理地理围栏的更多相关文章

  1. Python一行代码

    1:Python一行代码画出爱心 print]+(y*-)**-(x**(y*<= ,)]),-,-)]) 2:终端路径切换到某文件夹下,键入: python -m SimpleHTTPServ ...

  2. 【python】10分钟教你用python一行代码搞点大新闻

    准备 相信各位对python的语言简洁已经深有领会了.那么,今天就带大家一探究竟.看看一行python代码究竟能干些什么大新闻.赶紧抄起手中的家伙,跟我来试试吧. 首先你得先在命令行进入python. ...

  3. Python一行代码搞定的事情

    python -m SimpleHTTPServer 8000 http://127.0.0.1:8000/ 有了这一行代码分享本地盘内容就不需要FTP了. pydoc:Python文档工具 pyth ...

  4. python一行代码就能搞定的事情!

    打印9*9乘法表: >>> print( '\n'.join([' '.join(['%s*%s=%-2s' % (y,x,x*y) for y in range(1,x+1)]) ...

  5. Python 一行代码

    Python语法十分便捷,通过几个简单例子了解其趣味 1.Fizz.Buzz问题为: 打印数字1到100, 3的倍数打印"Fizz", 5的倍数打印"Buzz" ...

  6. Python一行代码实现快速排序

    上期文章排序算法——(2)Python实现十大常用排序算法为大家介绍了十大常用排序算法的前五种(冒泡.选择.插入.希尔.归并),因为快速排序的重要性,所以今天将单独为大家介绍一下快速排序! 一.算法介 ...

  7. python一行代码开启http

    python -m SimpleHTTPServer 8000 & 监听8000端口 浏览器用127.0.0.1:8000访问 如果出现no module named SimpleHTTPSe ...

  8. Python 一行代码实现并行

    需求 给定一个list   针对list 中每个元素执行一定的操作(这个操作很费时间,例如爬数据的时候调用某个网站的接口),返回操作后的list 例如 给定 1-10个数,在每个数字后面加个字母a 方 ...

  9. Python一行代码获得IP地址

    比较靠谱的方法, 通过构造UDP包获得本机IP地址   python -c "import socket;print([(s.connect(('8.8.8.8', 53)), s.gets ...

随机推荐

  1. loadrunner获取当前日期、明日日期、昨日日期

    DATE_NOW(现在的日期) TIME_NOW(现在的时间) ONE_DAY(一天的时间) ONE_HOUR(一小时的时间) ONE_MIN(一分钟的时间) 可以使用公式获取昨天明天,例如: DAT ...

  2. 查看mysql 默认端口号和修改端口号

    1. 登录mysql mysql -u root -p //输入密码 2. 使用命令show global variables like 'port';查看端口号 mysql> show glo ...

  3. MySQL慢查询 - 开启慢查询

    一.简介 开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能. 二.参数说明 slow_query_log 慢查询开启状态 slow_ ...

  4. 字典树HihoCoder - 1014

    输入的第一行为一个正整数n,表示词典的大小,其后n行,每一行一个单词(不保证是英文单词,也有可能是火星文单词哦),单词由不超过10个的小写英文字母组成,可能存在相同的单词,此时应将其视作不同的单词.接 ...

  5. Java享元模式

    定义:提供了减少对象数量从而改善应用所需的对象结构的方式 运用共享技术有效支持大量细微度的对象 类型:结构型 应用场景:系统底层的开发啊,以便解决系统的性能问题 系统有大量的相似对象,需要缓存池的场景 ...

  6. Caused by: java.net.ConnectException: Connection refused: master/192.168.3.129:7077

    1:启动Spark Shell,spark-shell是Spark自带的交互式Shell程序,方便用户进行交互式编程,用户可以在该命令行下用scala编写spark程序. 启动Spark Shell, ...

  7. 一脸懵逼搭建Zookeeper分布式集群

    1:首先将http://zookeeper.apache.org/ 下载好的zookeeper-3.4.5.tar.gz上传到三台虚拟机上,之前博客搭建好的(安装Zookeeper之前记得安装好你的j ...

  8. Echarts-各个配置项详细说明总结【转】

    1.图表标题 1 title: { 2 x: 'left', // 水平安放位置,默认为左对齐,可选为: 3 // 'center' ¦ 'left' ¦ 'right' 4 // ¦ {number ...

  9. kickstart-G

    感觉自己很蠢,large数据只能交一次,忘记这回事了 A题 O(n^2)解法,用vector<set> 缓存j后面的数据,减少一重循环 #include <string> #i ...

  10. functiontools模块

    #!/usr/bin/env python# -*- coding:utf-8 -*-from functools import cmp_to_key a = [1, 6, 4, 5]a.sort(k ...