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

如何计算地理坐标(经纬度)的组合方差?

如何计算位置信息的variance(方差)

位置包含latitude(纬度)和longitude(经度)。我希望得到一个单一数值来体现位置信息的方差(而非分别计算纬度和经度的方差),请问实现这一目标的最佳方式是什么?

>>> pdf = pd.DataFrame({'latitude': {0: 47.0, 8: 54.0, 14: 55.0, 15: 39.0, 2: 31.0},
              'longitude': {0: 29.0, 8: 10.0, 14: 36.0, 15: -9.0, 2: 121.0}
             })

>>> pdf

  latitude  longitude

0   47.0    29.0
8   54.0    10.0
14  55.0    36.0
15  39.0    -9.0
2   31.0    121.0

根据numpy官方文档,np.var函数要么将数组扁平化后计算方差,要么按列分别计算方差。

axis:可选参数,为None、整数或整数元组,指定计算方差的轴。默认值为对扁平化后的数组计算方差。

预期结果(仅为示例)

>>> variance(pdf)
27.9

我希望了解这些坐标是否彼此接近,请问获取“combined variance”(组合方差)的最佳方法是什么?


解决方案

要得到体现坐标整体离散程度的单一方差值,核心是规避经纬度本身的单位差异和球面特性干扰,以下是两种实用方法:

方法1:计算到中心点的球面距离方差

这是最直观反映坐标分散程度的方式,因为它直接基于地球表面的实际距离:

  1. 计算所有坐标的地理中心点(纬度、经度的均值)
  2. 用Haversine公式计算每个点到中心点的球面距离
  3. 对这些距离值计算方差,结果能直接体现坐标的整体分散情况

示例代码:

import numpy as np
import pandas as pd
from math import radians, sin, cos, sqrt, atan2

def haversine(lat1, lon1, lat2, lon2):
    # 经纬度转换为弧度
    lat1, lon1, lat2, lon2 = map(radians, [lat1, lon1, lat2, lon2])
    dlat = lat2 - lat1
    dlon = lon2 - lon1
    a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
    c = 2 * atan2(sqrt(a), sqrt(1-a))
    # 地球半径取6371公里,结果单位为公里
    return 6371 * c

# 计算中心点
center_lat = pdf['latitude'].mean()
center_lon = pdf['longitude'].mean()

# 计算每个点到中心点的距离
pdf['distance_to_center'] = pdf.apply(lambda row: haversine(row['latitude'], row['longitude'], center_lat, center_lon), axis=1)

# 计算距离的方差
combined_variance = np.var(pdf['distance_to_center'])
print(combined_variance)

方法2:标准化后用协方差矩阵统计量

如果不需要实际距离指标,可以通过标准化消除经纬度单位差异,再利用多维统计量:

  • 协方差矩阵的迹:等于纬度方差加经度方差,代表各维度离散程度的总和
  • 协方差矩阵的行列式:反映多维数据的整体离散程度,值越大说明坐标分布越分散

示例代码(标准化后计算行列式):

# 标准化经纬度,消除单位差异
scaled_lat = (pdf['latitude'] - pdf['latitude'].mean()) / pdf['latitude'].std()
scaled_lon = (pdf['longitude'] - pdf['longitude'].mean()) / pdf['longitude'].std()
scaled_data = np.column_stack((scaled_lat, scaled_lon))

# 计算协方差矩阵
cov_matrix = np.cov(scaled_data, rowvar=False)

# 行列式值作为整体离散程度指标
combined_variance = np.linalg.det(cov_matrix)
print(combined_variance)

关键提醒

直接扁平化经纬度计算方差没有实际意义——经度范围是-180180,纬度是-9090,两者范围差异会导致结果被经度主导,无法真实反映坐标的分散程度。


内容的提问来源于stack exchange,提问作者s510

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:27:23