Python的exifread库可以获取图片中的源数据信息,包括经纬度、相机厂商、曝光时间、焦距、拍摄时间、拍摄地点等等信息。我们可以通过exifread库从图片中获取图片的经纬度,再通过shapely库判断该经纬度对应的点是否在我们的感兴趣区内。

        当然你需要知道图片的经纬度是什么坐标系,大部分是WGS84地理坐标系,具体需要自己了解。如果是GPS定位那么就是WGS84坐标系。

        shapely主要是在笛卡尔平面对几何对象进行操作和分析,它是一个BSD授权的Python包。shapely不关心数据格式或坐标系,但可以很容易地与这些文件包集成。

        geopandas是用来处理地理空间数据的python第三方库,它是在pandas的基础上建立的,完美地融合了pandas的数据类型,并且提供了操作地理空间数据的高级接口,使得在python中进行GIS操作变成可能。

1.导入所需要的三方库。exifread、geopandas、shapely

import exifread
import geopandas
from shapely.geometry import Point

2.打开本地图片,使用exifread读取图片的源数据信息,读取其中的经纬度信息,获取经纬度后记得关闭图片进程。

        f = open(path_image,'rb')中的path_image即为本地图片的路径。

f = open(path_image, 'rb')
# 打开图片
contents = exifread.process_file(f)
# 获取图片属性信息
longitude = contents["GPS GPSLongitude"].values
# 获取Long
longitude_f = longitude[0].num/longitude[0].den + (longitude[1].num/longitude[1].den/60) + (longitude[2].num/longitude[2].den/3600)
latitude = contents["GPS GPSLatitude"].values
# 获取Lat
latitude_f = latitude[0].num/latitude[0].den + (latitude[1].num/latitude[1].den/60) + (latitude[2].num/latitude[2].den/3600)
# print("经度:", longitude_f) # contents['GPS GPSLatitudeRef']
# print("纬度:", latitude_f) # contents['GPS GPSLongitudeRef']
f.close()
# 关闭图片

3.创建工作空间,将图片经纬度信息写入矢量图层,使用shapely.geometry的contains函数判断点是否在面内。

        根据返回值判断点是否在面内。返回值为True or False,True则点在面内,False则点在面外。   

datasource = geopandas.GeoDataFrame.from_file(path_conservation_area, encoding='utf-8')
# 创建工作空间
boundary_shape = datasource['geometry'][0]
# 将shp区域加载到工作空间
determine_contain = boundary_shape.contains(Point([longitude_f, latitude_f]))
# 判断点是否在区间内

4.完整代码,记得改成自己的路径。

        1)面矢量数据“path_conservation_area”的路径

        2)本地图片“path_image”的路径

# -*- coding: utf-8 -*-
"""
@Time : 2023/5/15 15:57
@Auth : RS迷途小书童
@File :Discriminative point surface.py
@IDE :PyCharm
"""
import exifread
import geopandas
from shapely.geometry import Point def Get_LatLon(path_image):
"""
:param path_image: 输入图片路径
:return: 返回经纬度
"""
f = open(path_image, 'rb')
# 打开图片
contents = exifread.process_file(f)
# 获取图片属性信息
longitude = contents["GPS GPSLongitude"].values
# 获取Long
longitude_f = longitude[0].num/longitude[0].den + (longitude[1].num/longitude[1].den/60) + (longitude[2].num/longitude[2].den/3600)
latitude = contents["GPS GPSLatitude"].values
# 获取Lat
latitude_f = latitude[0].num/latitude[0].den + (latitude[1].num/latitude[1].den/60) + (latitude[2].num/latitude[2].den/3600)
# print("经度:", longitude_f) # contents['GPS GPSLatitudeRef']
# print("纬度:", latitude_f) # contents['GPS GPSLongitudeRef']
f.close()
# 关闭图片
return longitude_f, latitude_f def Filter_images(path_conservation_area, longitude_f, latitude_f):
"""
:param path_conservation_area: 面数据路径
:param longitude_f: 经度
:param latitude_f: 纬度
:return: True or False
"""
# path_conservation_area = r'G:/B60/B60.shp'
datasource = geopandas.GeoDataFrame.from_file(path_conservation_area, encoding='utf-8')
# 创建工作空间
boundary_shape = datasource['geometry'][0]
# 将shp区域加载到工作空间
determine_contain = boundary_shape.contains(Point([longitude_f, latitude_f]))
# 判断点是否在区间内
return determine_contain if __name__ == "__main__":
path_conservation_area = r'G:/B60/B60.shp'
# 面数据路径
path_image = "G:/image1.jpg"
# 图片路径
longitude_f, latitude_f = Get_LatLon(path_image)
# 执行获取经纬度函数
determine_contain = Filter_images(path_conservation_area, longitude_f, latitude_f)
# 执行判断点是否在区间的函数
print(determine_contain)

        如果不需要读取图片,已经有经纬度的点,则可以不执行Get_LatLon()函数,直接将经纬度信息作为入参执行Filter_images()函数即可。同时还可以使用for循环查看多个点数据,当然如果想查看面与面是否存在包含关系同样也可以实现,自己改下图层空间即可。

    

        本文章分享个人在工作项目中使用到的代码,仅供学习使用!如有侵权请联系作者删除,大家有问题可以留言交流,博主会及时回复。

【Python&GIS】判断图片中心点/经纬度点是否在某个面内的更多相关文章

  1. 用python实现数字图片识别神经网络--启动网络的自我训练流程,展示网络数字图片识别效果

    上一节,我们完成了网络训练代码的实现,还有一些问题需要做进一步的确认.网络的最终目标是,输入一张手写数字图片后,网络输出该图片对应的数字.由于网络需要从0到9一共十个数字中挑选出一个,于是我们的网络最 ...

  2. Python批量修改图片格式和尺寸

    Python批量修改图片格式和尺寸 备注: 1.导入了PIL库,是处理图片用的,很强大; 2.导入了的win32库,是判断隐藏文件用的,我们的项目需要删除隐藏文件,不需要的可以直接找到删除. 3.导入 ...

  3. (数据科学学习手札147)Python GIS利器shapely全新2.0版本一览

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,我写过很多篇介绍geopand ...

  4. javascript判断图片是否加载完成方法整理

    有时候我们在前端开发工作中为了获取图片的信息,需要在图片加载完成后才可以正确的获取到图片的大小尺寸,并且执行相应的回调函数使图片产生某种显示效果.本文主要整理了几种常见的javascipt判断图片加载 ...

  5. JavaScript判断图片是否加载完成的三种方式

    JavaScript判断图片是否加载完成的三种方式 有时需要获取图片的尺寸,这需要在图片加载完成以后才可以.有三种方式实现,下面一一介绍. 一.load事件 1 2 3 4 5 6 7 8 9 10 ...

  6. java代码判断图片文件格式, 不是根据文件后缀来判断。

    public static final String TYPE_JPG = "jpg"; public static final String TYPE_GIF = "g ...

  7. php 判断图片类型

    脚本之家 <?php $imgurl = "http://www.jb51.net/images/logo.gif"; //方法1 echo $ext = strrchr($ ...

  8. js判断图片是否显示

    function getDefaultImg() { //添加判断图片是否存在操作 var $defaultImgPathObj = $('input[name=defaultImgPath]'); ...

  9. javaScript & jquery完美判断图片是否加载完毕

    好久没写东西了,正好最近因为工作需要,写了一个瀑布流异步加载的程序. 今天就不谈瀑布流,来谈一下关于load的问题. ----------------------------------------- ...

  10. JS判断图片是否加载完成三种方式

    1.img的complete属性 轮询不断监测img的complete属性,如果为true则表明图片已经加载完毕,停止轮询.该属性所有浏览器都支持. <p id="p1"&g ...

随机推荐

  1. 如何用Python对股票数据进行LSTM神经网络和XGboost机器学习预测分析(附源码和详细步骤),学会的小伙伴们说不定就成为炒股专家一夜暴富了

    前言 最近调研了一下我做的项目受欢迎程度,大数据分析方向竟然排第一,尤其是这两年受疫情影响,大家都非常担心自家公司裁员或倒闭,都想着有没有其他副业搞搞或者炒炒股.投资点理财产品,未雨绸缪,所以不少小伙 ...

  2. GO实现Redis:GO实现TCP服务器(1)

    本文实现一个Echo TCP Server interface/tcp/Handler.go type Handler interface { Handle(ctx context.Context, ...

  3. GO实现Redis:GO实现内存数据库(3)

    实现Redis的database层(核心层:处理命令并返回) https://github.com/csgopher/go-redis datastruct/dict/dict.go type Con ...

  4. SpringBoot高频面试题

    Springboot的优点 内置servlet容器,不需要在服务器部署 tomcat.只需要将项目打成 jar 包,使用 java -jar xxx.jar一键式启动项目 SpringBoot提供了s ...

  5. Python集合常用操作

    一.集合的介绍   1.定义:集合是无序的,集合中的元素是唯一的,集合一般用于元组或者列表中的元素去重.   2.特性:集合的目的是将不同的值存放在一起,不同的集合间用来做关系运算,无须纠结于集合中的 ...

  6. Schillace法则:使用LLM创建软件的最佳实践

    LLM(大语言模型)的发展正在改变软件开发的方式. 以前,开发人员需要编写大量的代码来实现其意图,但现在,随着语言模型的发展,开发人员可以使用自然语言来表达他们的意图,而无需编写大量的代码.这使得软件 ...

  7. 解密prompt系列5. APE+SELF=自动化指令集构建代码实现

    上一章我们介绍了不同的指令微调方案, 这一章我们介绍如何降低指令数据集的人工标注成本!这样每个人都可以构建自己的专属指令集, 哈哈当然我也在造数据集进行时~ 介绍两种方案SELF Instruct和A ...

  8. Windows服务器重启注意事项

    windows作为服务器有它的优势,但是相比于基于linux作为服务器来说,它不够稳定,这里的windows服务器作为服务器有各种版本,windows2012,2008,甚至还有2003,XP的系统, ...

  9. Redis缓冲区溢出及解决方案

    缓冲区(buffer),是内存空间的一部分.也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区. 一.Redis缓冲区溢出影响 在Redis ...

  10. 【SpringMVC】(二)RESTFul

    RESTFul RestFul简介 REST:Representational State Transfer,表现层资源状态转移 资源:资源是一种看待服务器的方式 资源的表述:资源的表述是资源在某个特 ...