当前位置: 首页 > news >正文

GeoPandas在地理空间数据分析中的应用

GeoPandas是一个开源的Python库,专门用于处理和分析地理空间数据。它建立在Pandas库的基础上,扩展了Pandas的数据类型,使得用户能够在Python中方便地进行GIS操作。GeoPandas的核心数据结构是GeoDataFrame,它是Pandas的DataFrame的子类,可以存储几何列并执行空间操作。此外,GeoPandas还依赖于Shapely库来执行几何操作,依赖于pyogrio进行文件访问,以及依赖于matplotlib进行绘图。

以下是GeoPandas的一些主要特性:

  1. 读取和写入多种地理空间数据格式:如Shapefile、GeoJSON、PostGIS、KML等。
  2. 支持地理空间几何图形的创建、编辑和分析:包括点、线、面等。
  3. 提供空间连接、缓冲区分析、几何运算等地理空间操作
  4. 具备数据可视化能力:可以绘制地理空间数据的地图。

一:数据读取

以下是各种地理空间数据格式的简单介绍及示例:

1:Shapefile

Shapefile 是一种常见的地理空间数据格式,由多个文件组成,包括主文件(.shp)、索引文件(.shx)、属性表文件(.dbf)等。

Shapefile 的主文件(.shp文件)是一种二进制文件,用于存储地理要素的几何形状和属性信息。以下是关于 Shapefile 主文件的一些特点:

Shapefile 的主文件由固定长度的文件头和一系列可变长度的记录组成。

  1. 文件头:包含有关 Shapefile 的总体信息,如文件代码、版本号、文件长度、几何类型等。文件头的长度为 100 字节。
  2. 记录:每个记录代表一个地理要素,记录的长度取决于几何类型和属性信息的复杂性。记录由记录头和几何形状数据组成。
  3. 坐标系统信息:Shapefile 本身不包含坐标系统信息,但通常会与一个投影文件(.prj文件)一起使用,该文件描述了 Shapefile 中地理要素的坐标系统。

总的来说,Shapefile 的主文件是一种复杂的二进制文件格式,用于存储地理要素的几何形状和属性信息。要正确读取和处理 Shapefile 文件,需要使用专门的地理信息系统软件或库,如 geopandas

数据读取操作:

import geopandas as gpdgdf = gpd.read_file('path_to_shapefile.shp')

以下是一个用geopandas读取一个 Shapefile 文件后,GeoDataFramegdf)可能的输出样例:

import geopandas as gpd# 假设读取一个表示城市边界的 Shapefile 文件
gdf = gpd.read_file('cities.shp')print(gdf.head())

输出可能如下:

   id        name geometry
0   1     New York  POLYGON ((-74.006011 40.7127281, -74.0059741...
1   2       London  MULTIPOLYGON (((-0.127592 51.5073219, -0.127...
2   3      Paris  POLYGON ((2.3477772 48.8588587, 2.3478284 48.8...
3   4     Tokyo  MULTIPOLYGON (((139.741229 35.681199, 139.741...
4   5  Los Angeles  MULTIPOLYGON (((-118.243683 34.0522342, -118...

在这个例子中,假设 Shapefile 文件有idname两个属性字段和表示几何形状的geometry列。geometry列中的值可以是点、线、多边形等不同的几何对象,具体取决于数据的内容。例如,这里显示了一些城市的名称以及对应的多边形几何形状表示城市边界。

2:GeoJSON

GeoJSON 是一种基于 JSON 的开放标准格式,用于表示地理空间数据。示例如下:

{"type": "FeatureCollection","features": [{"type": "Feature","geometry": {"type": "Point","coordinates": [10, 20]},"properties": {"name": "Sample Point"}},{"type": "Feature","geometry": {"type": "Polygon","coordinates": [[[11, 21],[12, 22],[13, 21],[11, 21]]]},"properties": {"name": "Sample Polygon"}}]
}

数据读取操作:

import geopandas as gpdgdf = gpd.read_file('path_to_geojson.json')

3:PostGIS

PostGIS 是 PostgreSQL 数据库的一个空间扩展,它在数据库中存储和处理地理空间数据。

示例(在 PostgreSQL 数据库中的查询结果):

-- 查询一个表中的几何列和属性列
SELECT geom, name FROM my_table;

假设表中有一个点和一个多边形对象,结果可能如下:

geomname
POINT(10 20)Point Object
POLYGON((11 21,12 22,13 21,11 21))Polygon Object

首先安装必要的库:psycopg2sqlalchemy(如果使用 SQLAlchemy 连接数据库),其中,usernamepasswordhostportdatabase_name分别为数据库的用户名、密码、主机地址、端口号和数据库名称。your_table是要查询的表名,geometry_column_name是包含几何数据的列名。数据读取方式如下:

import geopandas as gpd
from sqlalchemy import create_engine# 创建数据库连接引擎
engine = create_engine('postgresql://username:password@host:port/database_name')# 查询数据库表并读取为 GeoDataFrame
sql = "SELECT * FROM your_table"
gdf = gpd.read_postgis(sql, engine, geom_col='geometry_column_name')

4:KML

KML(Keyhole Markup Language)是一种用于表示地理信息的 XML 格式,常用于 Google Earth 等软件。

<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2"><Placemark><name>Sample Point</name><Point><coordinates>10,20,0</coordinates></Point></Placemark><Placemark><name>Sample Polygon</name><Polygon><outerBoundaryIs><LinearRing><coordinates>11,21,0 12,22,0 13,21,0 11,21,0</coordinates></LinearRing></outerBoundaryIs></Polygon></Placemark>
</kml>

数据读取方式如下:

import geopandas as gpdgdf = gpd.read_file('path_to_kml.kml', driver='KML')

二:数据可视化

1:用Python标记世界地图

import geopandas as gpd
import matplotlib.pyplot as plt
import contextily as ctx
plt.rcParams['font.sans-serif'] = ['SimHei']  # 黑体等中文字体
# 获取自然地球数据集(包含世界各国的边界等信息)
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))# 定义要标记的固定经纬度点
latitude = 40.7128  # 例如纽约市纬度
longitude = -74.0060  # 例如纽约市经度# 创建地图
fig, ax = plt.subplots(figsize=(15, 10))# 绘制世界地图
world.plot(ax=ax)# 绘制标记点
ax.scatter(longitude, latitude, color='red', s=100)# 添加地图背景图
ctx.add_basemap(ax, zoom=2, source=ctx.providers.Stamen.Terrain)plt.title('全球地图及标记点', size=15)
plt.show()

在这个示例中,首先读取世界地图数据集,然后定义了一个固定的经纬度点(这里以纽约市为例),在地图上绘制世界地图后,使用scatter绘制标记点。最后添加地图背景图。可以根据实际需求修改标记的经纬度点和标签内容。标记后的世界地图如下:

2:用Python标记我国城市

import geopandas as gpd
import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei']  # 黑体等中文字体# 读取中国行政区划的 GeoDataFrame
china = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
china = china[china['iso_a3'] == 'CHN']# 创建地图
fig, ax = plt.subplots(figsize=(10, 8))# 绘制中国地图
china.plot(ax=ax)# 定义一些城市的经纬度和名称
cities = {'北京': (116.4074, 39.9042),'上海': (121.4737, 31.2304),'广州': (113.2644, 23.1291),'深圳': (114.0579, 22.5431),'成都': (104.0657, 30.5723)
}# 在地图上标记城市位置
for city_name, (longitude, latitude) in cities.items():ax.scatter(longitude, latitude, color='red', s=50)plt.show()

以上操作可以根据经纬度上标记一些城市位置,例如北京,上海,广州,深圳和成都,标记后的大致的地理位置演示图如下:

想要探索多元化的数据分析视角,可以关注之前发布的相关内容。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 源代码审查范围为:
  • Maven从入门到精通(三)
  • 力扣3014.输入单词需要的最少按键次数I
  • 11、LLaMA-Factory自定义数据集微调
  • 区块链的可伸缩性以及面临的挑战
  • 3D点云目标检测数据集标注工具 保姆级教程——CVAT (附json转kitti代码)
  • Python 3 速成技巧
  • 如何编写智能合约——基于长安链的Go语言的合约开发
  • 三方共建 | 网络安全运营中心正式揭牌成立
  • Linux环境变量详解命令行参数
  • Android平台RTMP|RTSP播放器如何回调YUV或RGB数据?
  • 虚拟现实智能家居实训系统实训解决方案
  • Rust 变量基础知识
  • 如何彻底清除电脑上的数据?保护你的隐私安全
  • 阿里云服务器 篇八:图片展示和分享网站(纯静态,数据信息和展示页面分离)
  • 【译】理解JavaScript:new 关键字
  • 03Go 类型总结
  • 10个最佳ES6特性 ES7与ES8的特性
  • Consul Config 使用Git做版本控制的实现
  • crontab执行失败的多种原因
  • DOM的那些事
  • JSDuck 与 AngularJS 融合技巧
  • Next.js之基础概念(二)
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • 读懂package.json -- 依赖管理
  • 反思总结然后整装待发
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 基于web的全景—— Pannellum小试
  • 计算机常识 - 收藏集 - 掘金
  • 理解在java “”i=i++;”所发生的事情
  • 码农张的Bug人生 - 见面之礼
  • 人脸识别最新开发经验demo
  • 数组的操作
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • #{}和${}的区别是什么 -- java面试
  • #mysql 8.0 踩坑日记
  • $.ajax()方法详解
  • (13):Silverlight 2 数据与通信之WebRequest
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • (void) (_x == _y)的作用
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (五)activiti-modeler 编辑器初步优化
  • ***检测工具之RKHunter AIDE
  • **PHP分步表单提交思路(分页表单提交)
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET 材料检测系统崩溃分析
  • .net 后台导出excel ,word
  • .NET编程——利用C#调用海康机器人工业相机SDK实现回调取图与软触发取图【含免费源码】
  • .NET分布式缓存Memcached从入门到实战
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • @property括号内属性讲解