python脚本导出cad多线段坐标,以及转为经纬度

也是在项目中需要用到地块,甲方只给了cad,只能自己去转了,咱也不会用cad,刚好会的python,刚好cad也支持,那就做。以下是代码,这个是lisp代码,这个才可以用在cad里面,我用的是cad2024,需要先将这个文件保存为.lsp文件,然后导入这个脚本,这个是操作的方法

CAD脚本怎么运行加载? - 周站长CAD

(defun c:GetPolylinePointsCSVWithMTextFilename2 ()
  (setq ss (ssget "_:S" '((0 . "MTEXT"))))
  (if ss
    (progn
      (setq mtextEnt (ssname ss 0))
      (setq mtextContent (cdr (assoc 1 (entget mtextEnt))))

      ; 过滤掉右斜杠
      (setq mtextContent (vl-string-subst "" "\" mtextContent)) ; 将"/"替换为"_",可以根据需要调整
      (setq mtextContent (vl-string-subst "" "||" mtextContent)) ; 
      (setq mtextContent (vl-string-subst "" "\\" mtextContent)) ; 
      (setq mtextContent (vl-string-subst "" "|" mtextContent)) ; 

      ; 设置输出CSV文件的路径和文件名
      (setq csvpath ("1_polyline_points.csv"))

      ; 提示用户选择一个多项段
      (setq ss (ssget "_:S" '((0 . "LWPOLYLINE"))))
      (if ss
        (progn
          ; 如果用户成功选择了一个多项段
          (setq pline (ssname ss 0))
          ; 打开或创建一个CSV文件来保存坐标
          (setq f (open csvpath "w"))
          (if f
            (progn
              ; 初始化顶点索引
              (setq vtx 0)
              ; 循环遍历多项段的所有顶点
              (while (setq pt (vlax-curve-getPointAtParam pline vtx))
                ; 将每个顶点的坐标写入文件,格式为CSV
                (write-line (strcat (rtos (car pt) 2 2) ", " (rtos (cadr pt) 2 2)) f)
                ; 移至下一个顶点
                (setq vtx (+ vtx 1))
              )
              ; 关闭文件
              (close f)
              (princ (strcat "\n顶点坐标已成功保存至" csvpath "。"))
            )
            (princ (strcat "\n无法打开文件: " csvpath))
          )
        )
        (princ "\n操作取消或未选择多项段。")
      )
    )
    (princ "\n操作取消或未选择多行文字实体。")
  )
  (princ)  
)

然后是.csv文件转为经纬度

import json
from pyproj import Transformer
import os
import glob
from tqdm import tqdm
import math

# 定义北京1954坐标系到WGS84坐标系的转换器
transformer = Transformer.from_crs("epsg:2412", "epsg:4326") #你要转换的坐标系,我是用的百度的瓦片图,所以转的百度瓦片图的坐标系

# 指定输入文件所在的目录
input_directory = "E:\\map_change\\new_csvfile"  # 将这里替换为实际的目录路径
output_directory = "E:\\map_change\\out_csvnew"
output_txt_directory = "E:\\map_change\\out_csvnew\\map_txt_new"

# 确保输出目录存在
os.makedirs(output_directory, exist_ok=True)
os.makedirs(output_txt_directory, exist_ok=True)

# 获取该目录下所有符合条件的文件
file_pattern = os.path.join(input_directory, '*_polyline_points.csv')
input_files = glob.glob(file_pattern)

# 遍历文件并添加进度条
for input_file_path in tqdm(input_files, desc="处理文件进度"):
    # 从文件名中提取关键信息
    filename = os.path.basename(input_file_path)
    parts = filename.split('_')
    if len(parts) > 1:
        key_info = parts[0].split(';')[-1].strip('{}')
    else:
        raise ValueError(f"文件名格式不符合预期: {filename}")

    # 构建输出文件路径
    output_file_path = os.path.join(output_directory, f'{key_info}.csv')
    # 构建用于存储中心点和坐标点的txt文件路径
    txt_output_file_path = os.path.join(output_txt_directory, f'{key_info}.txt')
    # 用于存储转换后的坐标
    coordinates = []

    # 读取坐标数据文件
    with open(input_file_path, 'r') as input_file:
        lines = input_file.readlines()

    # 转换坐标并输出到新文件
    with open(output_file_path, 'w') as output_file:
        # 写入新文件的标题行
        output_file.write("lon,lat\n")
        for line in lines:
            # 去除每行数据中的空格和不可见字符
            line = line.strip()
            # 拆分坐标值
            values = line.split(',')

            lat, lon = map(float, values[:2])  # 调整为lat在前,lon在后

            # 转换为经纬度
            lon, lat = transformer.transform(lon, lat)  # 注意调整后的顺序
            # 写入到新文件
            output_file.write(f"{lon},{lat}\n")
            # 将转换后的坐标添加到列表中
            coordinates.append((lon, lat))

    # 计算中心点坐标
    if coordinates:
        lon_sum = 0
        lat_sum = 0
        valid_points = 0
        for lon, lat in coordinates:
            # 检查是否为无穷大或NaN值
            if not (math.isinf(lon) or math.isinf(lat) or math.isnan(lon) or math.isnan(lat)):
                lon_sum += lon
                lat_sum += lat
                valid_points += 1
        if valid_points > 0:
            center_lon = lon_sum / valid_points
            center_lat = lat_sum / valid_points
        else:
            print(f"文件 {input_file_path} 中包含无效坐标点,无法计算中心点坐标。")
            center_lon = None
            center_lat = None

        # 将中心点和坐标点按照指定格式写入txt文件(使用JSON格式)
        with open(txt_output_file_path, 'w') as txt_output_file:
            data = {
                "center": {"lat":  center_lon if center_lon is not None else math.nan, "lng": center_lat if center_lat is not None else math.nan},
                "points": [{"lat":  lon, "lng": lat} for lon, lat in coordinates]
            }
            # 使用json.dumps来格式化数据为JSON字符串,并确保缩进以便可读性
            json_data = json.dumps(data, indent=4)
            txt_output_file.write(json_data)

我这边发现转出大小和位置出现了问题,与瓦片图尺寸,位置不符,做了个大小转化和位置的代码

这个是偏移函数

import json
import os


# 偏移量函数
def apply_offset(point, lat_offset, lng_offset):
    return {
        "lat": point["lat"] + lat_offset,
        "lng": point["lng"] + lng_offset
    }


# 假设的偏移量
lat_offset = 0.002999  # 纬度偏移量
lng_offset = 0.004099  # 经度偏移量

# 输入和输出目录
input_dir = 'E:\\map_change\\out_csvnew\\map_txt_new\\香炉山1'
output_dir = 'E:\\map_change\\outcsv\\map_txt_change'

# 确保输出目录存在
if not os.path.exists(output_dir):
    os.makedirs(output_dir)

# 获取文件夹内所有.txt文件
txt_files = [f for f in os.listdir(input_dir) if f.endswith('.txt')]

for filename in txt_files:
    # 构建完整的文件路径
    input_file_path = os.path.join(input_dir, filename)

    # 读取文件内容
    with open(input_file_path, 'r') as f:
        data = json.load(f)

    # 应用偏移量到中心点和所有点
    data["center"] = apply_offset(data["center"], lat_offset, lng_offset)
    data["points"] = [apply_offset(point, lat_offset, lng_offset) for point in data["points"]]

    # 构建新的文件名和输出路径
    new_filename = filename.replace('.txt', '.txt')
    output_file_path = os.path.join(output_dir, new_filename)

    # 将调整后的数据写入文件
    with open(output_file_path, 'w') as f:
        json.dump(data, f, indent=4)

    print(f'Adjusted coordinates have been saved to {output_file_path}')



这个是大小转换和位置偏移的代码

from shapely.geometry import Point, Polygon
import json
import os
import math

# 偏移量函数
def apply_offset(point, center_point, scale_factor):
    dx = point["lng"] - center_point["lng"]
    dy = point["lat"] - center_point["lat"]
    distance = math.sqrt(dx**2 + dy**2)
    new_distance = distance * scale_factor
    new_dx = (dx/distance) * new_distance
    new_dy = (dy/distance) * new_distance
    return {
        "lat": center_point["lat"] + new_dy,
        "lng": center_point["lng"] + new_dx
    }

# def expand_polygon(data, center_point, scale_factor):
#     points = [Point(coord["lng"], coord["lat"]) for coord in data["points"]]
#     new_points = [Point(apply_offset({"lat": p.y, "lng": p.x}, center_point, scale_factor)) for p in points]
#     return {
#         "center": center_point,
#         "points": [{"lat": p.y, "lng": p.x} for p in new_points]
#     }
def expand_polygon(data, center_point, scale_factor):
    points = [Point(coord["lng"], coord["lat"]) for coord in data["points"]]
    new_points = []
    for p in points:
        offset_point = apply_offset({"lat": p.y, "lng": p.x}, center_point, scale_factor)
        new_points.append(Point(offset_point["lng"], offset_point["lat"]))
    return {
        "center": center_point,
        "points": [{"lat": p.y, "lng": p.x} for p in new_points]
    }

# 输入和输出目录
input_dir = 'E:\\map_change\\out_csvnew\\map_txt_new'
output_dir = 'E:\\map_change\\out_csvnew\\map_txt_new_adjusted'

# 确保输出目录存在
if not os.path.exists(output_dir):
    os.makedirs(output_dir)

# 获取文件夹内所有.txt文件
txt_files = [f for f in os.listdir(input_dir) if f.endswith('.txt')]

# 假设的中心点
center_point = {"lat": 30.123, "lng": 106.456}
scale_factor = 1.8  # 调整比例因子

for filename in txt_files:
    # 构建完整的文件路径
    input_file_path = os.path.join(input_dir, filename)

    # 读取文件内容
    with open(input_file_path, 'r') as f:
        data = json.load(f)

    # 扩大多边形
    expanded_data = expand_polygon(data, center_point, scale_factor)

    # 构建新的文件名和输出路径
    new_filename = filename.replace('.txt', '.txt')
    output_file_path = os.path.join(output_dir, new_filename)

    # 将调整后的数据写入文件
    with open(output_file_path, 'w') as f:
        json.dump(expanded_data, f, indent=4)

    print(f'Adjusted coordinates have been saved to {output_file_path}')

最后就好了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值