[url=]Part1背景官方发布了1:100万公众版基础地理信息数据集,但这个数据是分幅的,还需要做一下合并。
Part2处理流程主要是使用python进行数据的预处理与合并。
Part3gdb转shp矢量使用QGIS的OSGeo4W Shell软件,可以将gdb数据库导出为shp矢量。
ogr2ogr -f "ESRI Shapefile" F:\keshan\shp_get\I51 F:\keshan\shp100w\I51.gdb -lco ENCODING=UTF-8,
格式为:ogr2ogr -f +格式名称+保存路径+原始文件路径+编码方式
import os
from tqdm import tqdm
Path = 'F:\keshan\shp100w/'
folder_names = os.listdir(Path)
#脚本:参考ogr2ogr -f "ESRI Shapefile" F:\keshan\shp_get\2 F:\keshan\shp100w\A49.gdb -lco ENCODING=UTF-8
bat_part1="ogr2ogr -f \"ESRI Shapefile\" F:\keshan\shp_get\\"
bat_part2=" F:\keshan\shp100w\\"
bat_part3=" -lco ENCODING=UTF-8"
# 循环目录
for folder_name in tqdm(folder_names):
bat_text=bat_part1+folder_name.replace(".gdb","")+bat_part2+folder_name+bat_part3
print(bat_text)
通过上述脚本,批量生成导出shp的.bat内容。把这个内容打包成为.bat文件,输入start+.bat路径,运行文件

运行结果如下:

打开每一个文件,是分幅的矢量:
Part4shp矢量合并使用脚本,遍历文件夹,将所有相同名称的矢量文件移动到相同文件内:
import os
import shutil
from tqdm import tqdm
#创建各地文件夹函数
def mkdir(path):
# 引入模块
# 去除首位空格
path = path.strip()
# 去除尾部 \ 符号
path = path.rstrip("\\")
# 判断路径是否存在
# 存在 True
# 不存在 False
isExists = os.path.exists(path)
# 判断结果
if not isExists:
# 如果不存在则创建目录
# 创建目录操作函数
os.makedirs(path)
print(path + ' 创建成功')
return True
else:
# 如果目录存在则不创建,并提示目录已存在
print(path + ' 目录已存在')
return False
Path = 'F:\keshan\shp_get/'
#保存的分类shp文件位置
Save_Fenlei= 'F:\keshan\shp_100w_fenlei/'
folder_names = os.listdir(Path)
# 循环目录
for folder_name in tqdm(folder_names):
floder_PATH = os.path.join(Path, folder_name)
file_names = os.listdir(floder_PATH)
for file_names in file_names:
#获取文件路径与名称
file_path =os.path.join(floder_PATH, file_names)
file_name=file_names.split(".")[0]
file_suffix = file_names.split(".")[1]
#移动文件到指定目录 将名称为file的文件复制到名为file_dir的文件夹中
dir_path = Save_Fenlei +file_name
# 创建文件夹 保存单个文件的文件夹
mkdir(dir_path)
#修改文件名
file_new_name = file_name.split(".")[0]+"_"+folder_name+"."+file_suffix
dst_name=os.path.join(dir_path, file_new_name)
# 将指定的文件file移动到file_dir的文件夹里面
shutil.copy(file_path, dst_name)
到此,我们获得了每个类别的shp矢量,加载到gis软件中进行查看。

现在要进行矢量的合并,首先我想到了arcgis和qgis手动操作。但是我比较懒,不喜欢重复操作,所以我写了一个脚本对每一个类别进行合并:
import os
import geopandas as gpd
import pandas as pd
from tqdm import tqdm
#分类得到的shp
Path = 'F:\keshan\shp_100w_fenlei/'
# 保存的合并文件位置
Save_shp = r'F:\keshan\100Wmerge\shp/'
Save_geojson = r'F:\keshan\100Wmerge\geojson/'
folder_names = os.listdir(Path)
# 循环目录
for folder_name in tqdm(folder_names):
try:
folder_name_path=os.path.join(Path, folder_name)
file = os.listdir(folder_name_path)
#遍历shp文件进行合并
path = [os.path.join(folder_name_path, i) for i in file if ".shp" in i]
gdf = gpd.GeoDataFrame(pd.concat([gpd.read_file(i) for i in path],
ignore_index=True), crs=gpd.read_file(path[0]).crs)
#导出shp
gdf_path_name_shp =Save_shp+folder_name+".shp"
gdf.to_file(gdf_path_name_shp, driver="ESRI Shapefile", encoding="utf-8")
#导出geojson
gdf_path_name_json =Save_geojson+folder_name+".gson"
gdf.to_file(gdf_path_name_json, driver='GeoJSON', encoding="utf-8")
except:
pass
通过这个步骤,ANNP这个全国矢量就merge好了,放到gis软件中查看:

由此,我们得到了shp和geojson两种格式的1:100w的全国地理基础信息数据:

这里为什么会单独再导出一个geojson的文件,是因为我自己的偏见:gson比shp好用,qgis比arcgis好使。
Part5其他至此,数据已经转化完毕,可以直接使用。该数据的类型如下:


数据很丰富,可以看看:

我在遥感论坛上看到有一个人发帖,大家可以去下载这个合并版的数据:

注意:提供下载的是矢量数据,不是最终地图,与符号化后的地图再可视化表达上存在一定差异。用户利用此数据编制地图,应当严格执行《地图管理条例》有关规定;编制的地图如需向社会公开的,还应当依法履行地图审核程序。Part6参考
全国地理信息资源目录服务系统.https://www.webmap.cn/main.do?method=index
Geodata地理数据研究所.2021版全国1:100万公众版基础地理信息数据
[/url]