本案例将一块区域的经纬度信息先3D显示,然后转化为100*100的二维栅格化横纵坐标
转换步骤
-
确定区域的经纬度边界:需要知道要转换的区域的最小和最大经度,以及最小和最大纬度。这四个值定义了一个矩形区域。
-
计算经纬度与栅格坐标的映射比例:计算经度和纬度每个单位对应的栅格数量。这可以通过以下方式计算:
经度栅格比例=100/(最大经度−最小经度经度)
纬度栅格比例=100/(最大纬度−最小纬度纬度)
-
将经纬度转换为栅格坐标:对于给定的经纬度点,可以通过以下方式转换为栅格坐标:
栅格X=(经度−最小经度)×经度栅格比例
栅格Y=(纬度−最小纬度)×纬度栅格比例
-
处理边界情况:确保转换后的栅格坐标不会超出 0-99 的范围(因为是 100x100 栅格)。
注意事项
- 这种方法在较小区域(几平方公里)内效果较好,但在更大区域或需要高精度的情况下可能不够精确。
- 由于地球是一个椭球体,纬度单位和经度单位在不同纬度上的实际距离是不同的。在较高纬度上,一个经度单位代表的实际距离会小于低纬度。
- 如果需要更高精度的转换,可能需要使用专门的地理信息系统(GIS)软件和适当的地图投影。
代码设计过程:
本案例通过导入一个经纬度信息文件,然后先实现将经纬度坐标3D显示出来,然后通过点击一个可视化的按钮来转换为横纵坐标形式,我们需要使用 matplotlib
的3D绘图功能来显示3D散点图,同时添加一个按钮控件来处理坐标转换和重新绘图的逻辑,当点击“转换”按钮时,会触发 on_click
函数,该函数根据经纬度计算出的栅格化坐标在2D子图上重新绘制散点图。
初始准备,导入数据及创建3D图
# 读取数据
file_path = 'F:/test_data/sample_longitude_latitude_100.csv'
df = pd.read_csv(file_path)
# 创建图形和3D子图
fig = plt.figure(figsize=(10, 10))
ax_3d = fig.add_subplot(121, projection='3d')
ax_2d = fig.add_subplot(122)
# 绘制3D散点图
ax_3d.scatter(df['longitude'], df['latitude'], alpha=0.5)
ax_3d.set_title('3D 经纬度可视化')
ax_3d.set_xlabel('经度')
ax_3d.set_ylabel('纬度')
# 添加转换按钮
ax_button = plt.axes([0.4, 0.05, 0.1, 0.075])
btn = Button(ax_button, '转换')
按钮事件定义
def on_click(event):
"""
转换函数
"""
# 应用转换
df['grid_x'], df['grid_y'] = zip(*df.apply(lambda row: convert_to_grid(row['longitude'], row['latitude']), axis=1))
# 在2D子图上绘制散点图
ax_2d.clear()
ax_2d.scatter(df['grid_x'], df['grid_y'], alpha=0.5)
ax_2d.set_title('转换后的栅格化坐标')
ax_2d.set_xlabel('X坐标')
ax_2d.set_ylabel('Y坐标')
ax_2d.set_xlim(0, 100)
ax_2d.set_ylim(0, 100)
# 重绘图像
plt.draw()
转化算法
# 计算经纬度与栅格坐标的映射比例
min_longitude = df['longitude'].min()
max_longitude = df['longitude'].max()
min_latitude = df['latitude'].min()
max_latitude = df['latitude'].max()
longitude_scale = 100 / (max_longitude - min_longitude)
latitude_scale = 100 / (max_latitude - min_latitude)
# 转换函数
def convert_to_grid(lon, lat):
grid_x = (lon - min_longitude) * longitude_scale
grid_y = (lat - min_latitude) * latitude_scale
return int(grid_x), int(grid_y)
案例实现并不困难,本文只是向大家提供一个参考,欢迎大家提问
来看看效果吧,视频效果,请看资源