我有一个坐标列表,可以使用半径距离度量计算所有点之间的距离矩阵.
协调来作为一个numpy.array形状(n, 2)的(latitude, longitude)对:
[[ 16.34576887 -107.90942116]
[ 12.49474931 -107.76030036]
[ 27.79461514 -107.98607881]
...
[ 12.90258404 -107.96786569]
[ -6.29109889 -107.88681145]
[ -2.68531605 -107.72796034]]
Run Code Online (Sandbox Code Playgroud)
我也可以沿着坐标序列隐含的路径提取距离,如下所示:
coordinates = np.deg2rad(coordinates)
lat, lng = coordinates[:, 0], coordinates[:, 1]
diff_lat = lat[:, None] - lat
diff_lng = lng[:, None] - lng
d = np.sin(diff_lat / 2) ** 2 + np.cos(lat[:, None]) * np.cos(lat) * np.sin(diff_lng / 2) ** 2
dist_matrix = 2 * 6371 * np.arcsin(np.sqrt(d))
np.diagonal(dist_matrix, …Run Code Online (Sandbox Code Playgroud) 我有两个lat和long数组.我想计算每对lat和long之间的距离,以及阵列中每隔一对lat和long.这是我的两个数组.
lat_array
array([ 0.33356456, 0.33355585, 0.33355585, 0.33401788, 0.33370132,
0.33370132, 0.33370132, 0.33371075, 0.33371075, 0.33370132,
0.33370132, 0.33370132, 0.33356488, 0.33356488, 0.33370132,
0.33370132, 0.33370132, 0.33401788, 0.33362632, 0.33362632,
0.33364007, 0.33370132, 0.33401788, 0.33401788, 0.33358399,
0.33358399, 0.33358399, 0.33370132, 0.33370132, 0.33362632,
0.33370132, 0.33370132, 0.33370132, 0.33370132, 0.33370132,
0.33356488, 0.33356456, 0.33391071, 0.33370132, 0.33356488,
0.33356488, 0.33356456, 0.33356456, 0.33356456, 0.33362632,
0.33364804, 0.3336314 , 0.33370132, 0.33370132, 0.33370132,
0.33364034, 0.33359921, 0.33370132, 0.33360397, 0.33348863,
0.33370132])
long_array
array([ 1.27253229, 1.27249141, 1.27249141, 1.27259085, 1.2724337 ,
1.2724337 , 1.2724337 , 1.27246931, 1.27246931, 1.2724337 ,
1.2724337 , 1.2724337 , …Run Code Online (Sandbox Code Playgroud) 我正在尝试将Haversine公式实现到excel函数中。它看起来像这样:
Public Function Haversine(Lat1 As Variant, Lon1 As Variant, Lat2 As Variant, Lon2 As Variant)
Dim R As Integer, dlon As Variant, dlat As Variant, Rad1 As Variant
Dim a As Variant, c As Variant, d As Variant, Rad2 As Variant
R = 6371
dlon = Excel.WorksheetFunction.Radians(Lon2 - Lon1)
dlat = Excel.WorksheetFunction.Radians(Lat2 - Lat1)
Rad1 = Excel.WorksheetFunction.Radians(Lat1)
Rad2 = Excel.WorksheetFunction.Radians(Lat2)
a = Sin(dlat / 2) * Sin(dlat / 2) + Cos(Rad1) * Cos(Rad2) * Sin(dlon / 2) * Sin(dlon / …Run Code Online (Sandbox Code Playgroud) 我正在PHP中实现Haversine公式,如下所示
$result=mysqli_query($mysqli,"SELECT *,( 6371 * acos( cos( radians({$lat}) ) * cos( radians( `latitude` ) ) * cos( radians( `longitude` ) -radians({$lon}) ) +sin( radians({$lat}) ) * sin( radians( `latitude` ) ) ) ) AS distance FROM `places` HAVING distance <= {$radius} ORDER BY distance ASC") or die(mysqli_error($mysqli));
Run Code Online (Sandbox Code Playgroud)
在Haversine访存循环中,我有一个查询,它遍历Haversine的结果以选择与Haversine公式返回的ID匹配的记录。查询如下。
while($row = mysqli_fetch_assoc($result))
{
$rest_time=$row['id'];
$result1=mysqli_query($mysqli,"SELECT * FROM my_friends WHERE personal_id='".$personal_id."' AND id='".$rest_time."'") or die(mysqli_error($mysqli));
//Some operations here
}
Run Code Online (Sandbox Code Playgroud)
如何执行Join操作将这些查询混合为一个查询?从优化的角度来看,这样做是否明智?如果第二个表有5万个用户,而第一个表有近1000条记录呢?
我有一张地图,他们可以在其中找到几个点(纬度/经度)并想知道它们之间存在的距离。
那么,给定一组纬度/经度坐标,我如何在 python 中计算它们之间的距离?
我不知道如何解释 sklearn(20.2 版)中半正弦实现的输出
文档说,“请注意,半正弦距离度量需要 [纬度,经度] 形式的数据,输入和输出都以弧度为单位。”,所以我应该能够转换为公里乘以 6371(远距离大约为半径)。
两点的功能距离计算如下:
def distance(origin, destination):
lat1, lon1 = origin
lat2, lon2 = destination
radius = 6371 # km
dlat = math.radians(lat2-lat1)
dlon = math.radians(lon2-lon1)
a = math.sin(dlat/2) * math.sin(dlat/2) + math.cos(math.radians(lat1)) \
* math.cos(math.radians(lat2)) * math.sin(dlon/2) * math.sin(dlon/2)
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
d = radius * c
return d
distance([32.027240,-81.093190],[41.981876,-87.969982])
1263.103504537151
Run Code Online (Sandbox Code Playgroud)
这是正确的距离。
使用 BallTree 实现:
from sklearn.neighbors import BallTree
test_points = [[32.027240,41.981876],[-81.093190,-87.969982]]
tree = BallTree(test_points,metric = 'haversine')
results = tree.query_radius(test_points,r = 10,return_distance …Run Code Online (Sandbox Code Playgroud) 我正在处理纬度和经度数据。我使用了 BallTree,因为数据集中有很多行(32000 行)。如果我用半正矢距离构建树:
model_BTree = BallTree(np.array(points_sec_rad), metric='haversine')
Run Code Online (Sandbox Code Playgroud)
我将纬度和经度转换为弧度单位,如何将 query_radius (max_dist_rad) 应用于我想要定位的点?我使用 0.150 米作为半径,但我不确定是否应该使用弧度近似值。
ind_BTree, dist_BTree = model_BTree.query_radius(np.array(points_loc_rad), r=max_dist_rad, return_distance=True, sort_results=True)
Run Code Online (Sandbox Code Playgroud)
另外,如何限制半径内邻居的数量?谢谢
我从表单中抓取一个邮政编码.然后,我可以将此邮政编码转换为lng,lat坐标,因为我将这些邮政编码存储在表格中.
SELECT lng, lat from postcodeLngLat WHERE postcode = 'CV1'
我有另一张桌子,存放着各种场地的lng,lat.
SELECT v.lat, v.lng, v.name, p.lat, p.lng, p.postcode, 'HAVERSINE' AS distance FROM venuepostcodes v, postcodeLngLat p WHERE p.outcode = 'CB6' ORDER BY distance
我想要做的是创建一个数据网格,显示每个场地与邮政编码的距离(在这种情况下为CV1).我知道Haversine公式应该做我想要实现的目标,但我已经迷失了我应该从哪里开始将它合并到我的查询中.我认为公式需要放在我'HAVERSINE'上面的查询中.
有任何想法吗?
编辑
SELECT o.outcode AS lead_postcode, v.venue_name, 6371.0E * ( 2.0E *asin(case when 1.0E < (sqrt(square(sin(((RADIANS(CAST(o.lat AS FLOAT)))-(RADIANS(CAST(v.lat AS FLOAT))))/2.0E)) + (cos(RADIANS(CAST(v.lat AS FLOAT))) * cos(RADIANS(CAST(o.lat AS FLOAT))) * square(sin(((RADIANS(CAST(o.lng AS FLOAT)))-(RADIANS(CAST(v.lng AS FLOAT))))/2.0E))))) then 1.0E else (sqrt(square(sin(((RADIANS(CAST(o.lat AS FLOAT)))-(RADIANS(CAST(v.lat AS FLOAT))))/2.0E)) + (cos(RADIANS(CAST(v.lat …
我对此有点陌生。我最近准备将数学方程转换为代码。所以我开始练习简单的公式,例如斐波那契数和半正矢公式。
\n\n但我对以下参考文献中的半正弦代码有点困惑;
\n\n\n\n一般来说,他们所做的是,
\n\nvar R = 6371e3; // metres\nvar \xcf\x861 = lat1.toRadians();\nvar \xcf\x862 = lat2.toRadians();\nvar \xce\x94\xcf\x86 = (lat2-lat1).toRadians();\nvar \xce\x94\xce\xbb = (lon2-lon1).toRadians();\n\nvar a = Math.sin(\xce\x94\xcf\x86/2) * Math.sin(\xce\x94\xcf\x86/2) +\n Math.cos(\xcf\x861) * Math.cos(\xcf\x862) *\n Math.sin(\xce\x94\xce\xbb/2) * Math.sin(\xce\x94\xce\xbb/2);\nvar c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));\n\nvar d = R * c;\nRun Code Online (Sandbox Code Playgroud)\n\n我从这里得到了原始半正矢公式的参考。
\n\n然后,注意这一行,
\n\nvar c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));\nRun Code Online (Sandbox Code Playgroud)\n\n它的哪一部分来自维基百科中的原始半正矢公式?我在这些图表上根本没有找到任何切线。我在这里错过了什么吗?任何建议表示赞赏。
\n我正在 C# 中创建一个距离计算器,使用半正弦方程来计算经度和纬度之间的距离,但它给出了错误的输出,谁能明白为什么?第一个 long 和 lat 值是针对威尔士(班戈)的一个地方,另一个是针对英格兰(曼彻斯特)的一个地方这里是代码:
using System;
public static class Program
{
static double toRadians(double angle)
{
return (angle * Math.PI) / 180;
}
static double CalcDistance(double lon1, double lon2, double lat1, double lat2)
{
lon1 = toRadians(lon1);
lon2 = toRadians(lon2);
lat1 = toRadians(lat1);
lat2 = toRadians(lat2);
//haversine formula
double dlat, dlon;
dlat = lat2 - lat1;
dlon = lon2 - lon1;
double a = Math.Pow(Math.Sin(dlat / 2), 2) *
Math.Cos(lat1) * Math.Cos(lat2) *
Math.Pow(Math.Sin(dlon / 2), 2); …Run Code Online (Sandbox Code Playgroud) haversine ×10
python ×5
distance ×2
numpy ×2
arrays ×1
c# ×1
excel ×1
formula ×1
join ×1
mysql ×1
optimization ×1
performance ×1
php ×1
scikit-learn ×1
sql ×1
sql-server ×1
trigonometry ×1
vba ×1