You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

英国车辆事故数据UTM转经纬度的区域选择及区域划分咨询

问题

处理英国车辆事故DataFrame时,需要把UTM格式的东向坐标(location_easting_osgr)和北向坐标(location_northing_osgr)转成经纬度,再进一步划分区域。目前已写了转换函数,但不确定该用哪个UTM区域,也不知道怎么新增列把经纬度转成区域。现有函数如下:

def rule(row):
    lat, lon = utm.to_latlon(row["location_easting_osgr"], row["location_northing_osgr"], 30, 'U')
    return pd.Series({"lat": lat, "long": lon})
df = df.merge(df_subset.apply(rule, axis=1), left_index= True, right_index= True)

一、确定英国对应的UTM区域

英国本土大部分区域属于UTM 30U和UTM 31U:

  • 西经2°到东经6°之间的区域(包括英格兰大部分、威尔士、苏格兰南部)用UTM 30U
  • 东经6°到东经12°之间的区域(苏格兰北部、英格兰东部小部分)用UTM 31U
    如果数据集覆盖全英国,建议先通过坐标判断所属区域,再分情况转换:
def get_utm_zone(easting):
    # 英国东向坐标大致范围:300000到650000
    if easting < 500000:  # 大致对应30U区域
        return 30, 'U'
    else:
        return 31, 'U'

def convert_coords(row):
    zone_num, zone_letter = get_utm_zone(row["location_easting_osgr"])
    lat, lon = utm.to_latlon(row["location_easting_osgr"], row["location_northing_osgr"], zone_num, zone_letter)
    return pd.Series({"lat": lat, "long": lon})

# 直接新增列,不用merge更高效
df[["lat", "long"]] = df.apply(convert_coords, axis=1)

二、将经纬度转换为区域

提供两种实用方法:

  1. 基于经纬度范围划分(适合大致分区)
    比如按英格兰、苏格兰、威尔士的大致经纬度边界判断:
def assign_region(row):
    lat = row["lat"]
    lon = row["long"]
    if lat < 54.5 and lon > -5.0:  # 威尔士范围
        return "Wales"
    elif lat < 55.0 and lon > -2.0:  # 英格兰范围
        return "England"
    elif lat >= 55.0:  # 苏格兰范围
        return "Scotland"
    else:
        return "Other"

df["region"] = df.apply(assign_region, axis=1)
  1. 基于官方地理边界数据(更精准)
    用英国官方区域边界Shapefile(比如ONS发布的边界数据),结合geopandas做空间匹配:
import geopandas as gpd

# 读取Shapefile(替换为你的文件路径)
uk_regions = gpd.read_file("uk_regions.shp")
# 将原始DataFrame转为GeoDataFrame
df_geo = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df["long"], df["lat"]), crs="EPSG:4326")
# 空间匹配,获取所属区域
df_geo = gpd.sjoin(df_geo, uk_regions, how="left", predicate="within")
# 将区域列转回原DataFrame
df["region"] = df_geo["region_name"]  # 替换为Shapefile中对应的区域名称列

三、代码优化提示

  • 避免用merge,直接通过df[["lat", "long"]] = df.apply(...)新增列,效率更高
  • 如果数据集很大,用swifter库加速apply操作:
    import swifter
    df[["lat", "long"]] = df.swifter.apply(convert_coords, axis=1)
    

内容的提问来源于stack exchange,提问作者E. Artemis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 05:39:54