第一步:.shp批量轉.geojson
# author: JMY
# 創建時間: 2024/2/26 17:12
# 批量將.shp文件生成geojson文件并轉換坐標為3857import os
import geopandas as gpd# 定義輸入和輸出文件夾路徑
input_folder = 'shp文件'
output_folder = 'geojson文件'# 定義輸入和輸出坐標系
out_proj = 'EPSG:3857'# 獲取輸入文件夾下所有的 Shapefile 文件
shapefiles = [f for f in os.listdir(input_folder) if f.endswith('.shp')]# 循環處理每個 Shapefile 文件
for index, shapefile in enumerate(shapefiles):print('轉換第%d條數據...' % (index+1))# 讀取 Shapefile 文件gdf = gpd.read_file(os.path.join(input_folder, shapefile))# 對幾何數據進行坐標系轉換gdf.to_crs(out_proj, inplace=True)# 構造輸出文件名,將 '.shp' 替換為 '.geojson'output_file = os.path.splitext(shapefile)[0] + '.geojson'# 保存為 GeoJSON 文件gdf.to_file(os.path.join(output_folder, output_file), driver='GeoJSON')print('Shapefile 轉換為包含 EPSG:3857 坐標系的 GeoJSON 完成!')
第二步:.geojson批量轉.csv
# author: JMY
# 創建時間: 2024/2/23 15:16
# 批量將geojson文件生成csv文件import os
import geopandas as gpd
import json# 定義一個函數,用于從幾何信息中提取坐標
def extract_coordinates(geom):if geom:return json.dumps(geom.__geo_interface__['coordinates'])else:return None# 輸入目錄和輸出目錄路徑
input_dir = 'geojson文件' # GeoJSON 文件所在目錄路徑
output_dir = 'csv文件' # CSV 文件保存目錄路徑# 獲取輸入目錄下的所有 GeoJSON 文件名
file_names = [f for f in os.listdir(input_dir) if f.endswith('.geojson')]# 初始化ID計數器
id_counter = 0for index,file_name in enumerate(file_names):print('插入第%d條數據...' % (index+1))input_file = os.path.join(input_dir, file_name)# 讀取 GeoJSON 數據并創建 GeoDataFrame 對象data = gpd.read_file(input_file)# 在DataFrame中插入一個自增的'id'列作為第一列,并累加ID計數器data.insert(0, 'id', range(1 + id_counter, len(data) + id_counter + 1))data.insert(1, 'cun_id', -1)# 提取 'coordinates' 和 'type' 信息data['type'] = data['geometry'].apply(lambda geom: geom.geom_type if geom else None)data['coordinates'] = data['geometry'].apply(extract_coordinates)# 刪除原始的 'geometry' 列data = data.drop('geometry', axis=1)# 更新ID計數器id_counter += len(data)# 將所有字段中的空值設置為 nulldata = data.fillna(value='null')# 指定輸出文件名(與原始文件同名,只改變后綴名)output_file = os.path.splitext(os.path.basename(input_file))[0] + '.csv'output_full_path = os.path.join(output_dir, output_file)# 導出為 CSV 文件data.to_csv(output_full_path, index=False)print("輸出完成......")
第三步:.csv批量插入數據庫表
# author: JMY
# 創建時間: 2024/2/23 16:35
# 多個csv文件導入數據庫同一張表中import os
import glob
import pandas as pd
import mysql.connector# 建立與MySQL數據庫的連接
conn = mysql.connector.connect(host='', # 主機ipuser='', # 賬號password='', # 密碼database='' # 數據庫
)# CSV目錄路徑
csv_directory = 'csv文件'# 獲取目錄中的所有CSV文件
csv_files = glob.glob(os.path.join(csv_directory, '*.csv'))# 創建游標對象
cursor = conn.cursor()# 循環處理每個CSV文件
for index,csv_file in enumerate(csv_files):print('插入第%d條數據...'%(index+1))# 讀取CSV文件data = pd.read_csv(csv_file, encoding='utf-8') # 根據實際情況指定編碼# 將除了'id'和'cun_id'外的其他字段轉換為字符串類型for column in data.columns:if column not in ['id','cun_id']:data[column] = data[column].astype(str)# 構建SQL插入語句table_name = 'village_yjjbnt' # 表名columns = ', '.join(data.columns)values = ', '.join(['%s'] * len(data.columns))insert_query = f"INSERT INTO {table_name} ({columns}) VALUES ({values})"# 批量插入數據records = data.values.tolist()cursor.executemany(insert_query, records)# 提交事務
conn.commit()# 關閉游標和連接
cursor.close()
conn.close()print("數據導入mysql成功...")