我有以下型号.
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) 我设法得到两个函数来计算谷歌地图上两点之间的距离.我使用Google Maps API中的GLatLng.distanceFrom方法从网络上的各个位置收集(偷取)了一个.
我使用两个函数的原因是因为我注意到我从谷歌获得的结果有些奇怪,例如,Lands End和英国的John O Groats之间的距离返回如下
与维基百科的结果相差15/16km是因为Google返回的位置结果与实际的John O Groats相距约15公里.这是正确的.
然后我测试了伦敦和米兰之间的距离并得到了
所以有人超过250公里.然后我尝试了伦敦到纽约
一般来说,伦敦和纽约之间的距离大约为5560公里.但是现在我的功能和Google功能似乎都不合适了.
我正在使用的功能可以在这里找到.我向作者抱歉没有链接到原始网站,但布局真的令人困惑.我正在使用distHaversine功能.
我必须承认,数学是超出我的舒适程度,但我得到了要点,据我所知,谷歌也使用了Haversine方法.我也明白它可能会下降约0.3%,但这并不能解释我所看到的差异.而且我更加困惑的是,它有时是正确的,有时会偏离地方之间的常规距离.距离越远,越远.
那么谁错了.Google和我正在使用的功能,还是其他所有人?
我在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) 这是我的问题,我有一个包含位置和纬度/经度的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)好一点.
提前致谢!
我有一个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)
这显然需要数小时和数小时.我想到的一些可能性:
我正在开发一个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) 我有一个包含纬度和经度的地方的数据框.想象一下,例如城市.
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上传解决方案.我只是想学习.
我正在使用GPS和Arduino创建地理围栏.我想实现Haversine公式以找到两点之间的距离,以便用半径计算它.问题是我发现很难在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上实现上述公式?
我知道要找到两个纬度,经度点之间的距离我需要使用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) haversine ×10
python ×5
pandas ×3
distance ×2
geospatial ×2
numpy ×2
php ×2
arduino-ide ×1
django ×1
formula ×1
geohashing ×1
google-maps ×1
laravel ×1
mysql ×1
pdo ×1
sql ×1
sqlite ×1