OSMdroid:如何最好地实现偏移地图中心

时间:2017-05-20 12:06:47

标签: android osmdroid

我的Android应用程序有两种风格,一种用于Google Play Store,一种用于谷歌地图(v2),另一种用于Amazon App Store,利用了osmdroid的开源优势。感谢您继续使用该库,我刚刚从更早的版本更新到v5.6.4,很高兴看到已经取得的进展。

我的问题

我在过去的一年半里一直采用Material设计,最近在设置'spot'(我的应用程序中的主要模型)时转移到了卡片界面。该卡覆盖了手机外形尺寸的一半 - 请参见屏幕截图:

移动地图时......

osmdroid-question-moving

当地图停止时......

osmdroid-question

请注意,当信用卡动画覆盖地图的一部分时,来自osmdroid认为是中心的折线顶点与用户的中心之间的差异

请注意,地图中心(地图停止时由白色位置图标表示)不在中心,而是向上移动了卡片和填充的高度。在Google地图(v2)中,可以使用setPadding(left, top, right, bottom)来实现此行为。如何在osmdroid中实现类似的效果?

我尝试了什么

到目前为止,我已采用覆盖getCenter()的方法,其代码类似于;

 /**
   * @see com.brantapps.polaris.api.Mappable#getCenter()
   */
  @Override
  public GeoPoint getCenter() {
    // Where is the current centre
    final IGeoPoint center = mapView.getMapCenter();

    // Calculate the top-left and bottom-right positions
    IGeoPoint tl = mapView.getProjection().fromPixels(0, 0);
    IGeoPoint br = mapView.getProjection().fromPixels(mapView.getWidth(), mapView.getHeight());

    // reset the centre with the px per degree calc.
    double newLon = leftPxOffset * (br.getLongitude() - tl.getLongitude()) / mapView.getWidth() + center.getLongitude();
    double newLat = bottomPxOffset * (br.getLatitude() - tl.getLatitude()) / mapView.getHeight() + center.getLatitude();

    return GeoPointHelper.fromIGeoPointToPolarisGeoPoint(new org.osmdroid.util.GeoPoint(newLat, newLon));
  }

...其中leftPxOffsetbottomPxOffset代表向上移动,略微向右移动(右侧是Google徽标和我的地图抽象库的副作用)。< / p>

它有点有用,但不是很好。社区有更好的主意吗?我是否遗漏了SDK中负责这些计算的内容?

1 个答案:

答案 0 :(得分:0)

好的,所以我有一个看起来像这样的工作实现;

private GeoPoint adjustCentreByPadding(final double latitude, final double longitude, boolean negate) {
    final int newY = negate ? (int) (mapView.getHeight()/2-bottomPxOffset) : (int) (mapView.getHeight()/2+bottomPxOffset);
    mapView.getController().setCenter(new org.osmdroid.util.GeoPoint(latitude, longitude));
    final IGeoPoint offset = mapView.getProjection().fromPixels(mapView.getWidth()/2, newY);
    return KindleGeoPointHelper.fromIGeoPointToRoverGeoPoint(offset);
  }

Snippet 1 :对padding方法的新调整

我不是百分之百关于为什么它现在正在工作,但基本上,我从我的getCenter()setCenter(...)覆盖中分别调用这个方法,它们分别是这样的;

  /**
   * @see com.brantapps.polaris.api.Mappable#getCenter()
   */
  @Override
  public GeoPoint getCenter() {
    return adjustCentreByPadding(mapView.getMapCenter().getLatitude(), mapView.getMapCenter().getLongitude(), true);
  }

Snippet 2 :getCenter()实现

  /**
   * @see com.brantapps.polaris.api.Mappable#setCenter(GeoPoint)
   */
  @Override
  public void setCenter(final GeoPoint geoPoint) {
    final GeoPoint adjustedCenter = adjustCentreByPadding(geoPoint.getLatitude(), geoPoint.getLongitude(), false);
    mapView.getController().setCenter(new org.osmdroid.util.GeoPoint(adjustedCenter.getLatitude(), adjustedCenter.getLongitude()));
  }

Snippet 3 :setCenter(...)实现

注意“否定”一词,这是我需要弄清楚的一点。正如我观察到的那样,当由于卡片覆盖(即setCenter(...)覆盖)而将地图“向上”移动时,我将像素添加到高度投影中。当我随后调用getCenter()时,我从高度投影中减去像素。

KindleGeoPointHelper类是我在Google和OSMDroid上放置的 Polaris 抽象库的工件,可以忽略。