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 gpd

gdf = 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 gpd

gdf = 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 gpd

gdf = 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 plt

plt.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()

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/875656.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp小程序,使用腾讯地图获取定位

本篇文章分享一下在实际开发小程序时遇到的需要获取用户当前位置的问题&#xff0c;在小程序开发过程中经常使用到获取定位功能。uniapp官方也提供了相应的API供我们使用。 官网地址&#xff1a;uni.getLocation(OBJECT)) 官网获取位置的详细介绍这里就不再讲述了&#xff0c;大…

红光一字激光器在工业中的性能指标怎样

红光一字激光器作为现代工业中不可或缺的重要设备&#xff0c;以其独特的性能和广泛的应用场景&#xff0c;成为众多行业的首选工具。本文就跟大家详细探讨红光一字激光器在工业中的性能指标&#xff0c;以及这些指标如何影响其在实际应用中的表现。 光束质量 红光一字激光器以…

【痛点解决】跨网跨区域的文件传输摆渡解决办法指南

跨网跨区域的文件传输摆渡&#xff0c;顾名思义就是需要跨越不同网络、不同地区&#xff0c;或者是不同安全域的文件传输&#xff0c;一般有这样传输需求的机构&#xff0c;在组织架构、网络结构&#xff0c;或者传输需求上&#xff0c;都会比较复杂。 跨网跨区域文件传输是什…

51单片机快速入门之定时器和计数器

51单片机快速入门之定时器 断开外部输入 晶振振荡 假设为 12MHz 12分频之后,为1MHz 当其从0-65536 时,需要65536μs 微秒 也就是65.536ms 毫秒 溢出(值>65536 时)>中断>执行中断操作 假设需要1ms后产生溢出,则需要设置初始值为64536 此时定时器会从 64536 开始计…

掌握 JavaScript ES6+:现代编程技巧与模块化实践

掌握 JavaScript ES6&#xff1a;现代编程技巧与模块化实践 一 . 变量声明 let二 . 声明常量 const三 . 模板字符串四 . 函数的参数默认值五 . 箭头函数六 . 对象初始化七 . 解构7.1 接收 JSON 对象7.2 接收数组 八 . 延展操作符九 . 导入和导出9.1 方式一9.2 方式二 这篇文章我…

Android视频编辑:利用FFmpeg实现高级功能

在移动设备上进行视频编辑的需求日益增长&#xff0c;用户期望能够在智能手机或平板电脑上轻松地编辑视频&#xff0c;以满足社交媒体分享或个人存档的需求。Android平台因其广泛的用户基础和开放的生态系统&#xff0c;成为视频编辑应用的理想选择。FFmpeg&#xff0c;作为一个…

Maven入门学习笔记

一、maven介绍 Maven是一款自动化构建工具&#xff0c;专注服务于JAVA平台的项目构建和依赖管理。在javaEE开发的历史上构建工具的发展也经历了一系列的演化和变迁。 管理jar包 当我们使用SSM之后我们就需要使用非常多的jar包 没有maven找jar包非常的麻烦。 使用maven下载…

简单了解 JVM

目录 ♫什么是JVM ♫JVM的运行流程 ♫JVM运行时数据区 ♪虚拟机栈 ♪本地方法栈 ♪堆 ♪程序计数器 ♪方法区/元数据区 ♫类加载的过程 ♫双亲委派模型 ♫垃圾回收机制 ♫什么是JVM JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java虚拟机。 虚拟机是指通过软件模…

WPF DataGrid 列表中,DataGrid.Columns 列根据不同的值显示不同内容

需求&#xff1a;在WPF DataGrid 控件中&#xff0c;有以下列&#xff0c;绑定了一个LogType&#xff0c;值分别是0,1,2&#xff0c;根据不同的值&#xff0c;显示不同的内容以及背景 <DataGrid ItemsSource"{Binding EventLog}"><DataGrid.Columns><…

代码管理工具——git及阿里云云效的使用(包含git的使用及云效自动化部署)

1、做项目开发时都会用到代码管理工具,像是我之前使用过gitHub,Visual Studio等一些代码管理工具&#xff0c;这里介绍的是阿里云云效的使用。 2、首先登录阿里云云效&#xff0c;登录进去之后会看到公司给你开放的一个仓库。 3、进入仓库&#xff0c;点击克隆/下载&#xff0…

Google大数据架构技术栈

数据存储层 Colossus Colossus作为Google下一代GFS&#xff08;Google File System&#xff09;。 GFS本身存在一些不足 单主瓶颈 GFS 依赖单个主节点进行元数据管理&#xff0c;随着数据量和访问请求的增长&#xff0c;出现了可扩展性瓶颈。想象一下&#xff0c;只有一位…

网红酒店|基于java的网红酒店预定系统(源码+数据库+文档)

酒店预定|网红酒店|网红酒店预定系统 目录 基于java的网红酒店预定系统 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&am…

R语言统计分析——功效分析(比例、卡方检验)

参考资料&#xff1a;R语言实战【第2版】 1、比例检验 当比较两个比例时&#xff0c;可使用pwr.2p.test()函数进行功效分析。格式为&#xff1a; pwr.2p.test(h, n, sig.level, power, alternative) 其中&#xff0c;h是效应值&#xff0c;n是各相同的样本量。效应值h的定义如…

智能头盔语音识别声控芯片,AI离线语音识别ic方案,NRK3301

头盔是交通事故中保护电动车车主安全的最后一道屏障。为了增加骑行用户的安全保护&#xff0c;改善骑行用户的出行体验&#xff0c;让用户从被动使用头盔到主动佩戴头盔&#xff0c;头盔厂家与九芯电子合作&#xff0c;推出了语音智能头盔&#xff0c;它具备首家骑行专用的智能…

C++核心编程和桌面应用开发 第三天(C和C++的封装)

目录 1.封装 1.1C语言封装缺陷 1.2C下的封装 1.3封装的访问权限 2.C中struct和class的区别&#xff1a; 1.封装 1.1C语言封装缺陷 1.2C下的封装 优点1&#xff1a;将属性和行为作为整体&#xff0c;表现生活中的事务 优点2&#xff1a;将属性和行为加以访问权限控制 1…

vue的路由

v2用3版本&#xff0c;v3用4版本 import Vue from vue import VueRouter from vue-router Vue.use(VueRouter) const routes [] const router new VueRouter({ routes }) export default router import Vue from vue import App from ./App.vue import router from /router V…

kkFileView PDF Image Mode Preview BUG

kkFileView PDF & Image Mode Preview BUG lazyload.js officePicture.ftl pdf.ftl kkFileView getCorsFile?urlPath 会触发SSRF漏洞 kkFileView SSRF-CSDN博客 commonHeader.ftl initWaterMark() 修改代码的工作量&#xff0c;主要是先部署项目&#xff0c;解…

微信小程序开发——比较两个数字大小

在这里我们使用的工具是 需要自行安装和配置。 在微信小程序中比较两个数字大小有以下几种方式&#xff1a; 一、普通条件判断 在小程序的.js 文件中&#xff0c;先定义两个数字&#xff0c;如let num1 5; let num2 3;。通过if - else if - else语句&#xff0c;根据num1与…

Machine Learning: A Probabilistic Perspective 机器学习:概率视角 PDF免费分享

下载链接在博客最底部&#xff01;&#xff01; 之前需要参考这本书&#xff0c;但是大多数博客都是收费才能下载本书。 在网上找了好久才找到免费的资源&#xff0c;浪费了不少时间&#xff0c;在此分享以节约大家的时间。 链接: https://pan.baidu.com/s/1erFsMcVR0A_xT4fx…

TypeScript:泛型

一、简介 软件工程中&#xff0c;我们不仅要创建一致的定义良好的API&#xff0c;同时也要考虑可重用性。 组件不仅能够支持当前的数据类型&#xff0c;同时也能支持未来的数据类型&#xff0c;这在创建大型系统时为你提供了十分灵活的功能。 在像C#和Java这样的语言中&#x…