经纬度坐标转化为二维横纵坐标

本案例将一块区域的经纬度信息先3D显示,然后转化为100*100的二维栅格化横纵坐标

转换步骤

  1. 确定区域的经纬度边界:需要知道要转换的区域的最小和最大经度,以及最小和最大纬度。这四个值定义了一个矩形区域。

  2. 计算经纬度与栅格坐标的映射比例:计算经度和纬度每个单位对应的栅格数量。这可以通过以下方式计算:

    经度栅格比例=100/(最大经度−最小经度经度)

    纬度栅格比例=100/(最大纬度−最小纬度纬度)

  3. 将经纬度转换为栅格坐标:对于给定的经纬度点,可以通过以下方式转换为栅格坐标:

    栅格X=(经度−最小经度)×经度栅格比例

    栅格Y=(纬度−最小纬度)×纬度栅格比例

  4. 处理边界情况:确保转换后的栅格坐标不会超出 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)

案例实现并不困难,本文只是向大家提供一个参考,欢迎大家提问

来看看效果吧,视频效果,请看资源

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

01_

感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值