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