public override VectorElement BuildClusterElement(MapPos pos, VectorElementVector elements)
        {
            BalloonPopupStyle style = balloonPopupStyleBuilder.BuildStyle();
            var popup = new BalloonPopup(pos, style, elements.Count.ToString(), "");

            return popup;
        }
        public override VectorElement BuildClusterElement(MapPos pos, VectorElementVector elements)
        {
            BalloonPopupStyle style = balloonPopupStyleBuilder.BuildStyle();
            var popup = new BalloonPopup(pos, style, elements.Count.ToString(), "");

            return(popup);
        }
Esempio n. 3
0
        private static void DrawPolygons()
        {
            MapEvent(null, new MapEventArgs(0, 100, "Calling polygons..."));
            var polygons     = d.getObjects(day, 3);
            var overlayLayer = new VectorLayer(dataSourcePolygons);

            overlayLayer.VisibleZoomRange = new MapRange(16, 24);
            mapView.Layers.Add(overlayLayer);
            VectorElementVector v     = new VectorElementVector();
            VectorElementVector vText = new VectorElementVector();
            int i = 0;

            foreach (var obj in polygons)
            {
                //Define coordinates of outer ring
                MapPosVector polygonPoses = new MapPosVector();
                foreach (var pnt in obj.polygonList.coordinates[0])
                {
                    polygonPoses.Add(projection.FromWgs84(new MapPos(pnt[0], pnt[1])));
                }
                Polygon polygon = new Polygon(polygonPoses, Styles.GetDefaultPolygonStyle().BuildStyle());
                v.Add(polygon);
                if (i == 0)
                {
                    mapView.FocusPos = projection.FromWgs84(new MapPos(obj.polygonList.coordinates[0][0][0], obj.polygonList.coordinates[0][0][1]));
                }
                MapEvent(null, new MapEventArgs(i, polygons.Count, "Drawing polygons..."));
                i++;
            }
            dataSourcePolygons.RemoveAll(dataSourcePolygons.GetAll());
            dataSourcePolygons.AddAll(v);
        }
        protected override void OnCreate(Android.OS.Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            AddOnlineBaseLayer(CartoBaseMapStyle.CartoBasemapStylePositron);

            // read json from assets and add to map
            string json;

            using (System.IO.StreamReader sr = new System.IO.StreamReader(Assets.Open("cities15000.geojson")))
            {
                json = sr.ReadToEnd();
            }

            // Initialize a local vector data source
            LocalVectorDataSource source = new LocalVectorDataSource(BaseProjection);

            // Initialize a vector layer with the previous data source
            ClusteredVectorLayer layer = new ClusteredVectorLayer(source, new MyClusterElementBuilder(this));

            layer.MinimumClusterDistance = 50;

            new System.Threading.Thread((obj) =>
            {
                // Create a basic style, as the ClusterElementBuilder will set the real style
                var markerStyleBuilder  = new MarkerStyleBuilder();
                markerStyleBuilder.Size = 14;
                MarkerStyle style       = markerStyleBuilder.BuildStyle();

                // Read GeoJSON, parse it using SDK GeoJSON parser
                GeoJSONGeometryReader reader = new GeoJSONGeometryReader();

                // Set target projection to base (mercator)
                reader.TargetProjection = BaseProjection;
                Alert("Starting load from .geojson");

                // Read features from local asset
                FeatureCollection features = reader.ReadFeatureCollection(json);
                Alert("Finished load from .geojson");

                VectorElementVector elements = new VectorElementVector();

                for (int i = 0; i < features.FeatureCount; i++)
                {
                    // This data set features point geometry,
                    // however, it can also be LineGeometry or PolygonGeometry
                    PointGeometry geometry = (PointGeometry)features.GetFeature(i).Geometry;
                    elements.Add(new Marker(geometry, style));
                }

                source.AddAll(elements);
                Alert("Clustering started. Please wait...");

                // Add the clustered vector layer to the map
                MapView.Layers.Add(layer);
            }).Start();
        }
        public override VectorData LoadElements(CullState cullState)
        {
            VectorElementVector elements = new VectorElementVector();

            MapEnvelope mapViewBounds = cullState.GetProjectionEnvelope(this.Projection);
            MapPos      min           = mapViewBounds.Bounds.Min;
            MapPos      max           = mapViewBounds.Bounds.Max;

            // Run query here
            LoadData(elements, min, max, cullState.ViewState.Zoom);

            return(new VectorData(elements));
        }
        public override void ViewDidAppear(bool animated)
        {
            base.ViewDidAppear(animated);

            // Add default base layer
            AddOnlineBaseLayer(CartoBaseMapStyle.CartoBasemapStylePositron);

            // Initialize a local vector data source
            LocalVectorDataSource source = new LocalVectorDataSource(BaseProjection);

            // Initialize a vector layer with the previous data source
            var layer = new ClusteredVectorLayer(source, new MyClusterElementBuilder());

            // Default is 100. A good value depends on data
            layer.MinimumClusterDistance = 50;

            // read json from assets and add to map
            string json = System.IO.File.ReadAllText(AssetUtils.CalculateResourcePath("cities15000.geojson"));

            // Create a basic style, as the ClusterElementBuilder will set the real style
            var markerStyleBuilder = new MarkerStyleBuilder();

            markerStyleBuilder.Size = 14;
            MarkerStyle style = markerStyleBuilder.BuildStyle();

            // Read GeoJSON, parse it using SDK GeoJSON parser
            GeoJSONGeometryReader reader = new GeoJSONGeometryReader();

            // Set target projection to base (mercator)
            reader.TargetProjection = BaseProjection;

            // Read features from local asset
            FeatureCollection features = reader.ReadFeatureCollection(json);

            VectorElementVector elements = new VectorElementVector();

            for (int i = 0; i < features.FeatureCount; i++)
            {
                // This data set features point geometry,
                // however, it can also be LineGeometry or PolygonGeometry
                PointGeometry geometry = (PointGeometry)features.GetFeature(i).Geometry;
                elements.Add(new Marker(geometry, style));
            }

            // Add the clustered vector layer to the map
            source.AddAll(elements);

            MapView.Layers.Add(layer);
        }
Esempio n. 7
0
        private static void DrawTrunks()
        {
            MapEvent(null, new MapEventArgs(0, 100, "Calling type trunk..."));
            var trunks       = d.getObjects(day, 2, 557);
            var overlayLayer = new VectorLayer(dataSourceTrunks);

            overlayLayer.VisibleZoomRange = new MapRange(6, 24);
            mapView.Layers.Add(overlayLayer);
            var overlayLayer2 = new VectorLayer(dataSourceTrunks2);

            overlayLayer2.VisibleZoomRange = new MapRange(9, 24);
            mapView.Layers.Add(overlayLayer2);
            var overlayLayerText = new VectorLayer(dataSourceTrunksText);

            overlayLayerText.VisibleZoomRange = new MapRange(17, 24);
            mapView.Layers.Add(overlayLayerText);
            VectorElementVector v     = new VectorElementVector();
            VectorElementVector v2    = new VectorElementVector();
            VectorElementVector vText = new VectorElementVector();

            mapView.FocusPos = projection.FromWgs84(new MapPos(trunks[0].lineList.coordinates[0][0], trunks[0].lineList.coordinates[0][1]));
            int i = 0;

            foreach (var obj in trunks)
            {
                var linePoses = new MapPosVector();
                foreach (var pnt in obj.lineList.coordinates)
                {
                    linePoses.Add(projection.FromWgs84(new MapPos(pnt[0], pnt[1])));
                }
                var line = new Line(linePoses, Styles.GetTrunkStyle1().BuildStyle());
                v.Add(line);
                var line2 = new Line(linePoses, Styles.GetTrunkStyle2().BuildStyle());
                v2.Add(line2);
                var textpopup1 = new Text(projection.FromWgs84(new MapPos(obj.lineList.coordinates[0][0], obj.lineList.coordinates[0][1])),
                                          Styles.GetDefaultTextStyle().BuildStyle(),
                                          obj.name);
                vText.Add(textpopup1);
                MapEvent(null, new MapEventArgs(i, trunks.Count, "Drawing type trunk..."));
                i++;
            }
            dataSourceTrunks.RemoveAll(dataSourceTrunks.GetAll());
            dataSourceTrunks.AddAll(v);
            dataSourceTrunks2.RemoveAll(dataSourceTrunks2.GetAll());
            dataSourceTrunks2.AddAll(v2);
            dataSourceTrunksText.RemoveAll(dataSourceTrunksText.GetAll());
            dataSourceTrunksText.AddAll(vText);
        }
        public override VectorElement BuildClusterElement(MapPos pos, VectorElementVector elements)
        {
            // Try to reuse existing marker styles
            MarkerStyle style = null;

            style = FindByKey(elements.Count);

            if (elements.Count == 1)
            {
                style = ((Marker)elements[0]).Style;
            }

            if (style == null)
            {
                UIFont font = UIFont.FromName("Helvetica Neue", 10);
                UIGraphics.BeginImageContext(markerImage.Size);

                // Draw existing image on new image context;
                markerImage.Draw(new CGPoint(0, 0));

                NSString native = new NSString(elements.Count.ToString());

                // Find the center location and draw text there
                nfloat y         = markerImage.Size.Height / 4;
                CGRect rectangle = new CGRect(0, y, markerImage.Size.Width, markerImage.Size.Height);
                native.DrawString(rectangle, font, UILineBreakMode.WordWrap, UITextAlignment.Center);

                // Extract image
                UIImage newImage = UIGraphics.GetImageFromCurrentImageContext();

                UIGraphics.EndImageContext();

                MarkerStyleBuilder styleBuilder = new MarkerStyleBuilder();
                styleBuilder.Bitmap            = BitmapUtils.CreateBitmapFromUIImage(newImage);
                styleBuilder.Size              = 30;
                styleBuilder.PlacementPriority = elements.Count;

                style = styleBuilder.BuildStyle();

                markerStyles.Add(elements.Count, style);
            }

            // Create marker for the cluster
            Marker marker = new Marker(pos, style);

            return(marker);
        }
Esempio n. 9
0
        private static void DrawPoints()
        {
            //MessageBox content to be rendered
            MapEvent(null, new MapEventArgs(0, 100, "Calling points"));
            //Objects are pulled from SQLite database
            var points = d.getObjects(day, 1);
            //Layers and the ZoomLevels where they should be visible are created (Zoomlevels range from 0 to 24)
            var overlayLayer = new VectorLayer(dataSourcePoints);

            overlayLayer.VisibleZoomRange = new MapRange(17, 24);
            mapView.Layers.Add(overlayLayer);
            var overlayLayerText = new VectorLayer(dataSourcePointsText);

            overlayLayerText.VisibleZoomRange = new MapRange(17, 24);
            mapView.Layers.Add(overlayLayerText);
            VectorElementVector v     = new VectorElementVector();
            VectorElementVector vText = new VectorElementVector();

            mapView.FocusPos = projection.FromWgs84(new MapPos(points[0].pointList.coordinates[0],
                                                               points[0].pointList.coordinates[1]));
            int i = 0;

            //Objects are drawn on layer
            foreach (var obj in points)
            {
                if (i > 500)
                {
                    continue;
                }
                var pt = new Point(
                    projection.FromWgs84(new MapPos(obj.pointList.coordinates[0],
                                                    obj.pointList.coordinates[1])), Styles.GetDefaultPointStyle().BuildStyle());
                v.Add(pt);
                var textpopup1 = new Text(
                    projection.FromWgs84(new MapPos(obj.pointList.coordinates[0], obj.pointList.coordinates[1])),
                    Styles.GetDefaultTextStyle().BuildStyle(),
                    obj.name);
                vText.Add(textpopup1);
                MapEvent(null, new MapEventArgs(i, points.Count, "Drawing points"));
                i++;
            }
            //Layers are cleared of old data and written with new data
            dataSourcePoints.RemoveAll(dataSourcePoints.GetAll());
            dataSourcePoints.AddAll(v);
            dataSourcePointsText.RemoveAll(dataSourcePointsText.GetAll());
            dataSourcePointsText.AddAll(vText);
        }
Esempio n. 10
0
        private static void DrawForests()
        {
            MapEvent(null, new MapEventArgs(0, 100, "Calling type landuse forest ..."));
            var forests      = d.getObjects(day, 3, 472);
            var overlayLayer = new VectorLayer(dataSourceForests);

            overlayLayer.VisibleZoomRange = new MapRange(6, 24);
            mapView.Layers.Add(overlayLayer);
            var overlayLayerText = new VectorLayer(dataSourceForestsText);

            overlayLayerText.VisibleZoomRange = new MapRange(17, 24);
            mapView.Layers.Add(overlayLayerText);
            VectorElementVector v     = new VectorElementVector();
            VectorElementVector vText = new VectorElementVector();
            int i = 0;

            foreach (var obj in forests)
            {
                //Define coordinates of outer ring
                MapPosVector polygonPoses = new MapPosVector();
                foreach (var pnt in obj.polygonList.coordinates[0])
                {
                    polygonPoses.Add(projection.FromWgs84(new MapPos(pnt[0], pnt[1])));
                }
                Polygon polygon = new Polygon(polygonPoses, Styles.GetDefaultForestStyle().BuildStyle());
                //polygon.SetMetaDataElement("ClickText", obj.name);
                v.Add(polygon);
                if (i == 0)
                {
                    mapView.FocusPos = projection.FromWgs84(new MapPos(obj.polygonList.coordinates[0][0][0], obj.polygonList.coordinates[0][0][1]));
                }
                var textpopup1 = new Text(projection.FromWgs84(new MapPos(obj.polygonList.coordinates[0][0][0], obj.polygonList.coordinates[0][0][1])),
                                          Styles.GetDefaultTextStyle().BuildStyle(),
                                          obj.name);
                vText.Add(textpopup1);
                MapEvent(null, new MapEventArgs(i, forests.Count, "Drawing Type landuse forest..."));
                i++;
            }
            dataSourceForests.RemoveAll(dataSourceForests.GetAll());
            dataSourceForests.AddAll(v);
            dataSourceForestsText.RemoveAll(dataSourceForestsText.GetAll());
            dataSourceForestsText.AddAll(vText);
        }
Esempio n. 11
0
        private static void DrawRivers()
        {
            MapEvent(null, new MapEventArgs(0, 100, "Calling type waterway river..."));
            var rivers       = d.getObjects(day, 2, 744);
            var overlayLayer = new VectorLayer(dataSourceRivers);

            overlayLayer.VisibleZoomRange = new MapRange(9, 24);
            mapView.Layers.Add(overlayLayer);
            var overlayLayerText = new VectorLayer(dataSourceRiversText);

            overlayLayerText.VisibleZoomRange = new MapRange(17, 24);
            mapView.Layers.Add(overlayLayerText);
            VectorElementVector v     = new VectorElementVector();
            VectorElementVector vText = new VectorElementVector();
            int i = 0;

            foreach (var obj in rivers)
            {
                var linePoses = new MapPosVector();
                foreach (var pnt in obj.lineList.coordinates)
                {
                    linePoses.Add(projection.FromWgs84(new MapPos(pnt[0], pnt[1])));
                }
                var line = new Line(linePoses, Styles.GetRiverStyle().BuildStyle());
                v.Add(line);
                if (i == 0)
                {
                    mapView.FocusPos = projection.FromWgs84(new MapPos(obj.lineList.coordinates[0][0], obj.lineList.coordinates[0][1]));
                }
                var textpopup1 = new Text(projection.FromWgs84(new MapPos(obj.lineList.coordinates[0][0], obj.lineList.coordinates[0][1])),
                                          Styles.GetDefaultTextStyle().BuildStyle(),
                                          obj.name);
                vText.Add(textpopup1);
                MapEvent(null, new MapEventArgs(i, rivers.Count, "Drawing type waterway river..."));
                i++;
            }
            dataSourceRivers.RemoveAll(dataSourceRivers.GetAll());
            dataSourceRivers.AddAll(v);
            dataSourceRiversText.RemoveAll(dataSourceRiversText.GetAll());
            dataSourceRiversText.AddAll(vText);
        }
        void LoadData(VectorElementVector elements, MapPos min, MapPos max, float zoom)
        {
            // Load and parse JSON
            string bbox = EncodeBBox(min.X, min.Y, max.X, max.Y);

            string unencoded = query.Replace("!bbox!", bbox);

            unencoded = unencoded.Replace("zoom('!scale_denominator!')", Convert.ToString(zoom));

            // UrlEncode does not replace parentheses by default as they are valid url elements
            string encoded = System.Web.HttpUtility.UrlEncode(unencoded).EncodeParenthesis();

            string fullPath = baseUrl + "?format=GeoJSON&q=" + encoded;

            try
            {
                string json = GetString(fullPath);

                GeoJSONGeometryReader geoJsonParser = new GeoJSONGeometryReader();
                FeatureCollection     features      = geoJsonParser.ReadFeatureCollection(json);

                for (int i = 0; i < features.FeatureCount; i++)
                {
                    Geometry geom  = features.GetFeature(i).Geometry;
                    Variant  props = features.GetFeature(i).Properties;

                    // Create object based on given style
                    VectorElement element;

                    if (style is PointStyle)
                    {
                        element = new Point((PointGeometry)geom, (PointStyle)style);
                    }
                    else if (style is MarkerStyle)
                    {
                        element = new Marker(geom, (MarkerStyle)style);
                    }
                    else if (style is LineStyle)
                    {
                        element = new Line((LineGeometry)geom, (LineStyle)style);
                    }
                    else if (style is PolygonStyle)
                    {
                        element = new Polygon((PolygonGeometry)geom, (PolygonStyle)style);
                    }
                    else
                    {
                        string text = "Object creation not implemented yet for style: " + style.SwigGetClassNameStyle();
                        Carto.Utils.Log.Debug(text);
                        break;
                    }

                    // Add all properties as MetaData, so you can use it with click handling
                    for (int j = 0; j < props.ObjectKeys.Count; j++)
                    {
                        var key = props.ObjectKeys[j];
                        var val = props.GetObjectElement(key);
                        element.SetMetaDataElement(key, val);
                    }

                    elements.Add(element);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Exception: " + e.Message);
            }
        }