是否可以在osmdroid中将可见区域设置为MapView?

时间:2015-06-16 15:34:04

标签: android osmdroid

我有顶部和底部覆盖MapView的半透明片段。因此,地图应该在片段下方可见,但是为了使项目居中,它应该忽略片段覆盖它的部分。

在GoogleMaps SDK中,它通过setPadding方法完成,描述如下:

  

在地图上设置填充。

     

此方法允许您在地图上定义可见区域,通过在地图的四个边缘中的每一个上设置填充来向地图发信号通知边缘周围的地图部分可能被遮挡。地图功能将适应填充。例如,缩放控件,指南针,版权声明和Google徽标将移动到适合定义区域内,相机移动将相对于可见区域的中心等。

如何用osmdroid完成这样的事情?

是否存在类似的方法?或者我需要自己实施吗?如果是的话,有人能指出我现有的例子吗?

2 个答案:

答案 0 :(得分:0)

好的,所以我有一个实施工作@Sven。

我有一个位于地图中心的图钉(正如您的问题描述的那样)由于重叠片段而产生偏移 - 请参阅图1 ;

enter image description here

针脚掉落'当地图停下来时(如果您感兴趣,请使用org.osmdroid.events.DelayedMapListener),但要排列地图中心' (在用户看到的情况下)我已经覆盖了MapView#getCenter()调用的setPadding(...)调用,并使用了旧的Google Maps V1技巧作为described here来获取"左上角和右下角[你]除以屏幕尺寸,以获得每像素的值。"

不像API {{1}}那样性感,但效果也一样。

答案 1 :(得分:0)

我创建了Kotlin扩展功能,该功能可根据定义的填充调整BoundingBox

该函数使用初始边界框创建投影,并通过每经纬度/经度像素值调整边缘。

您可以结合使用zoomToBoundingBox

mapView.zoomToBoundingBox(boundingBox.withOffset(mapView, top, bottom, left, right), false)

功能:

fun BoundingBox.withOffset(
    mapView: MapView,
    @DimenRes top: Int,
    @DimenRes bottom: Int,
    @DimenRes left: Int,
    @DimenRes right: Int
): BoundingBox {
    val topPx = mapView.context.resources.getDimensionPixelSize(top)
    val bottomPx = mapView.context.resources.getDimensionPixelSize(bottom)
    val leftPx = mapView.context.resources.getDimensionPixelSize(left)
    val rightPx = mapView.context.resources.getDimensionPixelSize(right)

    val width = mapView.width
    val height = mapView.height

    val nextZoom = MapView.getTileSystem().getBoundingBoxZoom(
        this,
        width - (leftPx + rightPx),
        height - (topPx + bottomPx)
    )
    val projection = Projection(
        nextZoom, width, height,
        centerWithDateLine,
        mapView.mapOrientation,
        mapView.isHorizontalMapRepetitionEnabled, mapView.isVerticalMapRepetitionEnabled,
        mapView.mapCenterOffsetX, mapView.mapCenterOffsetY
    )

    val northWest = projection.fromPixels(0, 0)
    val southEast = projection.fromPixels(width, height)

    val lonPerPx = (southEast.longitude - northWest.longitude) / width
    val latPerPx = (southEast.latitude - northWest.latitude) / height

    return BoundingBox(
        latNorth - topPx * latPerPx,
        lonEast + rightPx * lonPerPx,
        latSouth + bottomPx * latPerPx,
        lonWest - leftPx * lonPerPx
    )
}