mirror of
				https://github.com/jiawanlong/Cesium-Examples.git
				synced 2025-11-04 01:04: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"] - 所有点的值列表 |