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

这篇具有很好参考价值的文章主要介绍了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文件与数据库(创建shp文件),数据库

查看数据

查看生成shp文件中的数据

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

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

查看一下属性表

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

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

根据数据库创建shp文件

简单地读取表的数据

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

select * from table

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

from sqlalchemy import create_engine,Table,select,MetaData
import geopandas as gpd

engine = 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')

代码几行,结果如下。

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

可以看到除了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 NoSuchTableError

engine = 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_name
        self.shp_path = shp_path
        self.has_id = has_id
        self.geom_type = geom_type
        self.__table: Table = None
        self.__columns: ReadOnlyColumnCollection = None
        self.__sql: str = None

    def __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文件),数据库

打开属性表

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

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

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')

结果如下。

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

完成。文章来源地址https://www.toymoban.com/news/detail-789071.html

到了这里,关于shp文件与数据库(创建shp文件)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • neo4j创建数据库及导入csv文件内容详解

    neo4j展示知识图谱主要需要两类数据:节点数据和关系数据。本节主要讲解数据的输入格式。(示例数据较简单,可对照自己的数据进行调整) 1.节点文件 创建excel表格,以演员、电影数据为例: 第一列为属性名,可表示为属性名_Id,上图的属性名为actor或movie, 注意取值不

    2024年02月05日
    浏览(35)
  • 日志审计系统Agent项目创建——初始化数据库和日志文件(Linux版本)

    完结,下一篇主要是读取日志文件,并读取最新日志文件

    2024年01月16日
    浏览(52)
  • ELK(Elasticsearch、Kibana、Logstash)以及向ES导入mysql数据库数据或CSV文件数据,创建索引和可视化数据

    地址:Past Releases of Elastic Stack Software | Elastic 在Products和version处分别选择需要下载的产品和版本,E(elasticsearch)L(logstash)K(kibana)三者版本必须相同 将下载好的elk分别解压到相同路径下 本文中elasticsearch=E=ES=es;L=logstash;K=kibana 一般情况下使用默认配置即可,下面对我的

    2024年02月15日
    浏览(32)
  • 使用Ruoyi的方法(数据库的创建、YML文件的修改、前端的导入和启动、云服务器简介、NGINX配置部署前端)

    本文章转载于公众号:王清江唷,仅用于学习和讨论,如有侵权请联系 QQ交流群:298405437 本人QQ:4206359 当我们下载好了Ruoyi-Vue之后,我们得到一个文件夹,如下: 内部又有若干文件,如下: 这里面不仅包括了后端程序(基于SpringBoot的Java程序),也包括前端程序(基于Vue的程

    2024年02月03日
    浏览(54)
  • Android studio 连接SQLite数据库 +创建数据库+创建数据库表

    Android studio 之数据库的使用 连接创建SQLite 大家好,欢迎来到寒依。 相信看啦我的教程 当老师问你在学习Android studio 数据库使用过程中遇到什么困难,分享一下你的感悟和解决方法 的时候,你可以直接大胆的说出来: “老师我没有遇到问题,看啦寒依的教程 畅行无阻” 我

    2024年02月02日
    浏览(45)
  • SQL Server数据库——创建数据库

    目录 一、界面方式创建数据库 1.1创建数据库xscj,数据文件和日志文件的属性按默认值设置  1.2在xscj数据库中增加文件xcsj1,其属性均取系统默认值  1.3在数据库xscj中增加一个名为myGroup的文件组。 1.4数据库的重命名  1.5数据库的删除  二、命令方式创建数据库 以创建学生管

    2024年02月01日
    浏览(52)
  • Android Studio 使用SQLite数据库来创建数据库+创建数据库表+更新表再次往表添加字段

    目录 一.前言 二.SQLite数据库介绍 1.什么是SQLite数据库 2.特点 3.SQLite 操作API 4.SQLite数据类型 三.SQlite数据库的使用 1.创建类继承SQLiteOPenHelper 2.创建数据库 3.创建数据库表 4.更新表添加字段 完整代码 扩展 总结 我们在使用Android进行开发的时候不可避免的要使用到数据,那么就需

    2024年02月08日
    浏览(43)
  • SQL数据库案例1——创建商店数据库

    创建商店数据库Commodities_Management 创建商品表、供应商表、进货表、销售表 各表分别输入数据 库名:Commodities_Management 字符集:utf16 表一:商品表 字段名 类型 长度 约束 商品编号 varchar 10 外键(参照进货表) 商品名 varchar 30 — 规格 varchar 20 — 供应商编号 varchar 10 非空 表二:

    2024年02月12日
    浏览(34)
  • 数据库实验 实验一 数据库创建与管理

    注:此内容仅仅只是记录成长与分享学习,不能保证绝对正确 实验一 数据库的创建与管理 实验日期:   2022   年 3 月   25 日  星期   五     实验地点:   宿舍      一 实验目的 1. 熟练掌握创建、删除数据库。 2. 查看和修改数据库属性。 二 实验要求 1. 请大家务必动

    2024年02月01日
    浏览(49)
  • 数据库实验报告一-创建数据库和表

    一 ,实验目的 1、了解SQL Server数据库的操作环境; 2、了解SQL Server的基本数据类型、表的结构和空值的概念; 3、掌握在企业管理器中创建数据库和表; 4、熟练掌握使用T-SQL语句创建数据库和表; 5、熟悉主码、外码、Check约束和索引的建立和删除操作 二,实验原理 建立表,

    2023年04月13日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包