banner
jzman

jzman

Coding、思考、自觉。
github

天地图にオーバーレイを追加する

最近多少还是会有一点焦虑,其实很大一部分原因是考虑的比较多罢了,适当的放弃一些东西,一切就会变的明朗起来。

接着上一篇继续来学习天地图 Android SDK ,地图开发中除了常见的定位需求,还有就是覆盖物的添加,比如最近的项目是有关风险管控的,在地图上就要显示对应的风险点,下面的今天的内容:

  1. 単一のオーバーレイ
  2. 複数のオーバーレイ
  3. 集合オーバーレイ
  4. テキストオーバーレイ
  5. まとめ
  6. テスト効果

単一のオーバーレイ#

ここでは単一のオーバーレイの追加にリソースフォルダ内の画像を具体的なオーバーレイとして使用します。以下はカスタムの Overlay です。具体的には次の通りです:

/**
 * Powered by jzman.
 * Created on 2018/6/25 0025.
 */
public class MOverlay extends Overlay{
    private Drawable mDrawable;
    private DrawableOption mDrawableOption;
    private GeoPoint mGeoPoint;

    public MOverlay(Context context) {
        mDrawable = context.getResources().getDrawable(R.drawable.selected_marker);
        mDrawableOption = new DrawableOption();
        //アンカー位置を設定
        mDrawableOption.setAnchor(0.5f,1.0f);
        //回転角度を設定
        mDrawableOption.setRotate(0);
        //状態を設定
        mDrawableOption.setState(DrawableOption.STATE_NORMAL);
        //何フレームごとに画像リソースを更新するかを設定
        mDrawableOption.setPeriod(200);
    }

    @Override
    public boolean draw(GL10 gl, MapView mapView, boolean shadow, long when) {
        MapViewRender render = mapView.getMapViewRender();
        render.drawDrawable(gl,mDrawableOption,mDrawable,mGeoPoint);
        return true;
    }

    @Override
    public boolean onTap(GeoPoint p, MapView mapView) {
        //現在のクリック位置にオーバーレイを追加することを指定、または自分で指定することも可能
        mGeoPoint = p;
        return true;
    }
}

次に、この Overlay を MapView に追加します。具体的には次の通りです:


mapView.addOverlay(new MOverlay(this));

これで、単一のオーバーレイの追加が完了しました。

複数のオーバーレイ#

開発中に地図上に関連するデータの位置をマークする必要があることがよくあります。この場合、地図上に複数のオーバーレイを追加する必要があります。類似のタイプのオーバーレイのグループを追加するには、抽象クラス ItemizedOverlay を使用します。以下はカスタムの複数のオーバーレイの Overlay です。具体的には次の通りです:

/**
 * Powered by jzman.
 * Created on 2018/6/25 0025.
 */
public class MItemOverlay2 extends ItemizedOverlay<OverlayItem> {

    private MapView mapView;
    private View view;
    private TextView tvItemOverlay;
    private ArrayList<OverlayItem> items;
    private ArrayList<DefaultGeoPoint<MarkerBean>> points;

    public MItemOverlay2(Drawable defaultMarker, ArrayList<DefaultGeoPoint<MarkerBean>> geoPoints, MapView mapView, View view) {
        super(defaultMarker);
        this.mapView = mapView;
        this.view = view;
        tvItemOverlay = view.findViewById(R.id.tvItemOverlayData);
        items = new ArrayList<>();
        points = geoPoints;
        for (int i = 0; i < points.size(); i++) {
            OverlayItem overlayItem = new OverlayItem(points.get(i),
                    points.get(i).getT().getTitle(),
                    points.get(i).getT().getSnippet());
            overlayItem.setMarker(defaultMarker);
            items.add(overlayItem);
        }
        populate();
    }

    /**
     * オーバーレイ項目の総数
     * @return
     */
    @Override
    public int size() {
        return items.size();
    }

    /**
     * オーバーレイ項目を作成
     * @param i
     * @return
     */
    @Override
    protected OverlayItem createItem(int i) {
        return items.get(i);
    }

    /**
     * クリックイベントを処理
     * @param index
     * @return
     */
    @Override
    protected boolean onTap(int index) {
        if (index == -1) return false;
        mapView.updateViewLayout(view, new MapView.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT,
                points.get(index),
                MapView.LayoutParams.BOTTOM_CENTER));
        tvItemOverlay.setText(points.get(index).getT().getTitle());
        view.setVisibility(View.VISIBLE);
        return true;
    }
}

各オーバーレイをクリックしたときに表示される View は、MapView に追加されている必要があります。具体的には次の通りです:

mapView.addView(view, new MapView.LayoutParams(
        ViewGroup.LayoutParams.WRAP_CONTENT,
        ViewGroup.LayoutParams.WRAP_CONTENT,
        null,
        MapView.LayoutParams.TOP_LEFT));

追加されていない場合はエラーが発生します。エラーメッセージは次の通りです:

>  java.lang.IllegalArgumentException: Given view not a child of com.tianditu.android.maps.MapView{ac3dbd7 V.E...... ........ 0,192-1080,1692 #7f070050 app:id/mapView}

次に、この Overlay を MapView に追加します。具体的には次の通りです:

Drawable drawable1 = getResources().getDrawable(R.drawable.selected_marker);
MItemOverlay2 mItemOverlay2 = new MItemOverlay2(drawable1, markers, mapView, view);
mapView.getOverlays().add(mItemOverlay2);

これで、複数のオーバーレイの追加が完了しました。

幾何オーバーレイ#

集合オーバーレイは主に幾何学的な形状を使用して関連する位置点をマークします。以下は、地図の位置をクリックして幾何オーバーレイを追加するカスタム Overlay です。効果は文末のテスト効果図を参照してください。具体的には次の通りです:

/**
 * Powered by jzman.
 * Created on 2018/6/25 0025.
 */
public class GeometricOverlay extends Overlay{
    private CircleArcOption mCircleArcOption;
    private GeoPoint mGeoPoint;

    public GeometricOverlay() {
        mCircleArcOption = new CircleArcOption();
        //オーバーレイが破線かどうかを設定
        mCircleArcOption.setDottedLine(true);
        //塗りつぶし色を設定
        mCircleArcOption.setFillColor(Color.GRAY);
        //境界線の色を設定
        mCircleArcOption.setStrokeColor(Color.BLACK);
        //境界線の幅を設定
        mCircleArcOption.setStrokeWidth(5);
        //中心点を使用するかどうか、trueに設定すると扇形が描画され、逆にすると円弧が描画される
        mCircleArcOption.setUseCenter(true);
        //開始角度とスキャン角度を設定
        mCircleArcOption.setAngle(0,100);
    }

    @Override
    public boolean draw(GL10 gl, MapView mapView, boolean shadow, long when) {
        MapViewRender render = mapView.getMapViewRender();
        render.drawCircleArc(gl,mCircleArcOption,mGeoPoint,1000);
        return true;
    }

    @Override
    public boolean onTap(GeoPoint p, MapView mapView) {
        //現在のクリック位置にオーバーレイを追加することを指定、または自分で指定することも可能
        mGeoPoint = p;
        return true;
    }
}

次に、この Overlay を MapView に追加します。具体的には次の通りです:

mapView.addOverlay(new GeometricOverlay());

これで、複数のオーバーレイの追加が完了しました。

テキストオーバーレイ#

テキストオーバーレイは、対応する位置点にテキストを追加するものです。以下は、地図の位置をクリックしてテキストオーバーレイを追加するカスタム Overlay です。効果は文末のテスト効果図を参照してください。具体的には次の通りです:

/**
 * Powered by jzman.
 * Created on 2018/6/25 0025.
 */
public class TextOverlay extends Overlay{
    private FontOption mFontOption;
    private GeoPoint mGeoPoint;

    public TextOverlay(Context context) {
        mFontOption = new FontOption();
        //塗りつぶし色を設定
        mFontOption.setFillColor(Color.RED);
        //フォントの色、フォントサイズを設定
        mFontOption.setFontColor(Color.BLACK);
        mFontOption.setFontSize(60);
        //テキストの境界線の幅、境界線の色を設定
        mFontOption.setStrokeWidth(4);
        mFontOption.setStrokeColor(Color.GRAY);
        //テキストの回転角度を設定
        mFontOption.setTextRotate(60);
        //フォントを設定
        Typeface typeface = Typeface.createFromAsset(context.getAssets(), "font/font.ttf");
        mFontOption.setFontTypeface(typeface);
    }

    @Override
    public boolean draw(GL10 gl, MapView mapView, boolean shadow, long when) {
        MapViewRender render = mapView.getMapViewRender();
        if (mGeoPoint!=null){
            render.drawText(gl,mFontOption,"これはテキストオーバーレイです",mGeoPoint);
        }
        return true;
    }

    @Override
    public boolean onTap(GeoPoint p, MapView mapView) {
        //現在のクリック位置にオーバーレイを追加することを指定、または自分で指定することも可能
        mGeoPoint = p;
        return true;
    }
}

次に、この Overlay を MapView に追加します。具体的には次の通りです:

mapView.addOverlay(new TextOverlay(this));

これで、複数のオーバーレイの追加が完了しました。

まとめ#

以上のように、天地图を使用してオーバーレイを追加する一般的な手順は次の通りです:

  1. 具体的なオーバーレイの Overlay を作成
  2. オーバーレイの具体的なパラメータを初期化
  3. draw () メソッドをオーバーライド
  4. この Overlay を MapView に追加

テスト効果#

image

天地图にオーバーレイを追加することはこれで終了です。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。