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)
由于geopandas和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,{},'axis-order=long-lat'),".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
if __name__ == '__main__':
attr_name = ["Id", "Floor", "shape"]
attr_type = ["int", "int", "geometry srid 4326"]
attr_other = ["not null", "", "not null"]
table_name = "test"
db_name = "test"
path = "F:\\shapefile\\Xian\\Xian\\Xian.shp"
# 读取shapefile文件,可设置bbox选定区域
gdf = geopandas.read_file(path)
gdf=gdf[gdf.boundary.is_simple]
gdf.reset_index(drop=True,inplace=True)
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)