How to show more than one location in Blackberry MapField?

I can show one location using coordinates or longitude and latitude, but I don't know how to show more than one location in the Blackberry MapField. If possible, pls share with me how to do it.

+2


source to share


2 answers


Exactly the same as How do I show my own icon on the BlackBerry Map? ...

Pass an array of coordinates to a custom MapField, define a bitmap for the location point, and paint it for each coordinate in the custom MapField paint () method.

Remember to increase / decrease the CustomMapField to best fit all location points.

Implementation example



Lets you display Liverpool Sheffield and London with custom bitmap icons (yellow circle with black border). Code for custom MapField:

class MultyMapField extends MapField {
    Coordinates[] mPoints = new Coordinates[0];
    Bitmap mPoint;
    Bitmap mPointsBitmap;
    XYRect mDest;
    XYRect[] mPointDest;

    public void addCoordinates(Coordinates coordinates) {
        Arrays.add(mPoints, coordinates);
        zoomToFitPoints();
        repaintPoints();
    }

    protected void zoomToFitPoints() {
        // zoom to max
        setZoom(getMaxZoom());

        // get pixels of all points
        int minLeft = getWidth();
        int minUp = getHeight();
        int maxRight = 0;
        int maxDown = 0;
        Coordinates minLeftCoordinates = null;
        Coordinates minUpCoordinates = null;
        Coordinates maxRightCoordinates = null;
        Coordinates maxDownCoordinates = null;
        for (int i = 0; i < mPoints.length; i++) {
            XYPoint point = new XYPoint();
            convertWorldToField(mPoints[i], point);
            if (point.x <= minLeft) {
                minLeft = point.x;
                minLeftCoordinates = mPoints[i];
            }
            if (point.x >= maxRight) {
                maxRight = point.x;
                maxRightCoordinates = mPoints[i];
            }
            if (point.y <= minUp) {
                minUp = point.y;
                minUpCoordinates = mPoints[i];
            }
            if (point.y >= maxDown) {
                maxDown = point.y;
                maxDownCoordinates = mPoints[i];
            }
        }

        double moveToLat = maxDownCoordinates.getLatitude()
                + (minUpCoordinates.getLatitude() - maxDownCoordinates
                        .getLatitude()) / 2;
        double moveToLong = minLeftCoordinates.getLongitude()
                + (maxRightCoordinates.getLongitude() - minLeftCoordinates
                        .getLongitude()) / 2;
        Coordinates moveTo = new Coordinates(moveToLat, moveToLong, 0);
        moveTo(moveTo);
        // zoom to min left up, max right down pixels + 1
        int zoom = getZoom();
        boolean outOfBounds = false;
        while (!outOfBounds && zoom > getMinZoom()) {
            zoom--;
            setZoom(zoom);
            XYPoint point = new XYPoint();
            try {
                convertWorldToField(minLeftCoordinates, point);
                if (point.x < 0)
                    outOfBounds = true;
                convertWorldToField(minUpCoordinates, point);
                if (point.y < 0)
                    outOfBounds = true;
                convertWorldToField(maxRightCoordinates, point);
                if (point.x > getWidth())
                    outOfBounds = true;
                convertWorldToField(maxDownCoordinates, point);
                if (point.y > getHeight())
                    outOfBounds = true;
            } catch (IllegalArgumentException ex) {
                outOfBounds = true;
            }
        }
        zoom++;
        setZoom(zoom);
    }

    protected void repaintPoints() {
        mPointsBitmap = new Bitmap(getWidth(), getHeight());
        mPointsBitmap.createAlpha(Bitmap.ALPHA_BITDEPTH_8BPP);
        mDest = new XYRect(0, 0, mPointsBitmap.getWidth(), mPointsBitmap
                .getHeight());
        Graphics g = new Graphics(mPointsBitmap);
        if (null != mPoint) {
            mPointDest = new XYRect[mPoints.length];
            for (int i = 0; i < mPoints.length; i++) {
                if (null == mPointDest[i]) {
                    XYPoint fieldOut = new XYPoint();
                    convertWorldToField(mPoints[i], fieldOut);
                    int imgW = mPoint.getWidth();
                    int imgH = mPoint.getHeight();
                    mPointDest[i] = new XYRect(fieldOut.x - imgW / 2,
                            fieldOut.y - imgH, imgW, imgH);
                }
                g.drawBitmap(mPointDest[i], mPoint, 0, 0);
            }
        }
    }

    protected void paint(Graphics graphics) {
        super.paint(graphics);
        if (null != mPointsBitmap) {
            graphics.setGlobalAlpha(100);
            graphics.drawBitmap(mDest, mPointsBitmap, 0, 0);
        }
    }
}

      

Usage example:

class Scr extends MainScreen {
    // test coordinates:
    // London
    // 51.507778, -0.128056
    Coordinates mLondonC = new Coordinates(51.507778, -0.128056, 0);
    // Liverpool
    // 53.4, -2.983333
    Coordinates mLiverpoolC = new Coordinates(53.4, -2.983333, 0);
    // Sheffield
    // 53.385833, -1.469444
    Coordinates mSheffieldC = new Coordinates(53.385833, -1.469444, 0);

    MultyMapField mMultyMapField;

    public Scr() {
        add(mMultyMapField = new MultyMapField());
        mMultyMapField.mPoint = createPointBitmap();
    }

    protected void onUiEngineAttached(boolean attached) {
        super.onUiEngineAttached(attached);
        if (attached) {
            mMultyMapField.addCoordinates(mLondonC);
            mMultyMapField.addCoordinates(mLiverpoolC);
            mMultyMapField.addCoordinates(mSheffieldC);
        }
    }

    private Bitmap createPointBitmap() {
        int r = 10;
        Bitmap result = new Bitmap(2 * r, 2 * r);
        result.createAlpha(Bitmap.ALPHA_BITDEPTH_8BPP);
        Graphics g = new Graphics(result);
        g.setColor(Color.BLACK);
        g.fillEllipse(r, r, 2 * r, r, r, 2 * r, 0, 360);
        g.setColor(Color.YELLOW);
        g.fillEllipse(r, r, r + (r - 2), r, r, r + (r - 2), 0, 360);
        return result;
    }
}

      

+5


source


A valid and probably simpler option would be to use this open source Monits library https://github.com/Monits/blackberry-commons

It contains several common features found in BB apps and is compatible with BB 4.6.1+



Among other things, it provides a map field with the ability to add and display markers on top of it, with and without focus, and possibly "open" them. This makes the API much more similar to other smartphones like iPhone or Android.

The documentation is pretty good and the wiki even has a tutorial on how to achieve it https://github.com/Monits/blackberry-commons/wiki/CustomMap

+1


source







All Articles