python 探空数据根据“纬度”“经度”“纬度偏移量”“经度偏移量”列,纬度、经度、偏移量为浮点数,计算具体的经纬度

在Python中,如果您有包含“纬度”、“经度”、“纬度偏移量”和“经度偏移量”的DataFrame,并且这些值都是浮点数,可以使用这些值来计算新的、具体的经纬度。通常,这些偏移量是基于某种单位(如米、公里等)在地球表面上的距离转换而来的。由于地球是一个近似椭球体,计算精确的偏移后的经纬度需要考虑地球的曲率。

然而,对于小范围的偏移(例如几公里内),可以使用一种简化的方法,即“Haversine公式”的逆运算的一个近似版本,但这种方法通常用于从经纬度计算距离,而不是从距离反推经纬度。对于小偏移量,一个简单的线性近似(基于地球在某个点的切线平面)可能是足够的,但请注意这种方法的精度有限。

下面是一个使用线性近似的示例代码,但请注意这种方法并不精确,特别是在接近极点或偏移量较大时:

复制代码
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
@Time : 2025/1/20 22:24
@Author : Suyue
@Email : 1493117872@qq.com
@File : cloud_area.py
@Project : untitled4
"""
import pandas as pd
import numpy as np

# 读取CSV文件到DataFrame
df = pd.read_csv('D:/探空数据计算/tankong-2020-50527_with_final_times.csv')


# 并且这些偏移量是以某种单位(例如米)表示的在地球表面上的距离。
# 注意:这里的偏移量单位需要转换为度或弧度之前进行适当的转换,但这里我们假设是小偏移量并使用线性近似。

# 定义一个函数来计算新的经纬度
def calculate_new_coordinates(row, earth_radius=6371e3):  # 地球半径,单位:米
    # 注意:这里的偏移量转换是非常简化的,并不准确!
    # 正确的做法是使用更复杂的地理库(如geopy、pyproj)来进行精确的转换。
    # 但为了示例,我们假设偏移量很小,并且单位已经是度(这不是实际情况,仅用于演示)。

    # 获取原始经纬度
    lat = row['Lat']
    lon = row['Lon']

    # 获取偏移量(这里假设已经是度,实际上需要先从米转换为度)
    lat_dev = row['Lat_Dev']  # 实际上需要转换:offset_meters / (earth_radius * pi / 180) * cos(lat)
    lon_dev = row['Lon_Dev']  # 实际上需要转换:offset_meters / (earth_radius * cos(lat) * pi / 180)

    # 计算新的经纬度(这里直接使用加法,实际上应该使用更复杂的公式)
    new_lat = lat + lat_dev
    new_lon = lon + lon_dev

    return new_lat, new_lon


# 应用函数并添加新列
df[['New_Latitude', 'New_Longitude']] = df.apply(lambda row: pd.Series(calculate_new_coordinates(row)), axis=1)

# 将结果写入Excel文件
output_file_path = 'D:/探空数据计算/tankong-2020-50527_with_final_times_lat_lon.csv'
df.to_csv(output_file_path, index=False)  # index=False表示不写入行索引

# 打印成功消息
print(f"结果已成功写入Excel文件: {output_file_path}")
复制代码

 批量处理数据:

复制代码
#!usr/bin/env python
# -*- coding:utf-8 -*-
"""
@author: Suyue
@file: batch_process_raindrop_data.py
@time: 2025/02/19
@desc: 批量经纬度转换
"""
import pandas as pd
import numpy as np
import os
import glob

# 设置CSV文件所在的目录
input_directory = '/lianxi2/'

# 获取该目录下所有CSV文件的列表
csv_files = glob.glob(os.path.join(input_directory, '*.csv',))

# 遍历每个CSV文件
for csv_file in csv_files:
    # 读取CSV文件到DataFrame
    df = pd.read_csv(csv_file, encoding='gbk')


    # 定义一个函数来计算新的经纬度
    def calculate_new_coordinates(row, earth_radius=6371e3):
        # 注意:这里的偏移量转换是非常简化的,并不准确!
        # 正确的做法是使用更复杂的地理库(如geopy、pyproj)来进行精确的转换。
        # 但为了示例,我们假设偏移量很小,并且单位已经是度(这不是实际情况,仅用于演示)。

        # 获取原始经纬度
        lat = row['Lat']
        lon = row['Lon']

        # 获取偏移量(这里假设已经是度,实际上需要先从米转换为度)
        lat_dev = row['Lat_Dev']  # 实际上需要转换:offset_meters / (earth_radius * pi / 180) * cos(lat)
        lon_dev = row['Lon_Dev']  # 实际上需要转换:offset_meters / (earth_radius * cos(lat) * pi / 180)

        # 计算新的经纬度(这里直接使用加法,实际上应该使用更复杂的公式)
        new_lat = lat + lat_dev
        new_lon = lon + lon_dev
        return new_lat, new_lon


    # 应用函数并添加新列(注意:这里我们假设每个CSV文件都有'Lat', 'Lon', 'Lat_Dev', 'Lon_Dev'列)
    df[['New_Latitude', 'New_Longitude']] = df.apply(lambda row: pd.Series(calculate_new_coordinates(row)), axis=1)

    # 将结果写回原文件(这里直接覆盖原文件,请务必小心)
    # 如果想要保留原文件,可以将结果写入一个新文件,例如:csv_file.replace('.csv', '_modified.csv')
    df.to_csv(csv_file, index=False, encoding='gbk')

    # 打印成功消息(为了避免输出过多信息,这里可以选择性地打印每个文件的处理状态)
    # print(f"结果已成功写入文件: {csv_file}")

# 可选:打印一个总结消息表示所有文件都已处理完毕
print("所有文件都已成功处理。")
复制代码

 

posted @   秋刀鱼CCC  Views(13)  Comments(0Edit  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示