天天看点

osmdroid API解读(十二)osmdroid API解读(十二)

osmdroid API解读(十二)

osmdroid-android org.osmdroid.views.overlay.simplefastpoint包

本包的目的在于方便的添加一系列的点在Overlay上。

1. LabelledGeoPoint

带有标签的地理点,在GeoPoint的基础上添加了mLabel属性。

public class LabelledGeoPoint extends GeoPoint {
    private String mLabel;
    ...

}
           

2. SimplePointTheme

一个管理多个IGeoPoint的类,内置一个List来管理这些点。你可以添加带标签或不带标签两种类型的GeoPoints。此类实现了SimpleFastPointOverlay.PointAdapter,方便在SimpleFastPointOverlay中管理这些点

/**
 * This class is just a simple wrapper for a List of {@link IGeoPoint}s to be used in
 * {@link SimpleFastPointOverlay}. Can be used for unlabelled or labelled GeoPoints. Be sure to set
 * the labelled parameter of the constructor to match the kind of points.
 * More complex cases should implement {@link SimpleFastPointOverlay.PointAdapter}, not extend this
 * one.
 * Created by Miguel Porto on 26-10-2016.
 */

public final class SimplePointTheme implements SimpleFastPointOverlay.PointAdapter {
    private final List<IGeoPoint> mPoints;
    private boolean mLabelled;

    public SimplePointTheme(List<IGeoPoint> pPoints, boolean labelled) {
        mPoints = pPoints;
        mLabelled = labelled;
    }

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

    @Override
    public IGeoPoint get(int i) {
        return mPoints.get(i);
    }

    @Override
    public boolean isLabelled() {
        return mLabelled;
    }

    /**
     * NOTE: this iterator will be called very frequently, avoid complicated code.
     * @return
     */
    @Override
    public Iterator<IGeoPoint> iterator() {
        return mPoints.iterator();
    }

}
           

3. SimpleFastPointOverlayOptions

用于绘制点的工具。

public class SimpleFastPointOverlayOptions {
    public enum RenderingAlgorithm {NO_OPTIMIZATION, MEDIUM_OPTIMIZATION, MAXIMUM_OPTIMIZATION}//绘制算法
    public enum Shape {CIRCLE, SQUARE}//绘制形状
    public enum LabelPolicy {ZOOM_THRESHOLD, DENSITY_THRESHOLD}
    protected Paint mPointStyle;//点的画笔工具
    protected Paint mSelectedPointStyle;//被选择点的画笔工具
    protected Paint mTextStyle;//标注字的风格
    protected float mCircleRadius = 5;//点圆角大小
    protected float mSelectedCircleRadius = 13;//被选择点的圆角大小
    protected boolean mClickable = true;//可点击性
    protected int mCellSize = 10;   //格网尺寸
    protected RenderingAlgorithm mAlgorithm = RenderingAlgorithm.MAXIMUM_OPTIMIZATION;//绘制算法
    protected Shape mSymbol = Shape.CIRCLE;//点的形状
    protected LabelPolicy mLabelPolicy = LabelPolicy.ZOOM_THRESHOLD;
    protected int mMaxNShownLabels = 250;
    protected int mMinZoomShowLabels = 11;

    public SimpleFastPointOverlayOptions() {
        mPointStyle = new Paint();
        mPointStyle.setStyle(Paint.Style.FILL);
        mPointStyle.setColor(Color.parseColor("#ff7700"));

        mSelectedPointStyle = new Paint();
        mSelectedPointStyle.setStrokeWidth(5);
        mSelectedPointStyle.setStyle(Paint.Style.STROKE);
        mSelectedPointStyle.setColor(Color.parseColor("#ffff00"));

        mTextStyle = new Paint();
        mTextStyle.setStyle(Paint.Style.FILL);
        mTextStyle.setColor(Color.parseColor("#ffff00"));
        mTextStyle.setTextAlign(Paint.Align.CENTER);
        mTextStyle.setTextSize(24);
    }

    //获取默认的点图层SimpleFastPointOverlayOptions
    public static SimpleFastPointOverlayOptions getDefaultStyle() {
        return new SimpleFastPointOverlayOptions();
    }

    //设置点的风格
    public SimpleFastPointOverlayOptions setPointStyle(Paint style) {
        mPointStyle = style;
        return this;
    }

    //设置被选择点的风格
    public SimpleFastPointOverlayOptions setSelectedPointStyle(Paint style) {
        mSelectedPointStyle = style;
        return this;
    }

    //设置圆角
    public SimpleFastPointOverlayOptions setRadius(float radius) {
        mCircleRadius = radius;
        return this;
    }

    //设置被选择点的圆角
    public SimpleFastPointOverlayOptions setSelectedRadius(float radius) {
        mSelectedCircleRadius = radius;
        return this;
    }

    //设置可点击性
    public SimpleFastPointOverlayOptions setIsClickable(boolean clickable) {
        mClickable = clickable;
        return this;
    }

    public SimpleFastPointOverlayOptions setCellSize(int cellSize) {
        mCellSize = cellSize;
        return this;
    }

    public SimpleFastPointOverlayOptions setAlgorithm(RenderingAlgorithm algorithm) {
        mAlgorithm = algorithm;
        return this;
    }

    public SimpleFastPointOverlayOptions setSymbol(Shape symbol) {
        mSymbol = symbol;
        return this;
    }

    public SimpleFastPointOverlayOptions setTextStyle(Paint textStyle) {
        mTextStyle = textStyle;
        return this;
    }

    public SimpleFastPointOverlayOptions setMinZoomShowLabels(int minZoomShowLabels) {
        mMinZoomShowLabels = minZoomShowLabels;
        return this;
    }

    public SimpleFastPointOverlayOptions setMaxNShownLabels(int maxNShownLabels) {
        mMaxNShownLabels = maxNShownLabels;
        return this;
    }

    public SimpleFastPointOverlayOptions setLabelPolicy(LabelPolicy labelPolicy) {
        mLabelPolicy = labelPolicy;
        return this;
    }
}
           

4. SimpleFastPointOverlay

一个绘制简单可点击点的Overlay,优化了加载速度。能够很容易的加载10万个点。不支持每个点的个性化,每个点的风格是一致的。不支持地图旋转时的情况。

public class SimpleFastPointOverlay extends Overlay {
    private final SimpleFastPointOverlayOptions mStyle;
    private final PointAdapter mPointList;
    private final BoundingBox mBoundingBox;
    private Integer mSelectedPoint;
    private OnClickListener clickListener;
    private LabelledPoint grid[][];
    private boolean gridBool[][];
    private int gridWid, gridHei, viewWid, viewHei;
    private float startX, startY, curX, curY, offsetX, offsetY;
    private int prevNumPointers, numLabels;
    private BoundingBox prevBoundingBox = new BoundingBox(0, 0, 0, 0);

    ...
}