CAD转SHP的一些小案例

Edit by challengeself

涉及用到包

  • pyautocad
  • shapely
  • geopandas
from pyautocad import Autocad,APoint
from shapely.geometry import Point,Polygon
import geopandas as gpd

案例1

把CAD中的接图表转换成SHP格式。
思路如下:

  1. 用pyautocad读取接图表
  2. 读取Polyline,这是图幅边界,并转换成Polygon,存入GeoDataFrame:polygonGDF
  3. 读取Text,这是图幅号,转换成点,文字存入“tufuhao”字段,存入GeoDataFrame:pointGDF
  4. 图形操作比较,如果polygon包含point,把point的属性“tufuhao”赋给polygon的“tufuhao属性”
  5. 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

提取市域区划图

思路:

  1. 利用QGIS下载天地图的全国区划图(WFS)
  2. 利用geopandas筛选市域的区县
  3. 保存文件为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')

Subscribe
提醒
guest

0 评论
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
交流思想,留下评论.x