How can I draw multiple circles and rectangles on a map?

506 views Asked by At

For a project in my university, I need to show in a map all the intersections and some stations in Chicago, I already have LinkedLists with the data and I need to draw Circles with the position of the intersections and rectangles with the position of the stations. I'm using jxMaps library and based on the examples I was able to draw one circle and one rectangle testing the metods according with the examples provided by the developers, but if I try to draw multiple with a loop when I open the map, it stays in grey. This is my code:

public class Draw extends MapView
{

    private static final long serialVersionUID = 1L;

    Map map;

    IList <Integer, Intersetion> intersections;

    IList <Integer, Station> stations;

    public Draw(MapViewOptions options, IList <Integer, Intersection> inter, IList <Integer, Station> est)
    {
        super(options);
        // Setting of a ready handler to MapView object. onMapReady will be called when map initialization is done and
        // the map object is ready to use. Current implementation of onMapReady customizes the map object.
        setOnMapReadyHandler(new MapReadyHandler()
        {
            @Override
            public void onMapReady(MapStatus status)
            {
                // Check if the map is loaded correctly
                if (status == MapStatus.MAP_STATUS_OK)
                {
                    map = getMap();
                    intersections = inter; // I Load the list with the intersections data
                    stations = est; // I load the list with the stations data
                    rectangle();
                    circle();
                    // Creating a map options object
                    MapOptions mapOptions = new MapOptions();
                    // Creating a map type control options object
                    MapTypeControlOptions controlOptions = new MapTypeControlOptions();
                    // Changing position of the map type control
                    controlOptions.setPosition(ControlPosition.TOP_RIGHT);
                    // Setting map type control options
                    mapOptions.setMapTypeControlOptions(controlOptions);
                    // Setting map options
                    map.setOptions(mapOptions);
                    // Setting the map center
                    map.setCenter(new LatLng(41.875486, -87.626570));
                    // Setting initial zoom value
                    map.setZoom(9.0);
                }
            }
        });
    }

    public void circle ()
    {
        CircleOptions options = new CircleOptions();
        options.setFillOpacity(0);
        options.setStrokeColor("#CB4335");
        options.setStrokeWeight(5.0);

        for (Intersetion inter: intersections)
        {
            Circle circle = new Circle(map);
            circle.setCenter(new LatLng(inter.darLatitude(), inter.darLongitude()));
            circle.setRadius(50);
            circle.setOptions(options);
        }
    }
    public void rectangle()
    {
        RectangleOptions options = new RectangleOptions();
        options.setFillOpacity(0);
        options.setStrokeColor("#2E86C1");
        int i = 0;
        for (Station rect: stations)
        {
            Rectangle rectangulo = new Rectangle (map);
            LatLngBounds bounds = new LatLngBounds (new LatLng (rect.darLatitude() - 0.0004, rect.darLongitude() - 0.0006), new LatLng (rect.darLatitude() + 0.0004, rect.darLongitude() + 0.0006));
            rectangle.setBounds(bounds);
            rectangle.setOptions(optionts);
        }
    }
}
2

There are 2 answers

0
Juan José Torres On BEST ANSWER

Actually, for some reason, it works if I call the methods circle and rectangle at the end after setting the options of the map which is kind of weird considering that it works fine when I just create one circle or one rectangle in the order that appears in the question post.

2
Serhii Fedchenko On

I've analyzed the provided source code and it looks ok, except of a place where you set the stroke color. You have to use colors in the HTML format, so you have to change:

options.setStrokeColor(Color.RED.toString()); to options.setStrokeColor("#FF0000");

However, it cannot be the reason for the gray screen. The gray screen usually happens when something went wrong while setting map attributes (inside onMapReady() handler).

So you have to check if any exception happened and, if yes, then fix the root cause of it.

Also, you can enable logging and check if it has any errors. You can do it by adding the -Djxmaps.logging.level=ALL parameter to the VM options of your application.

EDIT________________________________________________________________________

Here is a code sample which allows to create multiple circles:

map.addEventListener("click", new MapMouseEvent() {
                        @Override
                        public void onEvent(MouseEvent mouseEvent) {
                            final Circle circle = new Circle(map);
                            circle.setRadius(2000);
                            circle.setCenter(mouseEvent.latLng());
                        }
                    });