我想根据以公里为单位的圆半径检索最近的坐标点,并将结果绘制在散点图框上.但我不知道如何画出圆的形状半径.有人知道怎么画圆的形状半径吗?

到目前为止,我的结果只是圆半径的数据,没有它的圆形状.这是我的代码

import plotly.graph_objects as go
import plotly.express as px
from math import radians, cos, sin, asin, sqrt

def haversine(lon1, lat1, lon2, lat2):

    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])

    dlon = lon2 - lon1 
    dlat = lat2 - lat1 
    a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
    c = 2 * asin(sqrt(a)) 
    r = 6371
    return c * r

center_point = pd.DataFrame({'Longitude':[long_input], 'Latitude':[lat_input]})
test_point = df_latlong[['Longitude','Latitude']].reset_index().drop('index',axis=1)

lat1 = center_point['Latitude'][0]
lon1 = center_point['Longitude'][0]

df_nearest = []
for i, (index, row) in enumerate(df_latlong.iterrows()):
    lat2 = test_point['Latitude'][i]
    lon2 = test_point['Longitude'][i]
    a = haversine(lon1, lat1, lon2, lat2)
    df_nearest.append(a)

df_latlong['Distance'] = df_nearest
df_radius = df_latlong[df_latlong['Distance'] <= 5] #5 kilometers for radius 

fig_map3 = px.scatter_mapbox(df_radius, lon=df_radius['Longitude'], lat=df_radius['Latitude'],
                             hover_name='#WELL', zoom=9, width=300, height=500)

fig_map3.update_layout(mapbox_style='open-street-map', margin={'r':0, 't':0, 'l':0, 'b':0})

fig_map3.show()

它具有基于我在CENTER_POINT中定义的质心的圆形半径.我怎么能那样画出黑圈呢?半径为5公里.有什么主意吗?谢谢!

推荐答案

首先,我在与您在屏幕截图中显示的数据相同的地理区域创建了一些样本数据.

然后,我们可以使用@Stéphane提供的[近似][1]来计算半径为r、中心点和采样点数量的圆的(纬度、经度)点(对于您的问题,您希望围绕中心点的5公里半径足够小,因此此近似很好地适用).

注意:我try 使用geog.propogate计算圆的确切坐标,但没有成功,如[此处概述][2],但它没有为中心坐标周围的圆生成正确的坐标.

然后你可以将圆的(纬度,经度)点传递给go.Scattermapbox,将模式设置为‘线’,并将轨迹添加到你的图形中.

import numpy as np
import pandas as pd
import plotly.graph_objects as go
import plotly.express as px
from math import radians, cos, sin, asin, sqrt, pi

def haversine(lon1, lat1, lon2, lat2):

    lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])

    dlon = lon2 - lon1 
    dlat = lat2 - lat1 
    a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
    c = 2 * asin(sqrt(a)) 
    r = 6371
    return c * r

## create a sample dataframe to reproduce your data
lat_input, long_input = -0.622929, 117.575513,

lat_min, lat_max = -0.59, -0.68
long_min, long_max = 117.543, 117.614

np.random.seed(42)
df_latlong = pd.DataFrame({
    'Latitude': np.random.uniform(lat_min, lat_max, size=20),
    'Longitude': np.random.uniform(long_min, long_max, size=20),
    '#WELL': ["TN-test"]*20
})

center_point = pd.DataFrame({'Longitude':[long_input], 'Latitude':[lat_input]})
test_point = df_latlong[['Longitude','Latitude']].reset_index().drop('index',axis=1)

lat1 = center_point['Latitude'][0]
lon1 = center_point['Longitude'][0]

df_nearest = []
for i, (index, row) in enumerate(df_latlong.iterrows()):
    lat2 = test_point['Latitude'][i]
    lon2 = test_point['Longitude'][i]
    a = haversine(lon1, lat1, lon2, lat2)
    df_nearest.append(a)

df_latlong['Distance'] = df_nearest
df_radius = df_latlong[df_latlong['Distance'] <= 5] #5 kilometers for radius 

fig_map3 = px.scatter_mapbox(df_radius, lon=df_radius['Longitude'], lat=df_radius['Latitude'],
                             hover_name='#WELL', zoom=9, width=300, height=500)

radius = 5 * 1000 # m - the following code is an approximation that stays reasonably accurate for distances < 100km

# parameters
N = 360 # number of discrete sample points to be generated along the circle

# generate points
circle_lats, circle_lons = [], []
for k in range(N):
    # compute
    angle = pi*2*k/N
    dx = radius*cos(angle)
    dy = radius*sin(angle)
    circle_lats.append(lat1 + (180/pi)*(dy/6378137))
    circle_lons.append(lon1 + (180/pi)*(dx/6378137)/cos(lat1*pi/180))
circle_lats.append(circle_lats[0])
circle_lons.append(circle_lons[0])

fig_map3.add_trace(go.Scattermapbox(
    lat=circle_lats,
    lon=circle_lons,
    mode='lines',
    marker=go.scattermapbox.Marker(
        size=1, color="BlueViolet"
    ),
))

fig_map3.update_layout(mapbox_style='open-street-map', margin={'r':0, 't':0, 'l':0, 'b':0}, width=500)

fig_map3.show()

Python相关问答推荐

在Python中处理大量CSV文件中的数据

追溯(最近最后一次调用):文件C:\Users\Diplom/PycharmProject\Yolo01\Roboflow-4.py,第4行,在模块导入roboflow中

Pandas - groupby字符串字段并按时间范围 Select

图像 pyramid .难以创建所需的合成图像

Python,Fitting into a System of Equations

我对我应该做什么以及我如何做感到困惑'

Python—从np.array中 Select 复杂的列子集

组/群集按字符串中的子字符串或子字符串中的字符串轮询数据框

为什么抓取的HTML与浏览器判断的元素不同?

Pandas计数符合某些条件的特定列的数量

使用Python更新字典中的值

什么是最好的方法来切割一个相框到一个面具的第一个实例?

如何在Pyplot表中舍入值

如何使用两个关键函数来排序一个多索引框架?

如何使用使用来自其他列的值的公式更新一个rabrame列?

剪切间隔以添加特定日期

交替字符串位置的正则表达式

30个非DATETIME天内的累计金额

更新包含整数范围的列表中的第一个元素

如何从具有完整层次数据的Pandas框架生成图形?