Edit by challengeself
涉及用到包
- pyautocad
- shapely
- geopandas
from pyautocad import Autocad,APoint from shapely.geometry import Point,Polygon import geopandas as gpd
案例1
把CAD中的接图表转换成SHP格式。
思路如下:
- 用pyautocad读取接图表
- 读取Polyline,这是图幅边界,并转换成Polygon,存入GeoDataFrame:polygonGDF
- 读取Text,这是图幅号,转换成点,文字存入“tufuhao”字段,存入GeoDataFrame:pointGDF
- 图形操作比较,如果polygon包含point,把point的属性“tufuhao”赋给polygon的“tufuhao属性”
- polygonGDF输出为shp文件
代码如下:
from pyautocad import Autocad,APoint
from shapely.geometry import Point,Polygon
import geopandas as gpd
acad = Autocad(create_if_not_exists=True)
print(acad.doc.name)
polygonGDF = gpd.GeoDataFrame()
pointGDF = gpd.GeoDataFrame()
polyObjs = []
pointOjbs = []
for obj in acad.iter_objects("Polyline"):
points =[]
polyObjs.append(obj)
# print(obj.ObjectName)
# print(obj.Coordinates)
# print(len(obj.Coordinates))
count = int(len(obj.Coordinates)/2)
# print(type(count))
for i in range(count):
# print(obj.Coordinate(i))
points.append(obj.Coordinate(i))
# print(points)
poly = Polygon(points)
# print(type(poly))
# print(polygonGDF.size)
polygonGDF.loc[polygonGDF.size,'geometry']=poly
print("objs len is %i"%len(polyObjs))
print("polygonGDF size is %i"%polygonGDF.size)
print(polygonGDF)
for obj in acad.iter_objects("Text"):
# print(obj.ObjectName)
# print(obj.TextString)
# print(obj.InsertionPoint)
pointCoordinate = (obj.InsertionPoint[0],obj.InsertionPoint[1])
textPoint = Point(pointCoordinate)
tufuhao = obj.TextString
# print("textPoint type is %s"%type(textPoint))
# print("tufuhao type is %s"%type(tufuhao))
pointOjbs.append(textPoint)
# print("pointGDF SIZE IS :%i"%pointGDF.size)
# pointGDF.loc[pointGDF.size, 'geometry'] = textPoint
pointGDF.loc[pointGDF.size, 'tufuhao'] = tufuhao
# print("pointGDF type is %s"%type(pointGDF))
pointGeoSeries = gpd.GeoSeries(pointOjbs)
pointGDF['geometry']=pointGeoSeries
print(pointGeoSeries)
print("text count is %i"%len(pointOjbs))
print("pointGDF size is %i"%pointGDF.size)
print(pointGDF)
for i in range(polygonGDF.size):
for j in range(pointGDF.size):
if (polygonGDF.loc[i,'geometry'].contains(pointGDF.loc[j,'geometry'])):
polygonGDF.loc[i,'tufuhao']=pointGDF.loc[j,'tufuhao']
pointGDF.drop([j])
break
print(polygonGDF)
outFile = r"DATA\outFile\outfile.shp"
polygonGDF.to_file(outFile)
print("任务完成")
案例2
提取市域区划图
思路:
- 利用QGIS下载天地图的全国区划图(WFS)
- 利用geopandas筛选市域的区县
- 保存文件为shp文件
代码如下:
import geopandas as gpd infile = r'DATA/HENGSHUIDAGAI/HENGSHUIDAGAI.shp' data = gpd.read_file(infile) print(data.loc[0,:]) newdata = data[(data['PAC']>131100)&(data['PAC']<131199)] print(newdata) outfile=r'DATA/hengshuiquhua/hengshuiquhua.shp' newdata.to_file(outfile,encoding='utf-8')
