shp文件与数据库(创建shp文件)

前言

前面把shp文件中的内容读取到数据库,接下来就把数据库中的表变成shp文件。

正文

简单的创建一个shp文件

暂时不读取数据库的表,先随机创建一个shp文件。既然是随机的,这就需要使用到faker这个第三方库,代码如下。

import geopandas as gpd
from faker import Faker
from shapely.geometry import Polygon
def create_shp(shp_path):# 中文fake = Faker('zh_CN')geo_data = []for _ in range(100):# 随机生成经纬度latitude, longitude = fake.latitude(), fake.longitude()# 创建四个点,矩形points = [(float(longitude), float(latitude)),(float(longitude)+10, float(latitude)),(float(longitude)+10, float(latitude)+10),(float(longitude), float(latitude)+10)]# 创建一个Polygon对象polygon = Polygon(points)# 添加到列表geo_data.append({'geometry': polygon, 'name': fake.name(), 'address': fake.address().replace('\n', ', ')})# 创建GeoDataFrame对象gdf = gpd.GeoDataFrame(geo_data, crs="4326")gdf.to_file(shp_path,encoding='utf-8')

运行代码


if __name__ == '__main__':create_shp('C:/Users/26644/Desktop/out/faker_data.shp')

在桌面的out文件中生成faker_data.shp文件,如下图所示

查看数据

查看生成shp文件中的数据

用arcmap打开shp文件,添加一下属性,展示如下图所示。

查看一下属性表

数据都是伪造的,如有雷同,请勿当真。当然全是面(POLYGON),字段或者类型,这些都是可以自己定义的,看个人需求,还是可以,有模有样的。

根据数据库创建shp文件

简单地读取表的数据

读取表中的数据,很明显,需要使用select语句,可以直接如下sql

select * from table

就可以读取表中的全部信息,代码如下。

from sqlalchemy import create_engine,Table,select,MetaData
import geopandas as gpdengine = create_engine('postgresql+psycopg2://username:password@localhost/arcgis')
gdf = gpd.read_postgis('select * from cd', engine, geom_col='geometry')
gdf.to_file('C:/Users/26644/Desktop/out/成都.shp', encoding='utf-8')

代码几行,结果如下。

可以看到除了FID,还有一个id字段,这个是表中的字段,这个其实看个人需要,因为arcmap为这个shp文件添加了FID,其实在创建表中就不需要主键id字段,通过geopandas读取shp创建表就没有id字段,有也没问题,看个人需要。

复杂地读取表中的数据

代码如下。

from sqlalchemy import create_engine, Table, MetaData, select
from geoalchemy2 import Geometry
import geopandas as gpd
from sqlalchemy.sql.base import ReadOnlyColumnCollection
from sqlalchemy.exc import NoSuchTableErrorengine = create_engine('postgresql+psycopg2://username:password@localhost/arcgis')
metadata = MetaData()class db2shp:def __init__(self,table_name,shp_path,has_id: bool = False,geom_type: str = 'geometry',):""":param table_name: 表名:param shp_path: shp文件路径:param has_id: shp是否包含id列,假设表中带有id:param geom: geometry的类型"""self.table_name = table_nameself.shp_path = shp_pathself.has_id = has_idself.geom_type = geom_typeself.__table: Table = Noneself.__columns: ReadOnlyColumnCollection = Noneself.__sql: str = Nonedef __get_table(self):"""获取表:return: """try:self.__table = Table(self.table_name, metadata, autoload_with=engine)except NoSuchTableError as e:print(e)def __get_column(self):"""获取列名:return: """if self.has_id:self.__columns = self.__table.columns.keys()else:self.__columns = self.__table.columns.keys()[1:]def __get_sql(self):"""获取sql语句:return: """self.__sql = select(*[getattr(self.__table.c, col) for col in self.__columns])def __get_data(self):"""获取数据:return: """with engine.connect() as connection:return gpd.read_postgis(self.__sql, connection, geom_col=self.geom_type)def get_shp(self):"""获取shp文件:return: """self.__set()data = self.__get_data()data.to_file(self.shp_path, encoding='utf-8')def __set(self):"""设置属性:return: """self.__get_table()self.__get_column()self.__get_sql()

考虑是否需要读取id字段,当然,假设表有id字段。如果表本身没有id字段,代码肯定有所不同。

运行上面代码。

convert = db2shp('cd', 'C:/Users/26644/Desktop/out/成都_1.shp')
convert.get_shp()

结果如下。

打开属性表

可以看到和下载的成都.shp的数据一样,字段也可以查看一下。

shp文件转json

代码如下。

import geopandas as gpd# 读取.shp文件
gdf = gpd.read_file('C:/Users/26644/Desktop/out/成都_1.shp')# 转为GeoJSON格式
gdf.to_file('cd.json', driver='GeoJSON')

结果如下。

完成。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【排序】快速排序(C语言实现)

文章目录 前言1. Hoare思想2. 挖坑法3. 前后指针法4. 三路划分5. 快速排序的一些小优化5.1 三数取中常规的三数取中伪随机的三数取中 5.2 小区间优化 6. 非递归版本的快排7. 快速排序的特性总结 前言 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其…

格密码基础:SIS问题的困难性

目录 一. SIS问题的困难性 二. SIS问题归约的性质 2.1 2004年 [MR04] 2.2 2008年 【GPV08】 2.3 2013年【MP13】 三. 归约证明 3.1 核心理解 3.2 归约步骤 3.3 性质理解 一. SIS问题的困难性 推荐先阅读: 格密码基础:SIS问题的定义与理解-CSD…

【Linux】应用与驱动交互及应用间数据交换

一、应用程序与 Linux 驱动交互主要通过以下几种方式: 1. 系统调用接口(System Calls): 应用程序可以通过系统调用,如 open(), read(), write(), ioctl(), 等来与设备驱动进行交互。这些调用最终会通过内核转发到相应的驱动函数…

感染嗜肺军团菌是什么感觉?

记录一下最近生病的一次经历吧,可能加我好友的朋友注意到了,前几天我发了个圈,有热心的朋友还专门私信了我说明了他自己的情况和治疗经验,感谢他们。 ​ 那么关于这次生病的经历,给大家分享一下。 首先,这次…

解锁 JavaScript 数组的强大功能:常用方法和属性详解(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

70.网游逆向分析与插件开发-角色数据的获取-自动化助手UI显示角色数据

内容参考于:易道云信息技术研究院VIP课 上一个内容:利用技能点属性分析角色数据基址-CSDN博客 码云地址(ui显示角色数据 分支):https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号:367aa71f60b…

C++ 完成Client分页显示log

分页显示t_log 1、获取用户的输入 1.1、写一个Input成员函数&#xff0c;处理输入进来的语句 std::string XClient::Input() {//清空缓冲//cin.ignore(4096, \n);string input "";for (;;){char a getchar();if (a < 0 || a \n || a \r)break;cout <<…

蓝桥杯准备

书籍获取&#xff1a;Z-Library – 世界上最大的电子图书馆。自由访问知识和文化。 (zlibrary-east.se) 书评&#xff1a;(豆瓣) (douban.com) 一、观千曲而后晓声 别人常说蓝桥杯拿奖很简单&#xff0c;但是拿奖是一回事&#xff0c;拿什么奖又是一回事。况且&#xff0c;如果…

LeetCode讲解篇之78. 子集

文章目录 题目描述题解思路题解代码 题目描述 题解思路 初始化一个start变量记录当前从哪里开始遍历搜索nums 搜索过程的数字组合加入结果集 然后从start下标开始遍历nums&#xff0c;更新start&#xff0c;递归搜索 直到搜索完毕&#xff0c;返回结果集 题解代码 class …

wxWidgets实战:使用mpWindow绘制阻抗曲线

选择模型时&#xff0c;需要查看model的谐振频率&#xff0c;因此需要根据s2p文件绘制一张阻抗曲线。 如下图所示&#xff1a; mpWindow 左侧使用mpWindow&#xff0c;右侧使用什么&#xff1f; wxFreeChart https://forums.wxwidgets.org/viewtopic.php?t44928 https://…

npm run dev,vite 配置 ip 访问

启动项目通过本地 ip 的方式访问 方式一.通过修改 package.json "scripts": {"dev": "vite --host 0.0.0.0",}, 方式二.通过修改 vite.config.ts export default defineConfig({plugins: [vue(), vueJsx()],server: { // 配置 host 与 port 方…

AI大模型学习笔记二

文章目录 一、Prompt Engineering1&#xff09;环境准备 二、LangChain&#xff08;一个框架名字&#xff09;三、Fine-tuning&#xff08;微调&#xff09; 一、Prompt Engineering 1&#xff09;环境准备 ①安装OpenAI库 pip install --upgrade openai附加 安装来源 pyth…

DDNS-GO配置使用教程

环境&#xff1a;openwrt 下载地址&#xff1a;Releases jeessy2/ddns-go GitHub 下载 ssh至openwrt根目录&#xff0c;根据你的处理器选择要下载的版本&#xff0c;我是路由器&#xff0c;选择的是 ddns-go_5.7.1_linux_arm64.tar.gz wget github链接 安装 tar -zxvf…

基于STM32的CMT液晶屏控制器驱动程序设计与优化

本文以STM32微控制器为基础&#xff0c;设计并优化了一个用于控制CMT液晶屏的驱动程序。在设计过程中&#xff0c;我们首先介绍了液晶屏的基本工作原理&#xff0c;包括CMT液晶屏的结构和信号传输机制。然后&#xff0c;我们详细讨论了STM32微控制器的GPIO、SPI和DMA模块的特性…

Windows下面基于pgsql15的备份和恢复

一、基础备份 1.创建一个文件用来存储备份数据 2.备份指令 $CurrentDate Get-Date -Format "yyyy-MM-dd" $OutputDirectory "D:\PgsqData\pg_base\$CurrentDate" $Command "./pg_basebackup -h 127.0.0.1 -U postgres -Ft -Pv -Xf -z -Z5 -D $O…

分布形态的度量_峰度系数的探讨

集中趋势和离散程度是数据分布的两个重要特征,但要全面了解数据分布的特点&#xff0c;还应掌握数据分布的形态。 描述数据分布形态的度量有偏度系数和峰度系数, 其中偏度系数描述数据的对称性,峰度系数描述与正态分布的偏离程度。 峰度系数反映分布峰的尖峭程度的重要指标. 当…

书生·浦语大模型实战营笔记(四)

Finetune模型微调 直接使用现成的大语言模型&#xff0c;在某些场景下效果不好&#xff0c;需要根据具体场景进行微调 增量预训练&#xff1a;投喂垂类领域知识 陈述形式&#xff0c;无问答&#xff0c;即只有assistant 指令跟随&#xff1a;system-user-assistant XTuner …

【Git】本地仓库管理远程库(GitHub)——clone(下载)、commit(添加到本地仓库)、push(提交到远程仓库)、pull(拉取)操作

目录 使用远程仓库的目的将本地仓库同步到git远程仓库 1.克隆远程仓库(clone)2.新建一个文件3.将工作区的文件添加到暂存区4.将暂存区的文件添加到本地仓库(commit)5.提交(同步)到远程仓库(push)6.远程库拉取到本地库(pull)7.团队协作开发和跨团队协作开发(开源项目) 使用远程…

CSS 圆形分割按钮动画 带背景、图片

<template><view class="main"><view class="up"> <!-- 主要部分上 --><button class="card1"><image class="imgA" src="../../static/A.png"></image></button><butt…

Blazor 的基本原理探索

背景 为了提升开发效率&#xff0c;关键是对js不够熟悉&#xff0c;所以要使用C#进行全栈的开发&#xff0c;使用了mudblazor和radzen blazor&#xff0c;以及可能会用到其他的blazor组件&#xff0c;所有很有必要对blazor有个比较全面的不求甚解&#xff0c;其基本原理以及bl…