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

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

测试数据:

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

得到GEOjson数据如下:

  1. {
  2. "type": "FeatureCollection",
  3. "features": [
  4. {
  5. "type": "Feature",
  6. "properties": {},
  7. "geometry": {
  8. "type": "Polygon",
  9. "coordinates": [
  10. [
  11. [
  12. 114.3458104133606,
  13. 30.476167529462785
  14. ],
  15. [
  16. 114.34512376785278,
  17. 30.475575748963195
  18. ],
  19. [
  20. 114.34576749801636,
  21. 30.474540124433936
  22. ],
  23. [
  24. 114.3467652797699,
  25. 30.475363076967565
  26. ],
  27. [
  28. 114.34693694114685,
  29. 30.476102803645833
  30. ],
  31. [
  32. 114.3458104133606,
  33. 30.476167529462785
  34. ]
  35. ]
  36. ]
  37. }
  38. },
  39. {
  40. "type": "Feature",
  41. "properties": {},
  42. "geometry": {
  43. "type": "Point",
  44. "coordinates": [
  45. 114.34605717658997,
  46. 30.475584995561178
  47. ]
  48. }
  49. },
  50. {
  51. "type": "Feature",
  52. "properties": {},
  53. "geometry": {
  54. "type": "Point",
  55. "coordinates": [
  56. 114.346604347229,
  57. 30.476518897432545
  58. ]
  59. }
  60. }
  61. ]
  62. }

安装shapely

本测试基于python——python3.6

  1. $ pip install shapely

windows安装shapely会报错

shapely解析地理围栏

话不多说直接上代码

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

下面是实际的实例:

  1. from shapely.geometry import Point
  2. from shapely.geometry.polygon import Polygon
  3. polygon_data= [
  4. [
  5. 114.3458104133606,
  6. 30.476167529462785
  7. ],
  8. [
  9. 114.34512376785278,
  10. 30.475575748963195
  11. ],
  12. [
  13. 114.34576749801636,
  14. 30.474540124433936
  15. ],
  16. [
  17. 114.3467652797699,
  18. 30.475363076967565
  19. ],
  20. [
  21. 114.34693694114685,
  22. 30.476102803645833
  23. ],
  24. [
  25. 114.3458104133606,
  26. 30.476167529462785
  27. ]
  28. ]
  29. point1 = Point([114.34605717658997,30.475584995561178])
  30. point2 = Point([114.346604347229,30.476518897432545])
  31. polygon = Polygon(polygon_data)
  32. print(polygon.contains(point1))
  33. print(polygon.contains(point2))

输出结果:

  1. True
  2. 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. (转) Golang的单引号、双引号与反引号

    Go语言的字符串类型string在本质上就与其他语言的字符串类型不同: Java的String.C++的std::string以及Python3的str类型都只是定宽字符序列 Go语言的字符串是一个用 ...

  2. java中的相对目录问题

    在java开发过程中,常常需要使用本地文件内容文件.在调试他人代码的过程中,可能不经意间改变了源代码的根目录(顶级目录),从而导致“java io filenotfoundexception ”.解决 ...

  3. pycharm常用设置和快捷键大全

    pycharm常用快捷键 1.编辑(Editing) Ctrl + Space    基本的代码完成(类.方法.属性)Ctrl + Alt + Space  快速导入任意类Ctrl + Shift + ...

  4. B: Ocean的游戏(前缀和)

    B: Ocean的游戏 Time Limit: 1 s      Memory Limit: 128 MB Submit My Status Problem Description 给定一个字符串s, ...

  5. python property的用法

    用法一: class Test(object): def __init__(self): # 私有化 self.__num = 100 #名字重整_Test__num def setNum(self, ...

  6. mybatis + oracle insert clob,出现ORA-01461:仅能绑定要插入LONG列的LONG值

    在网上查了很久,有可能问题是出现在当从dual中取数据时,会将clob对象的字段转为Long型 最后的解决方法用到了Begin和end语法: 1.用到begin 和end 2.用到insert int ...

  7. Vue-切割json数组字符串并循环输出

    Json "detailList":[ " 04/08/2016 - LA - - Dept. - TITLE (Lien Reported)", " ...

  8. file按钮美化成图片(纯HTML+CSS)

    效果图: 代码实现: html: <div> <h2>上传头像</h2> <p class="fs18">(请上传200X200px ...

  9. 个人笔记本安装多个jdk(jdk1.7,jdk1.8,jdk1.9,jdk10.0)出现的问题

    1.个人笔记本已经安装jdk1.7,jdk1.8,(之前没有在意这个问题).最近想学习jdk10.0,安装以后,环境变量变成了jdk10.0,就是cmd输入命令java -version,显示版本是j ...

  10. nginx error.log 提示 [error] 887#887: *58 FastCGI sent in stderr: "PHP message: PHP Warning: mysql_connect(): Headers and client library minor version mismatch. Headers:50556 Library:50637

    0. 1.问题 1.1现象: nginx error.log 提示 [error] 887#887: *58 FastCGI sent in stderr: "PHP message: PH ...