Неизвестный маркер, появляющийся на картах osm в Android - PullRequest
0 голосов
/ 30 сентября 2018

Я создаю приложение для Android с помощью Open Street View Maps.Я использую приведенную ниже библиотеку для того же.

    implementation 'org.osmdroid:osmdroid-android:6.0.2'

Я также использую кластерный механизм для группировки маркеров в кластере.Для этого я использую приведенную ниже библиотеку бонусных пакетов.

    implementation 'com.github.MKergall:osmbonuspack:6.5.2'

Пока все отлично работает.У меня есть свой значок кластера, а также значок маркера.Ниже приведен код того же

private void populateMarkers(final List<Datum> datumList) {
    if (datumList != null) {
        CustomMarkerClusterer poiMarkers = new CustomMarkerClusterer(this);
        map.getOverlays().add(poiMarkers);
        for (int i = 0; i < datumList.size(); i++) {
            Marker marker = new Marker(map);
            marker.setPosition(new GeoPoint(Double.parseDouble(datumList.get(i).getLat()), Double.parseDouble(datumList.get(i).getLng())));
            Drawable currentDraw = ResourcesCompat.getDrawable(getResources(), R.drawable.location_marker, null);

            marker.setIcon(currentDraw);
            final int finalI = i;
            marker.setOnMarkerClickListener((marker1, mapView) -> {
                if (marker1.isInfoWindowShown()) {
                    InfoWindow.closeAllInfoWindowsOn(mapView);
                } else {
                    mapView.getController().animateTo(new GeoPoint(marker1.getPosition().getLatitude(), marker1.getPosition().getLongitude()));
                    getMarkerDetails(marker1, datumList.get(finalI).getId());

                }
                return false;
            });

            poiMarkers.add(marker);
            poiMarkers.setRadius(300);
            poiMarkers.getTextPaint().setColor(Color.BLACK);

            map.invalidate();
        }
    }

    progressDialog.dismiss();
}

. Теперь проблема в том, что когда я увеличиваю масштаб, чтобы увидеть маркер в кластере, маркер неизвестного типа появляется на карте.Под неизвестным я подразумеваю, что я не написал никакого кода для этого типа маркера, и у меня нет этого изображения значка маркера в моем проекте.

В настоящее время я не знаю, откуда появляется этот значок маркера.См. Скриншот

image

См. Значок руки зеленого цвета на скриншоте.Я спрашиваю об этом значке.Эта вещь не активна и не отображает информационное окно при щелчке, в то время как у меня открывается информационное окно при щелчке маркера.

Код класса CustomMarkerClusterer

public class CustomMarkerClusterer extends MarkerClusterer {

private int mMaxClusteringZoomLevel = 17;
private int mRadiusInPixels = 100;
private double mRadiusInMeters;
private Paint mTextPaint;
private ArrayList<Marker> mClonedMarkers;
private Context context;
private long firstClick;
private long lastClick;
private int count;
/**
 * cluster icon anchor
 */
public float mAnchorU = Marker.ANCHOR_CENTER, mAnchorV = Marker.ANCHOR_CENTER;
/**
 * anchor point to draw the number of markers inside the cluster icon
 */
public float mTextAnchorU = Marker.ANCHOR_CENTER, mTextAnchorV = Marker.ANCHOR_CENTER;

public CustomMarkerClusterer(Context ctx) {
    super();
    mTextPaint = new Paint();
    mTextPaint.setColor(Color.BLACK);
    mTextPaint.setTextSize(15 * ctx.getResources().getDisplayMetrics().density);
    mTextPaint.setFakeBoldText(true);
    mTextPaint.setTextAlign(Paint.Align.CENTER);
    mTextPaint.setAntiAlias(true);
    this.context = ctx;
    Drawable clusterIconD = ctx.getResources().getDrawable(R.drawable.cluster2);
    Bitmap clusterIcon = ((BitmapDrawable) clusterIconD).getBitmap();
    setIcon(clusterIcon);
}

/**
 * If you want to change the default text paint (color, size, font)
 */
public Paint getTextPaint() {
    return mTextPaint;
}

/**
 * Set the radius of clustering in pixels. Default is 100px.
 */
public void setRadius(int radius) {
    mRadiusInPixels = radius;
}

/**
 * Set max zoom level with clustering. When zoom is higher or equal to this level, clustering is disabled.
 * You can put a high value to disable this feature.
 */
public void setMaxClusteringZoomLevel(int zoom) {
    mMaxClusteringZoomLevel = zoom;
}

/**
 * Radius-Based clustering algorithm
 */
@Override
public ArrayList<StaticCluster> clusterer(MapView mapView) {

    ArrayList<StaticCluster> clusters = new ArrayList<StaticCluster>();
    convertRadiusToMeters(mapView);

    mClonedMarkers = new ArrayList<Marker>(mItems); //shallow copy
    while (!mClonedMarkers.isEmpty()) {
        Marker m = mClonedMarkers.get(0);
        m.setIcon(context.getResources().getDrawable(R.drawable.location_marker));
        StaticCluster cluster = createCluster(m, mapView);
        clusters.add(cluster);
    }
    return clusters;
}

private StaticCluster createCluster(Marker m, MapView mapView) {
    GeoPoint clusterPosition = m.getPosition();

    StaticCluster cluster = new StaticCluster(clusterPosition);
    cluster.add(m);

    mClonedMarkers.remove(m);

    if (mapView.getZoomLevel() > mMaxClusteringZoomLevel) {
        //above max level => block clustering:
        return cluster;
    }

    Iterator<Marker> it = mClonedMarkers.iterator();
    while (it.hasNext()) {
        Marker neighbour = it.next();
        double distance = clusterPosition.distanceToAsDouble(neighbour.getPosition());
        if (distance <= mRadiusInMeters) {
            cluster.add(neighbour);
            it.remove();
        }
    }

    return cluster;
}

@Override
public Marker buildClusterMarker(StaticCluster cluster, MapView mapView) {

    Marker m = new Marker(mapView);
    m.setPosition(cluster.getPosition());
    m.setInfoWindow(null);
    m.setAnchor(mAnchorU, mAnchorV);
    Bitmap mutableBitmap=null;

    if (cluster.getSize() < 10) {
        Bitmap icon = Bitmap.createBitmap(((BitmapDrawable) context.getResources().getDrawable(R.drawable.cluster1)).getBitmap());
        mutableBitmap = icon.copy(Bitmap.Config.ARGB_8888, true);

        Canvas iconCanvas = new Canvas(mutableBitmap);
       // iconCanvas.drawBitmap(mClusterIcon, 0, 0, null);
        String text = "" + cluster.getSize();
        int textHeight = (int) (mTextPaint.descent() + mTextPaint.ascent());
        iconCanvas.drawText(text,
                mTextAnchorU * icon.getWidth(),
                mTextAnchorV * icon.getHeight() - textHeight / 2,
                mTextPaint);
        m.setIcon(new BitmapDrawable(mapView.getContext().getResources(), mutableBitmap));
    } else if (cluster.getSize() > 10 && cluster.getSize() < 100) {
        Bitmap icon = Bitmap.createBitmap(((BitmapDrawable) context.getResources().getDrawable(R.drawable.cluster3)).getBitmap());
        mutableBitmap = icon.copy(Bitmap.Config.ARGB_8888, true);
        Canvas iconCanvas = new Canvas(mutableBitmap);
        //iconCanvas.drawBitmap(mClusterIcon, 0, 0, null);
        String text = "" + cluster.getSize();
        int textHeight = (int) (mTextPaint.descent() + mTextPaint.ascent());
        iconCanvas.drawText(text,
                mTextAnchorU * icon.getWidth(),
                mTextAnchorV * icon.getHeight() - textHeight / 2,
                mTextPaint);
        m.setIcon(new BitmapDrawable(mapView.getContext().getResources(), mutableBitmap));
    } else if (cluster.getSize() > 100) {
        Bitmap icon = Bitmap.createBitmap(((BitmapDrawable) context.getResources().getDrawable(R.drawable.cluster2)).getBitmap());
        mutableBitmap = icon.copy(Bitmap.Config.ARGB_8888, true);
        Canvas iconCanvas = new Canvas(mutableBitmap);
        //iconCanvas.drawBitmap(mClusterIcon, 0, 0, null);
        String text = "" + cluster.getSize();
        int textHeight = (int) (mTextPaint.descent() + mTextPaint.ascent());
        iconCanvas.drawText(text,
                mTextAnchorU * icon.getWidth(),
                mTextAnchorV * icon.getHeight() - textHeight / 2,
                mTextPaint);
        m.setIcon(new BitmapDrawable(mapView.getContext().getResources(), mutableBitmap));

    }
    m.setOnMarkerClickListener(new Marker.OnMarkerClickListener() {
        @Override
        public boolean onMarkerClick(Marker marker, MapView mapView) {
            mapView.getController().setZoom(mapView.getZoomLevelDouble()+2);

            return true;
        }
    });
   // m.setIcon(new BitmapDrawable(mapView.getContext().getResources(), mutableBitmap));

    return m;
}

@Override
public void renderer(ArrayList<StaticCluster> clusters, Canvas canvas, MapView mapView) {
    for (StaticCluster cluster : clusters) {
        if (cluster.getSize() == 1) {
            //cluster has only 1 marker => use it as it is:
            cluster.setMarker(cluster.getItem(0));
        } else {
            //only draw 1 Marker at Cluster center, displaying number of Markers contained
            Marker m = buildClusterMarker(cluster, mapView);
            cluster.setMarker(m);
        }
    }
}

private void convertRadiusToMeters(MapView mapView) {

    Rect mScreenRect = mapView.getIntrinsicScreenRect(null);

    int screenWidth = mScreenRect.right - mScreenRect.left;
    int screenHeight = mScreenRect.bottom - mScreenRect.top;

    BoundingBox bb = mapView.getBoundingBox();

    double diagonalInMeters = bb.getDiagonalLengthInMeters();
    double diagonalInPixels = Math.sqrt(screenWidth * screenWidth + screenHeight * screenHeight);
    double metersInPixel = diagonalInMeters / diagonalInPixels;

    mRadiusInMeters = mRadiusInPixels * metersInPixel;
}

}

1 Ответ

0 голосов
/ 30 сентября 2018

Ваш buildClusterMarker содержит ошибки: посмотрите, что происходит, когда размер кластера равен = 10 или = 100: в обоих случаях нет «если».Таким образом, m.setIcon не вызывается, и у вас все еще есть значок маркера osmdroid по умолчанию: этот забавный «значок руки зеленого цвета».

Кстати, почему вы скопировали весь код RadiusMarkerClusterer, когда вы можете просто унаследовать его и реализовать (правильно) свой собственный buildClusterMarker ???Прекрасный пример того, что никогда не должно быть сделано.

...