2016-03-28 171 views
1

我的问题很简单。从geopy.distance,我可以计算两点之间的距离。但我无法转换数据格式以供进一步计算。Vincenty距离转换成阵列

这样的代码:

from geopy.distance import vincenty 
length = vincenty((38.103414282108375, 114.51898800000002),\ 
        (38.07902986076924, 114.50882128404997)) 

ration = np.array(([2,2],[3,3]))*length 

错误:

unsupported operand type(s) for *: 'int' and 'vincenty'

我试图改变Distance(xxx)到np.array:np.array(length),但未能成功。它显示如array(Distance(388.659276576), dtype=object),仍然不能直接支持计算。

+0

FWIW,如果你想使用更稳定和更精确的算法比Vincenty,看看CF˚FKarney的优秀[GeographicLib(HTTP://geographiclib.sourceforge 。净/)。维基百科的[椭圆体上的测地线]也提供了一些信息(https://en.wikipedia.org/wiki/Geodesics_on_an_ellipsoid#Solution_of_the_inverse_problem);卡尔尼是该文章的主要撰稿人,以及大多数关于椭球测地线的维基百科文章。 –

回答

2

正如手册中所建议的那样,您需要以某种格式“导出”距离/ vincenty。例如。像这样:

> from geopy.distance import vincenty 
> newport_ri = (41.49008, -71.312796) 
> cleveland_oh = (41.499498, -81.695391) 
> print(vincenty(newport_ri, cleveland_oh).miles) 
538.3904451566326 

您不能处理vincenty iteself,因为(你已经提到),它是一个对象的是不支持的数学运算数geopy的。您需要提取数据对象中的值,例如与.miles。查看完整的文档,其他可能的值:GeoPy documentation

见差异类型:

> type(vincenty(newport_ri, cleveland_oh)) 
geopy.distance.vincenty 

> type(vincenty(newport_ri, cleveland_oh).miles) 
float 

现在你可以用这个计算:

> vincenty(newport_ri, cleveland_oh).miles 
538.3904451566326 

> vincenty(newport_ri, cleveland_oh).miles * 2 
1076.7808903132652 

或者,如果你真的需要一个numpy的阵列出于此:

> np.array(vincenty(newport_ri, cleveland_oh).miles) 
array(538.3904451566326) 

> type(np.array(vincenty(newport_ri, cleveland_oh).miles)) 
numpy.ndarray 

编辑:请注意,你甚至可以强制执行它的数据类型与NumPy的内置的dtype参数:

> np.array(vincenty(newport_ri, cleveland_oh).miles, dtype=np.float32) 
array(538.3904418945312, dtype=float32) 

> np.array(vincenty(newport_ri, cleveland_oh).miles, dtype=np.float64) 
array(538.3904451566326) # dtype=float64, default type here 

> np.array(vincenty(newport_ri, cleveland_oh).miles, dtype=np.int32) 
array(538, dtype=int32) 

可能是有帮助的,如果你存储/加载大量的数据,但始终只是需要一定的精度。

+0

我曾经想到过。但我仍然无法找到解决方案来将'print'内容保存为np.array。 –

+0

我已经为此添加了一个示例。不过,我建议你阅读一些NumPy和/或Python教程,因为这是真正的*基础知识。如果你用print(vincenty(newport_ri,cleveland_oh).miles)打印一个'float',它应该*非常明显*你可以简单地使用'someVariable = vincenty(newport_ri,cleveland_oh).miles'来获得这个float将它保存在一个变量中用于进一步计算(或者变成一个numpy数组)。 – daniel451

+1

没问题,不客气。不要忘记查看一些教程;) – daniel451

1
vincenty((38.103414282108375, 114.51898800000002),\ 
        (38.07902986076924, 114.50882128404997)) 

它是对象,你正在尝试在不同类型的对象上进行乘法运算。 我建议这样做

from geopy.distance import vincenty 
length = vincenty((38.103414282108375, 114.51898800000002),\ 
        (38.07902986076924, 114.50882128404997)) 
length = length.miles 

ration = np.array(([2,2],[3,3]))*length