标签: haversine

如何使用落在某个半径范围内的纬度和经度坐标过滤django模型

我有以下型号.

class Location(models.Model):
    name = models.CharField(max_length = 128, blank = True)
    address =models.CharField(max_length = 200, blank= True)
    latitude = models.DecimalField(max_digits=6, decimal_places=3)
    longitude = models.DecimalField(max_digits=6, decimal_places=3)

    def __unicode__(self):
        return self.name
Run Code Online (Sandbox Code Playgroud)

如果我目前的纬度和经度是:

current_lat = 43.648
current_long = 79.404
Run Code Online (Sandbox Code Playgroud)

我做了一些研究并遇到了Haversine方程,它计算了两个位置坐标之间的距离.以下是我发现的等式:

import math

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 …
Run Code Online (Sandbox Code Playgroud)

python django haversine

9
推荐指数
3
解决办法
5386
查看次数

Google地图是否计算错误的距离?

我设法得到两个函数来计算谷歌地图上两点之间的距离.我使用Google Maps API中的GLatLng.distanceFrom方法从网络上的各个位置收集(偷取)了一个.

我使用两个函数的原因是因为我注意到我从谷歌获得的结果有些奇怪,例如,Lands End和英国的John O Groats之间的距离返回如下

  • 我的功能:985公里
  • 谷歌:986公里
  • 维基百科:970公里

与维基百科的结果相差15/16km是因为Google返回的位置结果与实际的John O Groats相距约15公里.这是正确的.

然后我测试了伦敦和米兰之间的距离并得到了

  • 我的功能:1232公里
  • 谷歌:1234公里
  • Wolfram Alpha:958.5km

所以有人超过250公里.然后我尝试了伦敦到纽约

  • 我的功能:8244km
  • 谷歌:8254公里
  • Wolfram Alpha:5581km

一般来说,伦敦和纽约之间的距离大约为5560公里.但是现在我的功能和Google功能似乎都不合适了.

我正在使用的功能可以在这里找到.我向作者抱歉没有链接到原始网站,但布局真的令人困惑.我正在使用distHaversine功能.

我必须承认,数学是超出我的舒适程度,但我得到了要点,据我所知,谷歌也使用了Haversine方法.我也明白它可能会下降约0.3%,但这并不能解释我所看到的差异.而且我更加困惑的是,它有时是正确的,有时会偏离地方之间的常规距离.距离越远,越远.

那么谁错了.Google和我正在使用的功能,还是其他所有人?

google-maps haversine

8
推荐指数
1
解决办法
4424
查看次数

Pandas纬度 - 连续行之间距离的经度

我在Python 2.7中的Pandas DataFrame中有以下内容:

Ser_Numb        LAT      LONG
       1  74.166061 30.512811
       2  72.249672 33.427724
       3  67.499828 37.937264
       4  84.253715 69.328767
       5  72.104828 33.823462
       6  63.989462 51.918173
       7  80.209112 33.530778
       8  68.954132 35.981256
       9  83.378214 40.619652
       10 68.778571 6.607066
Run Code Online (Sandbox Code Playgroud)

我想计算数据帧中连续行之间的距离.输出应该如下所示:

Ser_Numb          LAT        LONG   Distance
       1    74.166061   30.512811          0
       2    72.249672   33.427724          d_between_Ser_Numb2 and Ser_Numb1
       3    67.499828   37.937264          d_between_Ser_Numb3 and Ser_Numb2
       4    84.253715   69.328767          d_between_Ser_Numb4 and Ser_Numb3
       5    72.104828   33.823462          d_between_Ser_Numb5 and Ser_Numb4
       6    63.989462   51.918173          d_between_Ser_Numb6 and Ser_Numb5
       7    80.209112   33.530778   .
       8 …
Run Code Online (Sandbox Code Playgroud)

python numpy geospatial haversine pandas

8
推荐指数
1
解决办法
1万
查看次数

用SQLite计算大圆距离

这是我的问题,我有一个包含位置和纬度/经度的SQLite表.基本上我需要:

SELECT location, HAVERSINE(lat, lon) AS distance FROM location ORDER BY distance ASC;
Run Code Online (Sandbox Code Playgroud)

HAVERSINE()是一个PHP函数,应该返回给定一对纬度和经度值的大圆距离(以英里或公里为单位).其中一对应由PHP提供,另一对应由locations表中可用的每个纬度/经度行提供.

由于SQLite没有任何Geo Spatial扩展(AFAIK SpatiaLite存在但仍然......)我猜测最好的方法是使用自定义函数和其中一个PDO方法:

我认为对于这种情况PDO::sqliteCreateFunction()就足够了,但是我对这个函数的有限经验可以简化为类似于PHP手册中提供的用例:

$db = new PDO('sqlite:geo.db');

function md5_and_reverse($string) { return strrev(md5($string)); }

$db->sqliteCreateFunction('md5rev', 'md5_and_reverse', 1);
$rows = $db->query('SELECT md5rev(filename) FROM files')->fetchAll();
Run Code Online (Sandbox Code Playgroud)

我在弄清楚如何获得一个SQLite用户定义函数来同时处理来自PHP和表数据的数据时遇到了一些麻烦.如果有人能帮助我解决这个问题同时也理解SQLite UDF(一个大赢家),我将不胜感激. SQLite IMO)好一点.

提前致谢!

php sqlite pdo geospatial haversine

7
推荐指数
2
解决办法
6898
查看次数

Python快速计算很多距离

我有一个36,742点的输入,这意味着如果我想计算距离矩阵的下三角形(使用vincenty近似),我需要生成36,742*36,741*0.5 = 1,349,974,563距离.

我想保持彼此相距50公里的对组合.我目前的设置如下

shops= [[id,lat,lon]...]

def lower_triangle_mat(points):
    for i in range(len(shops)-1):
        for j in range(i+1,len(shops)):
            yield [shops[i],shops[j]]

def return_stores_cutoff(points,cutoff_km=0):
    below_cut = []
    counter = 0
    for x in lower_triangle_mat(points):
        dist_km = vincenty(x[0][1:3],x[1][1:3]).km
        counter += 1
        if counter % 1000000 == 0:
            print("%d out of %d" % (counter,(len(shops)*len(shops)-1*0.5)))
        if dist_km <= cutoff_km:
            below_cut.append([x[0][0],x[1][0],dist_km])
    return below_cut

start = time.clock()
stores = return_stores_cutoff(points=shops,cutoff_km=50)
print(time.clock() - start)
Run Code Online (Sandbox Code Playgroud)

这显然需要数小时和数小时.我想到的一些可能性:

  • 使用numpy来矢量化这些计算而不是循环
  • 使用某种哈希来快速粗略(100公里内的所有商店),然后只计算这些商店之间的准确距离
  • 而不是将点存储在列表中使用类似四叉树的东西,但我认为这只能帮助关闭点的排名而不是实际距离 - >所以我想某种地理数据库
  • 我可以明显地尝试半正矢或项目,并利用欧氏距离,但我很感兴趣,使用最准确的测量可能 …

python numpy distance haversine geohashing

7
推荐指数
1
解决办法
2336
查看次数

Laravel中两点之间的Haversine距离计算

我正在开发一个laravel应用程序,我需要找到所有在用户坐标的某个半径范围内的产品.产品与用户有一对多的关系,因此用户可以拥有多种产品.

我发现,半正式公式可以计算出两点之间的距离,但我似乎无法使它起作用.

我的控制器中有以下查询:

$latitude = 51.0258761;
$longitude = 4.4775362;
$radius = 20000;

$products = Product::with('user')
->selectRaw("*,
            ( 6371 * acos( cos( radians(" . $latitude . ") ) *
            cos( radians(user.latitude) ) *
            cos( radians(user.longitude) - radians(" . $longitude . ") ) + 
            sin( radians(" . $latitude . ") ) *
            sin( radians(user.latitude) ) ) ) 
            AS distance")
->having("distance", "<", $radius)
->orderBy("distance")
->get();
Run Code Online (Sandbox Code Playgroud)

我将半径设置为20000用于测试目的,看起来所有产品的距离都是5687,..问题似乎是产品的纬度和经度存储在User表中,但我不确定我如何在我的查询中访问这些.我已经尝试过user.latitude'user-> latitude',但似乎没有任何效果.

这是我的模特:

产品型号

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    protected …
Run Code Online (Sandbox Code Playgroud)

php mysql sql haversine laravel

7
推荐指数
2
解决办法
6264
查看次数

Pandas Dataframe:根据地理坐标(经度和纬度)连接范围内的项目

我有一个包含纬度和经度的地方的数据框.想象一下,例如城市.

df = pd.DataFrame([{'city':"Berlin", 'lat':52.5243700, 'lng':13.4105300},
                   {'city':"Potsdam", 'lat':52.3988600, 'lng':13.0656600},
                   {'city':"Hamburg", 'lat':53.5753200, 'lng':10.0153400}]);
Run Code Online (Sandbox Code Playgroud)

现在我试图让所有城市都在另一个城市的半径范围内.假设距离柏林500公里,距汉堡500公里等所有城市.我会通过复制原始数据帧并使用距离函数连接来完成此操作.

中间结果有点像这样:

Berlin --> Potsdam
Berlin --> Hamburg
Potsdam --> Berlin
Potsdam --> Hamburg
Hamburg --> Potsdam
Hamburg --> Berlin
Run Code Online (Sandbox Code Playgroud)

分组(减少)后的最终结果应该是这样的.备注:如果值列表包含城市的所有列,那将会很酷.

Berlin --> [Potsdam, Hamburg]
Potsdam --> [Berlin, Hamburg]
Hamburg --> [Berlin, Potsdam]
Run Code Online (Sandbox Code Playgroud)

或者只是一个城市周围500公里的城市数量.

Berlin --> 2
Potsdam --> 2
Hamburg --> 2
Run Code Online (Sandbox Code Playgroud)

由于我对Python很陌生,所以我会很感激任何起点.我很熟悉长距离.但不确定Scipy或Pandas中是否有有用的距离/空间方法.

很高兴,如果你能给我一个起点.到目前为止,我尝试过这篇文章.

更新:这个问题背后的原始想法来自两西格玛连接租赁列表Kaggle比赛.我们的想法是让那些在另一个列表中上市100米.其中a)表示密度,因此表示热门区域; b)如果比较地址,您可以查看是否存在交叉,因此是否存在噪声区域.因此,您不需要完整的项目与项目关系,因为您不仅需要比较距离,还需要比较地址和其他元数据.PS:我没有向Kaggle上传解决方案.我只是想学习.

python latitude-longitude haversine pandas

7
推荐指数
1
解决办法
1941
查看次数

Arduino上的Haversine公式实现

我正在使用GPS和Arduino创建地理围栏.我想实现Ha​​versine公式以找到两点之间的距离,以便用半径计算它.问题是我发现很难在Arduino IDE上实现Haversine Formula,我在Arduino上比较初学.

a = sin²(??/2) + cos(?1).cos(?2).sin²(??/2)
c = 2.atan2(?a, ?(1?a))
d = R.c
Run Code Online (Sandbox Code Playgroud)

如何在Arduino IDE上实现上述公式?

haversine arduino-ide

6
推荐指数
1
解决办法
1822
查看次数

带有熊猫数据帧的Vectorised Haversine公式

我知道要找到两个纬度,经度点之间的距离我需要使用hasrsine函数:

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)) 
    km = 6367 * c
    return km
Run Code Online (Sandbox Code Playgroud)

我有一个DataFrame,其中一列是纬度,另一列是经度.我想知道这些点距离设定点有多远,-56.7213600,37.2175900.如何从DataFrame中获取值并将它们放入函数中?

示例DataFrame:

     SEAZ     LAT          LON
1    296.40,  58.7312210,  28.3774110  
2    274.72,  56.8148320,  31.2923240
3    192.25,  52.0649880,  35.8018640
4     34.34,  68.8188750,  67.1933670
5    271.05,  56.6699880,  31.6880620
6    131.88,  48.5546220,  49.7827730
7    350.71,  64.7742720,  31.3953780 …
Run Code Online (Sandbox Code Playgroud)

python haversine pandas

6
推荐指数
1
解决办法
5975
查看次数

半正矢公式的结果是米 o 公里?

我使用半正矢公式来计算点之间的距离。这个公式的结果是以米为单位还是以公里为单位?

http://en.wikipedia.org/wiki/Haversine_formula

有人可以帮助我吗?

distance formula haversine

5
推荐指数
1
解决办法
2万
查看次数