对于具有 3D 投影的某些缩放级别,NMAMapView 上的 boundingBox 不正确

Posted

技术标签:

【中文标题】对于具有 3D 投影的某些缩放级别,NMAMapView 上的 boundingBox 不正确【英文标题】:Incorrect boundingBox on NMAMapView for certain zoom levels with 3D projection 【发布时间】:2020-01-07 08:26:09 【问题描述】:

如果我将NMAMapView 完全缩小以便您可以看到地球仪 (NMAMapViewMinimumZoomLevel),则调用NMAMapViews boundingBox 属性确实会返回所有顶部* / 底部* 属性的以下坐标:

po self.hereMapView.boundingBox?.topRight
▿ Optional<NMAGeoCoordinates>
  - some : <NMAGeoCoordinates: 0x2828bde00; latitude = -90.000000; longitude = 0.000000; altitude = -340282346638528859811704183484516925440.000000>

self.hereMapView.boundingBox?.topLeft
▿ Optional<NMAGeoCoordinates>
  - some : <NMAGeoCoordinates: 0x2828bca20; latitude = -90.000000; longitude = 0.000000; altitude = -340282346638528859811704183484516925440.000000>

// ...

上面的某些缩放级别也是如此。这对我来说似乎不正确,这是 Here SDK 中的错误吗?

编辑:这似乎只是 3D 投影的问题,在最低缩放级别的 2D 投影中,我们确实得到了有效坐标

【问题讨论】:

您使用的是哪个版本的 HERE 移动 SDK? 这里是 HEREMaps 3.11.2 您是否可以使用最新版本 3.14 来测试同样的问题是否仍然存在?您可以从 developer.here.com 上的帐户下载它 由于我们的部署目标,我只能升级到 3.13.3,不幸的是问题仍然存在 感谢您的信息。我们正在对此进行调查,并会尽快回复您。 【参考方案1】:

在问题中的更新(2D 投影中的有效边界框)和来自@dashchak 的 cmets 之后,这是预期的行为,边界框是一个矩形,其上限为与矩形边界不同的值。

来自Documentation:

地图的boundingBox是最小的NMAGeoBoundingBox 其中包含当前在屏幕上可见的所有地图区域。如果 地图在 2D 视图中(零倾斜),boundingBox 应该(几乎) 正好与屏幕矩形的边界重合。如果地图在 3D视图,可视屏幕区域是地理空间中的梯形 (屏幕顶部的可视区域比底部宽 由于透视)。因此,边界框将包含一些区域 在这种情况下,它实际上在屏幕上不可见。

【讨论】:

我同意文档。 “如果地图是 3D 视图,则可视屏幕区域在地理空间中是一个梯形(由于透视关系,屏幕顶部的可视区域比底部宽)。因此,在这种情况下,边界框将包含一些在屏幕上实际上不可见的区域。”然而,当整个地球都在视野中时,我得到的是一个边界框,每个角都有 4 个坐标 (-90, 0)。所以这意味着可见边界框的宽度和高度为 0。你能向我解释一下这是如何正确的行为吗? 这里不要刻薄,感谢您的回复。 一般来说,边界框旨在与墨卡托投影一起使用,以在完全缩小并显示地球的整个球形/椭圆体形状时将地球的球形/椭圆形近似为二维矩形,这种近似没有多大意义,因此坐标被限制为默认值。您可以尝试在 NMAMapView 中切换到墨卡托投影(NMAProjectionTypeMercator),以检查行为是否符合您的预期。 在 3.15 SDK 中,如果任何屏幕角不能投影到地图视图上,边界框将为零。

以上是关于对于具有 3D 投影的某些缩放级别,NMAMapView 上的 boundingBox 不正确的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL投影缩放

如何在 mapbox-gl-js 中以某些缩放级别隐藏点标签?

OpenGL 3+,具有定向光的正交投影

D3.js 世界地图(一)投影方式

自动缩放到当前位置不适用于特定区域

投影3D网格的2D轮廓算法