68 lines
2.6 KiB
Python
68 lines
2.6 KiB
Python
from scipy import interpolate
|
|
import dem
|
|
import ezdxf
|
|
from data_types import WGS84Point
|
|
import transformer
|
|
import numpy as np
|
|
|
|
|
|
def generate_wgs_84_point(point_start: WGS84Point, point_end: WGS84Point, n_point):
|
|
_transformer_84_yx = transformer.Projector("epsg:4326", "epsg:4507")
|
|
start_y, start_x = _transformer_84_yx.transform(
|
|
point_start.latitude, point_start.longitude
|
|
)
|
|
end_y, end_x = _transformer_84_yx.transform(point_end.latitude, point_end.longitude)
|
|
# 插入点
|
|
x_linspace = np.linspace(start_x, end_x, n_point)
|
|
y_linspace = np.linspace(start_y, end_y, n_point)
|
|
elevation_linspace = np.linspace(
|
|
point_start.elevation, point_end.elevation, n_point
|
|
)
|
|
yxz_point = np.array([y_linspace, x_linspace, elevation_linspace]).transpose()
|
|
_transformer_yx_84 = transformer.Projector("epsg:4507", "epsg:4326")
|
|
wgs_84_point = np.array(
|
|
[np.array(_transformer_yx_84.transform(y, x)) for y, x, _elevation in yxz_point]
|
|
)
|
|
return wgs_84_point
|
|
|
|
|
|
def draw_dxf(elevation_in_line, interval, dxf_path):
|
|
doc = ezdxf.new(dxfversion="R2004")
|
|
msp = doc.modelspace()
|
|
x_axis = (
|
|
np.linspace(0, len(elevation_in_line) * interval, len(elevation_in_line)) / 5
|
|
)
|
|
points = np.array([x_axis, (elevation_in_line - elevation_in_line[0]) * 2])
|
|
new_x_axis = (
|
|
np.linspace(
|
|
0, len(elevation_in_line) * interval, int(len(elevation_in_line) / 12.5)
|
|
)
|
|
/ 5
|
|
) # 平滑用
|
|
func = interpolate.interp1d(points[0, :], points[1, :], kind="cubic")
|
|
msp.add_polyline2d([(x + 10, func(x)) for x in new_x_axis])
|
|
msp.add_polyline2d([(x + 10, y) for x, y in points.transpose()])
|
|
doc.saveas(dxf_path)
|
|
|
|
|
|
# 计算档距
|
|
def cal_span(start: WGS84Point, end: WGS84Point):
|
|
_transformer_84_yx = transformer.Projector("epsg:4326", "epsg:4507")
|
|
start_point = np.array(
|
|
_transformer_84_yx.transform(start.latitude, start.longitude)
|
|
)
|
|
end_point = np.array(_transformer_84_yx.transform(end.latitude, end.longitude))
|
|
return np.round(np.sum((start_point - end_point) ** 2) ** 0.5)
|
|
|
|
|
|
def main():
|
|
dem_gcs = dem.Dem(r"d:\宁夏自治区.tif")
|
|
dem_gcs.get_dem_info(if_print=False)
|
|
start_point = WGS84Point(36.74138039, 105.58954375, 1670)
|
|
end_point = WGS84Point(36.72869989, 105.61023855, 1718)
|
|
span = int(cal_span(start_point, end_point))
|
|
print("档距 {span}".format(span=span))
|
|
wgs_84_point_in_line = generate_wgs_84_point(start_point, end_point, span)
|
|
elevation_in_line = dem_gcs.get_elevation(wgs_84_point_in_line)
|
|
draw_dxf(elevation_in_line, 1, "a.dxf")
|