【问题标题】:Android HelloGoogleMaps to OSMdroid (Open Street Maps)Android HelloGoogleMaps 到 OSMdroid(打开街道地图)
【发布时间】:2012-10-11 14:04:06
【问题描述】:

我正在尝试在 Open Street Maps 中重现一个正常工作的 HelloGoogleMaps 应用程序 - 但我无法在 OSMdroid 中包含逐项叠加。

我查看了几个资源,但我不知道如何修复 OsmItemizedOverlay 上的错误 - 我想我错误地构造了 OsmItemizedOverlay 或者与 OsmItemizedOverlay 和 ItemizedOverlay 混淆了?但我试图改变的一切都引发了更多的错误...... “隐式超级构造函数 ItemizedOverlay() 未定义。必须显式调用另一个构造函数” “无法从 OverlayItem 类型中对非静态方法 setMarker(Drawable) 进行静态引用”-我希望有人能帮我弄清楚类定义吗?

非常感谢!

package com.example.osmdroiddemomap;

import java.util.ArrayList;

import android.app.AlertDialog;
import android.content.Context;
import android.graphics.Point;
import android.graphics.drawable.Drawable;

import org.osmdroid.api.IMapView;
import org.osmdroid.views.*;
import org.osmdroid.views.overlay.*;
import org.osmdroid.views.overlay.OverlayItem.HotspotPlace;

public class OsmItemizedOverlay extends ItemizedOverlay<OverlayItem> {

    Context mContext;


    private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();

        //ERRORS are raised by the following 3 lines:
    public OsmItemizedOverlay(Drawable defaultMarker, Context context) {
            OverlayItem.setMarker(defaultMarker);
            OverlayItem.setMarkerHotspot(HotspotPlace.CENTER);

          mContext = context; 
            }

public void addOverlay(OverlayItem overlay) {
    mOverlays.add(overlay);
    populate();
}

@Override
protected OverlayItem createItem(int i) {
  return mOverlays.get(i);
}

@Override
public int size() {
  return mOverlays.size();
}


  protected boolean onTap(int index) {
  OverlayItem item = mOverlays.get(index);
  AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
  dialog.setTitle(item.getTitle());
  dialog.setMessage(item.getSnippet());
  dialog.show();
  return true;
}

@Override
public boolean onSnapToItem(int arg0, int arg1, Point arg2, IMapView arg3) {
    // TODO Auto-generated method stub
    return false;
}
}

【问题讨论】:

    标签: android openstreetmap itemizedoverlay osmdroid


    【解决方案1】:

    尝试像这样改变你的构造函数

    public OsmItemizedOverlay(Drawable defaultMarker, Context context) {
            super(boundCenterBottom(defaultMarker));
            mContext = context;
        }
    

    【讨论】:

    • 这是我在 Google Maps Example 中使用的构造函数,但在 OSMdroid 中未定义方法 boundCenterBottom ......这就是为什么我遵循这样的线程 stackoverflow.com/questions/9667208
    【解决方案2】:

    我从未使用过 osmdroid,但查看 here 中的文档,它显示 setMarkerHotspot() 作为 OverlayItem 的方法,enter link description here 中的文档说默认标记始终是底部中心对齐。

    所以要解决这个问题,您需要为添加的每个叠加项目分配一个标记,并将setMarkerHotspot() 设置为居中。

    这样的事情应该可以解决问题:

    Context mContext; 
    Drawable mDefaultMarker;
    
    public OsmItemizedOverlay(Drawable defaultMarker, Context context) { 
          mContext = context;  
          mDefaultMarker = defaultMarker;  
    } 
    
    public void addOverlay(OverlayItem overlay) {
        overlay.setMarkerHotspot(HotspotPlace.CENTER);
        mOverlays.add(overlay);   
        populate();   
    }  
    

    祝你好运。

    【讨论】:

      【解决方案3】:

      只需将您的 addItem 函数更改为:

      public void addItem(OverlayItem item) {
          item.setMarkerHotspot(HotspotPlace.CENTER);
          mOverlay.addItem(item);
      }
      

      【讨论】:

        【解决方案4】:
        use following constructor:
        
          public OsmItemizedOverlay(Drawable defaultMarker, Context context) {
                    super(defaultMarker,context);
                    mContext = context;
                }
        
        public void addOverlay(OverlayItem overlay) {
            mOverlays.add(overlay);
            populate();
        }
        

        【讨论】:

          猜你喜欢
          • 2014-08-10
          • 1970-01-01
          • 1970-01-01
          • 2012-01-01
          • 1970-01-01
          • 2013-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多