【问题标题】:Placing shape into MapView in Android在 Android 中将形状放入 MapView
【发布时间】:2011-09-15 22:42:36
【问题描述】:

有没有办法在 MapView (纬度/经度区域)而不是像素区域中放置占据特定区域的形状(可绘制或任何类型的形状)。我需要它用于 GeoPoint 聚类目的

如果这是不可能的,任何关于投影坐标的指导将不胜感激。但是使用 MapView 画布来执行此操作似乎并不明智,因为我一直在回收我的叠加项目,我希望我也能利用这一点。

【问题讨论】:

标签: android maps overlay android-mapview


【解决方案1】:

ItemizedOverlay

我正在从我的代码中剔除,所以这可能不会'开箱即用编译,但应该足以让你从这里弄清楚......

扩展类:

    public class MyOverlay extends ItemizedOverlay<OverlayItem>
    {
    private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
    private Context mContext;
    private OverlayItem item;

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

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

    }

    public void doPopulate()
    {
         populate();
    }




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

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

然后在你的活动中......

public void addLocations(GeoPoint _center)
{  
    final GeoPoint center = _center;

    mapOverlays = mapView.getOverlays();

    Drawable drawable = MyActivity.this.getResources().getDrawable(R.drawable.map_annotation_pin);

    itemizedoverlay = new ScoopOverlay(drawable,mContext);

//add as many points as you wish...
itemizedoverlay.addOverlay(
                    new OverlayItem(new GeoPoint(/*lon lat data here*/));
                );



showResults.sendEmptyMessage(0);
}

private Handler showResults = new Handler() 
{ 
    @Override 
    public void handleMessage(Message msg) 
    { 
        itemizedoverlay.doPopulate();
        mapOverlays.add(itemizedoverlay);

        mapView.invalidate();
    }
}; 

【讨论】:

  • 谢谢。是的,这是真的,但是如果我想要一个特定的可绘制对象发生怎么办,例如。欧洲和另一个只是一个城镇。不能有那么多drawables可供选择。我想我是通过在 ItemizedOverlay 上绘制来弄清楚的。(这样我就可以控制可绘制运行时的大小。)
  • 我不确定你的意思,但你可以看到我在哪里设置了可绘制对象,你可以设置任何你想要的可绘制对象......也许我不明白这个问题。根据您所在的缩放级别,您可以设置不同的图像。我不确定如何控制它在地图上占用的空间,如果这是您想要完成的。
  • 为您的帖子提供帮助。对我没有帮助,但我希望对其他人有用。我找到了解决方案,稍后我将发布代码。覆盖OverLay项的draw()函数就是解决方案
【解决方案2】:

所以解决方案是绘制到保存项目的 ItemizedOverlay。

@Override
    public void draw(Canvas canvas, MapView mapView, boolean shadow) {
        super.draw(canvas, mapView, shadow);

        // cycle through all overlays
        for (int index = 0; index < mOverlays.size(); index++) {
            OverlayItemExtended item = mOverlays.get(index);

            // Converts lat/lng-Point to coordinates on the screen
            GeoPoint point = item.getPoint();
            Point ptScreenCoord = new Point();
            mapView.getProjection().toPixels(point, ptScreenCoord);



                Paint boxPaint = new Paint();
                boxPaint.setColor(android.graphics.Color.WHITE);
                boxPaint.setStyle(Paint.Style.FILL);
                boxPaint.setAlpha(140);
                canvas.drawCircle(ptScreenCoord.X, ptScreenCoord.y,
                        20, boxPaint);


        }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 2021-07-26
    • 1970-01-01
    相关资源
    最近更新 更多