当前位置: 首页 > 面试题库 >

Geod ValueError:未定义反短程线

锺星腾
2023-03-14
问题内容

我想通过使用库中的Geod类来计算两个lon / lat点之间的距离pyproj

from pyproj import Geod

g = Geod(ellps='WGS84')
lonlat1 = 10.65583081724002, -7.313341167341917
lonlat2 = 10.655830383300781, -7.313340663909912

_, _, dist = g.inv(lonlat1[0], lonlat1[1], lonlat2[0], lonlat2[1])

我收到以下错误:

ValueError                                Traceback (most recent call last)
<ipython-input-5-8ba490aa5fcc> in <module>()
----> 1 _, _, dist = g.inv(lonlat1[0], lonlat1[1], lonlat2[0], lonlat2[1])

/usr/lib/python2.7/dist-packages/pyproj/__init__.pyc in inv(self, lons1, lats1, lons2, lats2, radians)
    558         ind, disfloat, dislist, distuple = _copytobuffer(lats2)
    559         # call geod_inv function. inputs modified in place.
--> 560         _Geod._inv(self, inx, iny, inz, ind, radians=radians)
    561         # if inputs were html" target="_blank">lists, tuples or floats, convert back.
    562         outx = _convertback(xisfloat,xislist,xistuple,inx)

_geod.pyx in _geod.Geod._inv (_geod.c:1883)()

ValueError: undefined inverse geodesic (may be an antipodal point)

此错误消息从何而来?


问题答案:

这两点仅相距几厘米。看起来pyproj/Geod不能很好地解决彼此靠近的点。这有点奇怪,因为在这样的距离下简单的​​平面几何体已经足够了。同样,该错误消息也有点可疑,因为这表明这两点是对立的,即在直径上是相反的,显然不是这种情况!OTOH,也许它所提到的对立点是在计算中以某种方式出现的中间点…不过,我还是会犹豫使用这种行为的库。

鉴于此缺陷,我怀疑pyproj还有其他缺陷。特别是,它可能会使用旧的Vincenty公式进行椭球测地线计算,众所周知,当处理近对映点时该算法不稳定,并且在大距离上并非特别精确。我建议使用CFF
Karney的现代算法。

Karney博士是一个主要贡献者上测地线的维基百科文章,特别是对一个椭球大地测量,他的geographiclib可PyPI上,这样你就可以很容易地使用安装它pip。请参阅他的SourceForge网站以获取更多信息以及其他语言的geolib绑定。

FWIW,这是一个使用geoliblib计算问题距离的简短演示。

from geographiclib.geodesic import Geodesic

Geo = Geodesic.WGS84

lat1, lon1 = -7.313341167341917, 10.65583081724002
lat2, lon2 = -7.313340663909912, 10.655830383300781

d = Geo.Inverse(lat1, lon1,  lat2, lon2)
print(d['s12'])

输出

0.07345528623159624

该数字以米为单位,因此这两点相距73毫米多一点。

如果您希望看到geoliblib用于解决复杂的测地线问题,请参阅我去年在gist上使用Python
2/3源代码编写的math.stackexchange答案。

希望这不再是问题,因为pyproj现在使用来自geoliblib的代码。



 类似资料:
  • 我试图通过反应路由器将道具从一个组件传递到另一个组件。当我试图从子组件获取道具时,我得到了这样一条消息。这是我的代码: Tracks.jsx: app.jsx: Album.jsx:

  • 问题内容: React 在promise中没有定义。这是我的代码: 这是错误代码: 问题答案: 可能没有约束力。 如果您可以使用ES6语法,请尝试用箭头函数替换。它会自动绑定: 或手动绑定:

  • 我必须发布{输入}数据以http://localhost:4000/predictionAxios。但是{输入}变为未定义。 我使用const而不是类Main扩展组件. onChange,它设置表单数据。 阿希奥斯邮报。 返回(表单)时带有onSubmit、onChange。

  • 问题内容: 注意:根据 ECMAScript5.1,第15.1.1.3节,window.undefined是只读的。 现代浏览器正确地实现了这一点。 例如:Safari 5.1,Firefox 7,Chrome 20等。 Undefined仍可在以下位置更改:Chrome 14,… 原来,问题的原因是 如果“对象”中没有属性“ x”,则返回false。 我通过在两个Facebook函数中用规则相等

  • 我有一个Spring项目,我尝试添加一个自定义反序列化器来反序列化日期属性,具体取决于它们的格式。如果我将其用作Date属性的注释,则效果很好。但是,如果我将反序列化器添加到对象映射器中,当Jackson反序列化日期时,它不会调用。 我尝试这样应用我的自定义反序列化程序: 我不想每次都对Date属性应用注释,我想默认使用此反序列化器。我做错了什么?

  • 构建一个小的react应用程序,将地理位置(由浏览器确定为道具)传递给子组件。 第一个组件:app.jsx 该组件确定位置,保存要声明的纬度和经度,并通过props将该信息传递给Weather.jsx组件,该组件正在工作,如下图所示: 在Weather.jsx组件中,我尝试访问这些道具,得到未定义的或空的对象。 真的不知道问题是什么,因为react dev tools显示weather组件确实在传