首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >批量将本地gis数据导入postgis数据库

批量将本地gis数据导入postgis数据库

作者头像
数据小磨坊
发布于 2018-08-16 08:50:27
发布于 2018-08-16 08:50:27
2.7K00
代码可运行
举报
文章被收录于专栏:数据小魔方数据小魔方
运行总次数:0
代码可运行

以前在处理gis数据的时候,都是直接导入本地shp素材、本地geojson素材,本地topojson素材,自从接触postgis数据之后,深感使用规范的存储系统来统一管理gis数据的好处,特别是数据量大了之后,优势便更加明显,你可以选择将很多需要做空间计算的步骤转移到Postgis数据库内进行计算,要知道Postgis提供的空间计算能力与R和Python这种应用导向的工具相比,优势要大得多。

在批量导入素材之前,我们可以先看下R语言目前提供的各种导入接口在I/O性能上相比有何异同。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#install.packages("geojsonio")
#devtools::install_github("ropensci/geojsonio")
library("geojsonio")
library("rgdal")
library("sf")
library("maptools")

使用maptools包中的readShapePoly函数进行导入(已快被遗弃了,推荐使用sf和rgdal包)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
system.time(china_map <- readShapePoly("D:/R/rstudy/CHN_adm/bou2_4p.shp"))
用户 系统 流逝 
0.23 0.00 0.23 

Warning message:
use rgdal::readOGR or sf::st_read 

china_map@data
ggplot2::fortify(china_map)

geojsonio包导入:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
system.time(geojson1 <- geojson_read(
         "D:/R/rstudy/CHN_adm/bou2_4p.shp",
         method = "local",
         parse = TRUE, 
         what = "sp",
         encoding="utf-8", 
         use_iconv=TRUE
         ))

用户 系统 流逝 
0.69 0.03 0.71

使用rgdal包:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
system.time(map_data <- readOGR(
            "D:/R/rstudy/CHN_adm/bou2_4p.shp",
            encoding="utf-8", 
            use_iconv=TRUE
            ))
OGR data source with driver: ESRI Shapefile 
Source: "D:\R\rstudy\CHN_adm\bou2_4p.shp", 
layer: "bou2_4p"with 925 features
It has 7 fields
Integer64 fields read as strings:  BOU2_4M_ BOU2_4M_ID 
用户 系统 流逝 
0.66 0.09 0.75

使用sf包导入:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
system.time(nepal_shp <- read_sf(
              "D:/R/rstudy/CHN_adm/bou2_4p.shp",
              options = "ENCODING=gbk"
                 ))
用户 系统 流逝 
0.05 0.00 0.05

可以看到在同一个shp文件单项导入的情况下,纯粹从时间上来看: sf > maptools > rgdal > geojsonio

这里值得一提的是,geojsonio包是封装的rgdal服务,性能上自然略逊rgdal一筹,以上四个包中,除sf包是基于simple features标准的模型之外,其他基本都是基于sp模型的。sf模型的性能由此可见一斑。

当然,以上sf包、rgdal包和sf包都是兼容性很好地包,可以支持非常广泛的数据源,以下分别是在json标准下的两种素材上进行测试。

geojson

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
system.time(geojson <- geojson_read(
           "D:/R/mapdata/State/china.geojson",
           method = "local",
           parse = TRUE, 
           encoding="utf-8", 
           use_iconv=TRUE,
           what = "sp"
           ))
用户 系统 流逝 
0.80 0.02 0.81 

system.time(map_data <- readOGR(
            "D:/R/mapdata/State/china.geojson",
            encoding="utf-8", 
            use_iconv=TRUE,
            stringsAsFactors = FALSE
            ))
OGR data source with driver: GeoJSON 
Source: "D:\R\mapdata\State\china.geojson", layer: "china"with 34 features
It has 2 fields
用户 系统 流逝 
0.77 0.00 0.76 

system.time(nepal_shp <- read_sf(
               "D:/R/mapdata/State/china.geojson"
                 ))

用户 系统 流逝 
0.03 0.00 0.03

topojson

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
system.time(map_data <- readOGR(
            "D:/R/mapdata/china.topojson",
            use_iconv=TRUE, 
            encoding = "utf-8",
            stringsAsFactors = FALSE
            ))

OGR data source with driver: GeoJSON 
Source: "D:\R\mapdata\china.topojson", layer: "china"with 34 features
It has 2 fields
用户 系统 流逝 
0.52 0.01 0.59 

system.time(geojson <- topojson_read(
            "D:/R/mapdata/china.topojson",
             encoding="utf-8", 
             use_iconv=TRUE
            ))

OGR data source with driver: GeoJSON 
Source: "D:\R\mapdata\china.topojson", layer: "china"with 34 features
It has 2 fields
用户 系统 流逝 
0.59 0.00 0.59 

system.time(nepal_shp <- read_sf(
              "D:/R/mapdata/china.topojson"
         ))
用户 系统 流逝 
0.02 0.00 0.01

是不是看完这个性能大比拼之后大吃一惊,为sf包的超强IO能力所折服,sf包是一个非常强大的包,实现了基于simple features的所有特性,如果你了解一点儿Postgis的话,你会发现作者把大部分空间运算的函数名称设计的和Postgis中的函数一模一样,这就意味着你无论是只了解过sf包函数,或者只了解过Postgis函数,都可以低成本的迁移到两一个平台,因为同名函数往往功能一致。

如果你要想将sf包导入的数据模型转换为普通的数据框模式,仅仅只需使用其提供的as(sf,’Spatial’)函数一次转化即可,当然sf有自己的ggplot2通道函数geom_sf(),这意味着你不必多此一举。(当然对于sf不甚熟悉,习惯于使用geom_polygon来实现地理信息可视化的小伙伴儿,可以采取这种办法,但是仍然要推荐大家学习sf包,因为它代表着未来)。

R语言-gis数据批量入库:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#定义读写函数:
task <- function(filename,conn){
  #此处为写入本地gis数据(可以是任意格式,可以使用任意一种导入工具)
  map_data <- readOGR(filename,use_iconv=TRUE,encoding = "utf-8",stringsAsFactors = FALSE) 
  file_name <- sub('.json','',basename(filename))
  #此处是写入数据库的函数,可以使用sf包、rgdal包以及RPostgreSQL包提供的写出函数。
  writeOGR(obj = map_data ,dsn = conn,driver = "PostgreSQL",layer=file_name,encoding="gbk",overwrite_layer = TRUE)
 }
  #此处使用l_ply函数创建批量执行任务
Project_io <- function(path){
    setwd(path)
    input_list = list.files(path) 
    conn <- "PG:dbname='mytest' host='localhost' port='5432' user='postgres' password='708965'"
    l_ply(input_list,task,conn)
}
#启动任务
Project_io("D:/R/mapdata/Province")

Python-gis数据批量入库:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import geopandas as gpd
import pandas as pd
from sqlalchemy import create_engine
from geoalchemy2 import Geometry,WKTElement
import numpy as np
import os
import re
import json

#数据写入函数:
def write_gis(path):
    map_data = gpd.GeoDataFrame.from_file(path)
    map_data['geometry'] = map_data['geometry'].apply(lambda x: WKTElement(x.wkt,4326))
    map_data.drop(['center','parent'], axis = 1, inplace=True)
    map_data.to_sql(
    name  = re.split('\\.',path)[0],
    con   = engine,
    if_exists= 'replace',
    dtype = {'geometry':Geometry(geometry_type ='POLYGON',srid = 4326)}
    )
    return None

#创建批量任务
def to_do(file_path,username,password,dbname):
    os.chdir(file_path)
    link = "postgresql://{0}:{1}@localhost:5432/{2}".format(username,password,dbname)
    engine = create_engine(link,encoding = 'utf-8')
    file_list = os.listdir()
    map(lambda x: write_gis(x),file_list)
    return None

#执行任务计划
if __name__ == '__main__':
    file_path = 'D:/R/mapdata/Province'
    username = 'postgres'
    password = *****
    dbname = 'mytest'
    to_do(file_path,username,password,dbname)
    print('DODE')
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-08-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据小魔方 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
左手用R右手Python系列12——空间数据可视化与数据地图
以前我一直觉得Python的绘图工具与R语言ggplot2比起来,不够优雅,这也是我一直坚定的选择使用R+ggplot2深入的学习数据可视化的原因,ggplot2在坐标系的整合与兼容性和扩展性上确实技高一筹,所以ggplot2成了可视化的巨无霸,成了可视化界的微信,不仅自身生态日趋完善,而且还有众多的开发者为其开发辅助功能包(你可以理解为依附于微信的小程序)。 最近偶然在学习Python可视化的过程中,了解到了geopandas,确实第一眼看着很眼熟,或许你第一眼就能把它与pandas联系起来。的确,它跟
数据小磨坊
2018/04/11
2.3K0
左手用R右手Python系列12——空间数据可视化与数据地图
构建自己的地理信息空间数据库及与客户端简单交互
最近研究了下postgresql数据库及其空间地理信息拓展插件——postgis。
数据小磨坊
2018/07/25
6.3K0
构建自己的地理信息空间数据库及与客户端简单交互
R语言可视化——关于ggplot所支持的数据地图素材类型
做了这么多数据地图,是时候该总结一些心得和理念了,今天这篇讨论ggplot2所支持的数据地图素材格式。 library("plyr") library("dplyr") library("rgdal") library("sf") library(maptools) library("ggplot2") library("ggthemes") library("geojsonio") options(stringsAsFactors=FALSE,warn=FALSE,encoding="UTF-8") 今
数据小磨坊
2018/04/11
2.6K0
R语言可视化——关于ggplot所支持的数据地图素材类型
Python可视化笔记之folium交互地图
leftlet给R语言提供了很好用的交互式动态地图接口,其在Python中得API接口包名为folium(不知道包作者为何这样起名字,和leaflet已经扯不上关系了),可以满足我们平时常用的热力图、填充地图、路径图、散点标记等高频可视化场景。
数据小磨坊
2018/07/25
3.2K0
Python可视化笔记之folium交互地图
Python可视化与basemap数据地图系列1
最近在梳理Python中可以制作数据地图的可视化工具包,分别实践了geopandas、folium、Basemp,通过对比发现,静态地图中最为成熟的最终还得是Basemap工具,它是mpl_toolkits包中的一个专门用于构建地理信息数据可视化的扩展库。
数据小磨坊
2018/07/25
2K0
Python可视化与basemap数据地图系列1
关于数据地图的几个遗留问题解决方案
今天跟大家分享三个数据地图的遗留问题,包括以前因为技术手段限制无法解决的问题,以及读者吐槽最多的问题。 如何在一个版面上呈现不同行政级别的地理信息; 如何给版面添加mini导航定位窗口; 关于九段线问题。 关于第一个问题的解决方案,其实很简单,就是通过两个不同行政级别的图层进行叠加来达到目的。 library(maps) library("ggplot2") library("ggthemes") library("dplyr") library("maptools") library("grid")
数据小磨坊
2018/04/11
9310
关于数据地图的几个遗留问题解决方案
这是一篇很务正业的可视化推送~(上篇)
自带学习R语言以来,从来没用把这些技能用在自己的专业方向上,说好的学以致用呢~ 最近看到的一篇微信公众号推文,内容是关于山东省各县(细化到137个县级行政区)2016年的GDP规模、公共预算收入规模及其增速指标,数据质量还不错,是山东省发改委公布的。 http://mp.weixin.qq.com/s/Sk4fIh3-ykcNK8uP0gZryw 感觉自己终于离专业方向近了一些(本人学财政的),数据就在眼前,这次机会一定要抓住了。 数据虽然质量不错,但是苦于手头没有最新的山东省县级地图素材(之前练习用的SH
数据小磨坊
2018/04/11
7340
对,你没看错,真的有这种操作~
之前的ggplot2入门实践篇已经更新告一段落,也已经做了归总分类分享给大家。 最近翻看突然发现少了一个知识点,就是分面中没有讲填充多边形分面的应用,虽然其理念跟其他的常用图表类型一致。 但是鉴于多边形填充本身就比较复杂,再加上分面肯定能把大部分小伙伴儿绕晕,这里还是亲自实践一篇案例详细讲解一下实际用法。 如果你还不懂如何使用ggplot2制作数据地图的话,你可以参考以下序列文件: 地图部分(ggplot2) 你想要的地图素材资源,我都帮你整理好了~ 一篇文章教你搞定JSON素材,从此告别SHP时代~ 大道
数据小磨坊
2018/04/11
1.6K0
对,你没看错,真的有这种操作~
如何处理地图投影转换
最近学习地理信息可视化总是遇到投影的麻烦,包括前段时间输出两篇关于simple features的分享中,其中没有特别处理投影的问题,老司机一看就能看出其中存在的投影问题。
数据小磨坊
2018/08/16
1.9K0
如何处理地图投影转换
使用 ggplot2 绘制单个和多个省份地图
上一篇教程介绍了绘制完整地图的方法:R 语言绘制十段线地图,给特定省份填色,今天我们将继续探索分省市地图的绘制。
庄闪闪
2022/10/31
2.7K0
ggplot2学习笔记:加拿大地图按省界填充颜色
参考文献 1 https://gis.stackexchange.com/questions/303666/using-gsimplify-in-chloropleth 2 https://kieranhealy.org/blog/archives/2018/12/09/canada-map/ 完整代码 library(raster) library(sf) library(ggplot2) library(viridis) library(rgdal) canada_raw <- readOGR(dsn
用户7010445
2020/03/03
1.1K0
动态地理信息可视化——leaflet填充地图
这一篇是leaflet动态地图的第四篇,也是最值得推荐的一篇,这一篇涉及到热力地图填充,通过该篇内容,大家可以体会大leaflet在线地图的R借口在处理热力地图上面颜色标度映射的强大优势。 加载包: library(plyr) library(maps) library(mapdata) library(leaflet) library(stringi) library(maptools) library(htmltools) library(RColorBrewer) library(ggplot2) l
数据小磨坊
2018/04/11
5.2K0
动态地理信息可视化——leaflet填充地图
R可视化 | 地理信息空间(上)
设计目的:进行地理文件的加载、数据转换及基础处理,将地理信息数据与业务数据的融合(sp与sf数据模型),添加地理标签,应用地理坐标轴,最终完成一个地理空间可视化的小demo。
朱小五
2020/10/27
1.2K0
R可视化 | 地理信息空间(上)
大道至简——论如何最优雅的操纵json地图数据
前不久写的那个,关于如何提取json格式数据地图素材中的相关数据,来适应ggplot2场景下的数据框作图,其实那个代码写的一直都没有通用性。 导致我每做一一个需要使用json地图素材的项目,都需要从新修改那个代码,虽然每一次都能简化不少,但是依然无法适用所有的json素材。 知道最近在leaflet社区浏览案例的时候,才发现大神已经提供了很好的json数据解析方案里,起码有两个(保守估计)以上的包可以完胜这个任务,而且是直接调用现成的函数,无需自己编写方案。 瞬间感觉死磕在json上的时间都能再过一个五一小
数据小磨坊
2018/04/11
1.4K0
大道至简——论如何最优雅的操纵json地图数据
shiny动态仪表盘应用——中国世界自然文化遗产可视化案例
这一篇很早就想写了,一直拖到现在都没写完。 虽然最近的社交网络上娱乐新闻热点特别多,想用来做可视化分析的素材简直多到不可想象,但是我个人一向不追星,对明星热文和娱乐类的新闻兴趣不是很大。还是更愿意把自
数据小磨坊
2018/04/11
1.4K0
shiny动态仪表盘应用——中国世界自然文化遗产可视化案例
数据地图系列8|R语言版数据地图(下)
今天要跟大家分享的是数据地图系列的第八篇——R语言版数据地图(下),分省(市级)热力地图。 步骤与昨天分享的中国热力地图步骤基本一致,只是需要调用的数据文件和需要自定义的指标文件略有本不同。 R语言系统环境配置: R version 3.2.3 RStudio Version 0.99.484 在正式开始之前,必须确保你的R语言环境中已经安装以下包: ggplot2 plyr maptools 如果还未安装,需要先安装:install.packages("ggplot2","plyr","maptools
数据小磨坊
2018/04/10
1.7K0
数据地图系列8|R语言版数据地图(下)
R语言画地图的几篇文章记录
ggplot2添加箭头https://ggplot2.tidyverse.org/reference/geom_segment.html
用户7010445
2020/03/03
8970
利用python把shp文件写入PostgresSQL数据库
把shp文件写入pg数据库。注意:shp文件含点、线、面(‘POINT’,'LINESTRING','POLYGON')~这是重点。
一个有趣的灵魂W
2020/09/15
2.7K0
利用python把shp文件写入PostgresSQL数据库
数据地图多图层对象的颜色标度重叠问题解决方案
一篇旧文,解决一个困扰已经的小技术问题,权当是学习ggplot2以来的整理回顾与查漏补缺。 ---- 今天这一篇是昨天推送的基础上进行了进一步的深化,主要讲如何在离散颜色填充的地图上进行气泡图图层叠加。 为了使得案例前后一致,仍然使用昨天的数据集。 加载包: library("ggplot2") library("plyr") library("maptools") library("sp") library("ggthemes") 导入中国省界地图: china_map<-readShapePoly("
数据小磨坊
2018/04/11
1.9K0
数据地图多图层对象的颜色标度重叠问题解决方案
空间数据可视化笔记——simple features空间对象基础
是不是感觉被封面图和不明觉厉的题目给骗进来了哈哈哈,今天这篇是理论篇,没有多少案例,而且还很长,所以静不下心的小伙伴儿可以先收藏着,时间充裕了再看。 ---- 当今互联网和大数据发展的如此迅猛,大量的运营与业务数据需要通过可视化呈现来给商业分析人员提供有价值的决策信息,而地理信息与空间数据可视化则是可视化分析中至关重要而且门槛较高的一类。 通常除了少数本身具备强大前端开发能力的大厂之外,很多中小型企业在内部预算资源有限的情况下,并不具备自建BI和完整可视化框架的能力。需要借助第三方提供的开源可视化平台或者
数据小磨坊
2018/04/11
1.7K0
空间数据可视化笔记——simple features空间对象基础
推荐阅读
相关推荐
左手用R右手Python系列12——空间数据可视化与数据地图
更多 >
交个朋友
加入[数据] 腾讯云技术交流站
获取数据实战干货 共享技术经验心得
加入数据技术工作实战群
获取实战干货 交流技术经验
加入[数据库] 腾讯云官方技术交流站
数据库问题秒解答 分享实践经验
换一批
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档