geopandas读取shapefile并导入mysql

import pymysql
import geopandas



def create_insert_value(gdf,attr_name,geometry_column_name):
    value=[]
    for i in range(len(gdf)):
        list=[]
        for j in range(len(attr_name)):
            if attr_name[j]==geometry_column_name:
                list.append(str(gdf[attr_name[j]][i].wkt))
            else:
                list.append(str(gdf[attr_name[j]][i]))
        value.append(tuple(list))
    return value

def insert_table(table_name,attr_name,geometry_column_name,srid):
    string1=[]
    string2=[]
    for i in range(len(attr_name)):
        string1+=attr_name[i]+","
        if attr_name[i]==geometry_column_name:
            string2+="ST_GeomFromText(%s,{}),".format(srid)
        else:
            string2+="%s,"
    string1[-1]=""
    string2[-1]=""
    s1="".join(string1)
    s2="".join(string2)
    insert_sql="insert into {}({}) values({});".format(table_name,s1,s2)
    return insert_sql

def create_table(attr_name,attr_type,attr_other,table_name):
    string=[]
    for i in range(len(attr_name)):
        string+=attr_name[i]+" "+attr_type[i]+" "+attr_other[i]+",\n"
    string[-2]=""
    s="".join(string)
    create_table_sql="create table if not exists {}(\n{});".format(table_name,s)
    return create_table_sql

def gdf2mysql(host,user,passwd,port,gdf,attr_name,attr_type,attr_other,table_name,db_name,srid,geometry_column_name):
    create_table_sql=create_table(attr_name,attr_type,attr_other,table_name)
    insert_table_sql=insert_table(table_name,attr_name,geometry_column_name,srid)
    values=create_insert_value(gdf,attr_name,geometry_column_name)

    con = pymysql.connect(host=host, user=user,passwd=passwd,port=port,charset='UTF8')
    cur = con.cursor()

    cur.execute("drop database if exists {};".format(db_name))
    cur.execute("create database if not exists {};".format(db_name))
    cur.execute("use {};".format(db_name))
    #cur.execute("drop table if exists {};".format(table_name))
    cur.execute(create_table_sql)
    cur.executemany(insert_table_sql,values)

    con.commit()
    cur.close()
    con.close()




def set_default_value(gdf,value,attr):
    gdf.loc[gdf[attr]<=0,attr]=value
    return gdf

if __name__ == '__main__':
    attr_name = ["osm_id", "height", "shape"]
    attr_type = ["int", "float", "geometry srid 4326"]
    attr_other = ["not null", "", "not null"]
    table_name = "geo_table"
    db_name = "geo_db"

    path = "F:\\shapefile\\Detroit\\Detroit_height.shp"
    # 读取shapefile文件,可设置bbox选定区域
    gdf = geopandas.read_file(path)

    gdf=set_default_value(gdf,10,"height")

    gdf.rename(columns={"geometry": "shape"}, inplace=True)

    gdf2mysql(host="localhost", user="root", passwd="root", port=3306,
              gdf=gdf, attr_name=attr_name, attr_type=attr_type, attr_other=attr_other,
              table_name=table_name, db_name=db_name, geometry_column_name="shape", srid=4326)

你可能感兴趣的:(python)