mirror of
https://github.com/jiawanlong/Cesium-Examples.git
synced 2025-11-02 07:44:17 +00:00
113 lines
4.2 KiB
Python
113 lines
4.2 KiB
Python
import numpy as np
|
||
from scipy.interpolate import griddata
|
||
import json
|
||
|
||
# 输入数据
|
||
data = [
|
||
{"x":117.224793, "y":31.826156, "z":146.9, "value":10},
|
||
{"x":117.225075, "y":31.826087, "z":146.7, "value":20},
|
||
{"x":117.224762, "y":31.826164, "z":126.4, "value":40},
|
||
{"x":117.22503, "y":31.826097, "z":122.1, "value":10},
|
||
{"x":117.224726, "y":31.826172, "z":76.4, "value":50},
|
||
{"x":117.225057, "y":31.826091, "z":73.7, "value":30},
|
||
{"x":117.225231, "y":31.826224, "z":139.5, "value":60},
|
||
{"x":117.225226, "y":31.826208, "z":111.9, "value":70},
|
||
{"x":117.225282, "y":31.826299, "z":52, "value":20},
|
||
{"x":117.225176, "y":31.826403, "z":147.1, "value":10},
|
||
{"x":117.22491, "y":31.826468, "z":137.1, "value":100},
|
||
{"x":117.225166, "y":31.826406, "z":120.9, "value":30},
|
||
{"x":117.224881, "y":31.826476, "z":108, "value":40},
|
||
{"x":117.225204, "y":31.826396, "z":72.2, "value":60},
|
||
{"x":117.224856, "y":31.826482, "z":67.6, "value":90}
|
||
]
|
||
|
||
# 提取坐标和值
|
||
points = np.array([(d['x'], d['y'], d['z']) for d in data])
|
||
values = np.array([d['value'] for d in data])
|
||
|
||
# 创建网格
|
||
x_min, x_max = points[:, 0].min(), points[:, 0].max()
|
||
y_min, y_max = points[:, 1].min(), points[:, 1].max()
|
||
z_min, z_max = points[:, 2].min(), points[:, 2].max()
|
||
|
||
# 生成网格点 - 增加网格密度以获得更精细的点云
|
||
grid_x, grid_y, grid_z = np.mgrid[
|
||
x_min:x_max:30j,
|
||
y_min:y_max:30j,
|
||
z_min:z_max:30j
|
||
]
|
||
|
||
# 进行三维插值
|
||
grid_values = griddata(
|
||
points,
|
||
values,
|
||
(grid_x, grid_y, grid_z),
|
||
method='linear',
|
||
fill_value=np.nan # 对于超出凸包的区域填充NaN
|
||
)
|
||
|
||
# 提取所有有效点(非NaN值)
|
||
valid_mask = ~np.isnan(grid_values)
|
||
interpolated_points = {
|
||
"x": grid_x[valid_mask].tolist(),
|
||
"y": grid_y[valid_mask].tolist(),
|
||
"z": grid_z[valid_mask].tolist(),
|
||
"values": grid_values[valid_mask].tolist()
|
||
}
|
||
|
||
# 保存插值点云到JSON文件
|
||
with open('interpolated_point_cloud.json', 'w') as f:
|
||
json.dump(interpolated_points, f, indent=2)
|
||
|
||
print("插值点云已保存到 interpolated_point_cloud.json")
|
||
|
||
# 创建可视化图形(可选)
|
||
import matplotlib.pyplot as plt
|
||
from mpl_toolkits.mplot3d import Axes3D
|
||
from matplotlib import cm
|
||
|
||
fig = plt.figure(figsize=(10, 8))
|
||
ax = fig.add_subplot(111, projection='3d')
|
||
|
||
# 绘制原始点
|
||
scatter1 = ax.scatter(points[:, 0], points[:, 1], points[:, 2],
|
||
c=values, cmap=cm.viridis, s=50, label='Original Points')
|
||
|
||
# 绘制插值点云(采样部分点以避免过于密集)
|
||
sample_mask = np.random.choice(len(interpolated_points["x"]),
|
||
min(1000, len(interpolated_points["x"])),
|
||
replace=False)
|
||
sampled_x = [interpolated_points["x"][i] for i in sample_mask]
|
||
sampled_y = [interpolated_points["y"][i] for i in sample_mask]
|
||
sampled_z = [interpolated_points["z"][i] for i in sample_mask]
|
||
sampled_values = [interpolated_points["values"][i] for i in sample_mask]
|
||
|
||
scatter2 = ax.scatter(sampled_x, sampled_y, sampled_z,
|
||
c=sampled_values, cmap=cm.viridis, s=10, alpha=0.5,
|
||
label='Interpolated Points')
|
||
|
||
ax.set_xlabel('X')
|
||
ax.set_ylabel('Y')
|
||
ax.set_zlabel('Z')
|
||
ax.set_title('Original and Interpolated Points')
|
||
ax.legend()
|
||
|
||
plt.colorbar(scatter1, ax=ax, shrink=0.5, aspect=5)
|
||
plt.savefig('point_cloud_visualization.png', dpi=300, bbox_inches='tight')
|
||
plt.show()
|
||
|
||
print("可视化结果已保存到 point_cloud_visualization.png")
|
||
|
||
# 返回JSON数据
|
||
print("\n插值点云JSON数据结构:")
|
||
print(f"点数: {len(interpolated_points['x'])}")
|
||
print(f"X范围: [{min(interpolated_points['x']):.6f}, {max(interpolated_points['x']):.6f}]")
|
||
print(f"Y范围: [{min(interpolated_points['y']):.6f}, {max(interpolated_points['y']):.6f}]")
|
||
print(f"Z范围: [{min(interpolated_points['z']):.6f}, {max(interpolated_points['z']):.6f}]")
|
||
print(f"值范围: [{min(interpolated_points['values']):.2f}, {max(interpolated_points['values']):.2f}]")
|
||
|
||
# 如果您需要直接使用这个JSON数据,可以这样访问:
|
||
# interpolated_points["x"] - 所有点的X坐标列表
|
||
# interpolated_points["y"] - 所有点的Y坐标列表
|
||
# interpolated_points["z"] - 所有点的Z坐标列表
|
||
# interpolated_points["values"] - 所有点的值列表 |