public static void Add3DPolygon(LocalVectorDataSource source, Projection projection) { // Create 3d polygon style and poses Polygon3DStyleBuilder polygon3DStyleBuilder = new Polygon3DStyleBuilder(); polygon3DStyleBuilder.Color = new Color(51, 51, 255, 255); MapPosVector polygon3DPoses = new MapPosVector(); polygon3DPoses.Add(projection.FromWgs84(new MapPos(24.635930, 59.416659))); polygon3DPoses.Add(projection.FromWgs84(new MapPos(24.642453, 59.411354))); polygon3DPoses.Add(projection.FromWgs84(new MapPos(24.646187, 59.409607))); polygon3DPoses.Add(projection.FromWgs84(new MapPos(24.652667, 59.413123))); polygon3DPoses.Add(projection.FromWgs84(new MapPos(24.650736, 59.416703))); polygon3DPoses.Add(projection.FromWgs84(new MapPos(24.646444, 59.416245))); // Create 3d polygon holes poses MapPosVector holePositions = new MapPosVector(); holePositions.Add(projection.FromWgs84(new MapPos(24.643409, 59.411922))); holePositions.Add(projection.FromWgs84(new MapPos(24.651207, 59.412896))); holePositions.Add(projection.FromWgs84(new MapPos(24.643207, 59.414411))); MapPosVectorVector holes = new MapPosVectorVector(); holes.Add(holePositions); // Add to datasource Polygon3D polygon = new Polygon3D(polygon3DPoses, holes, polygon3DStyleBuilder.BuildStyle(), 150); polygon.SetMetaDataElement("ClickText", new Variant("Polygon 3D")); source.Add(polygon); }
public RoutingResult GetResult(MapPos startPos, MapPos stopPos) { MapPosVector poses = new MapPosVector(); poses.Add(startPos); poses.Add(stopPos); RoutingRequest request = new RoutingRequest(BaseProjection, poses); return(Service.CalculateRoute(request)); }
public override void ViewDidLoad() { base.ViewDidLoad(); // Add default base layer AddOnlineBaseLayer(CartoBaseMapStyle.CartoBasemapStyleVoyager); // Load ground overlay bitmap //Bitmap androidMarkerBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.jefferson); //com.carto.graphics.Bitmap overlayBitmap = BitmapUtils.createBitmapFromAndroidBitmap(androidMarkerBitmap); Bitmap overlayBitmap = BitmapUtils.LoadBitmapFromFile("jefferson-building-ground-floor.jpg"); // Create two vectors containing geographical positions and corresponding raster image pixel coordinates. // 2, 3 or 4 points may be specified. Usually 2 points are enough (for conformal mapping). MapPos pos = BaseProjection.FromWgs84(new MapPos(-77.004590, 38.888702)); double sizeNS = 110; double sizeWE = 100; MapPosVector mapPoses = new MapPosVector(); mapPoses.Add(new MapPos(pos.X - sizeWE, pos.Y + sizeNS)); mapPoses.Add(new MapPos(pos.X + sizeWE, pos.Y + sizeNS)); mapPoses.Add(new MapPos(pos.X + sizeWE, pos.Y - sizeNS)); mapPoses.Add(new MapPos(pos.X - sizeWE, pos.Y - sizeNS)); ScreenPosVector bitmapPoses = new ScreenPosVector(); bitmapPoses.Add(new ScreenPos(0, 0)); bitmapPoses.Add(new ScreenPos(0, overlayBitmap.Height)); bitmapPoses.Add(new ScreenPos(overlayBitmap.Width, overlayBitmap.Height)); bitmapPoses.Add(new ScreenPos(overlayBitmap.Width, 0)); // Create bitmap overlay raster tile data source BitmapOverlayRasterTileDataSource rasterDataSource = new BitmapOverlayRasterTileDataSource( 0, 20, overlayBitmap, BaseProjection, mapPoses, bitmapPoses ); RasterTileLayer rasterLayer = new RasterTileLayer(rasterDataSource); MapView.Layers.Add(rasterLayer); // Apply zoom level bias to the raster layer. // By default, bitmaps are upsampled on high-DPI screens. // We will correct this by applying appropriate bias float zoomLevelBias = (float)(Math.Log(MapView.Options.DPI / 160.0f) / Math.Log(2)); rasterLayer.ZoomLevelBias = zoomLevelBias * 0.75f; rasterLayer.TileSubstitutionPolicy = TileSubstitutionPolicy.TileSubstitutionPolicyVisible; MapView.SetFocusPos(pos, 0); MapView.SetZoom(15.5f, 0); }
public static void Add2DPolygon(LocalVectorDataSource source, Projection projection) { LineStyleBuilder lineBuilder = new LineStyleBuilder(); lineBuilder.Color = new Color(0, 0, 0, 255); // Black lineBuilder.Width = 1.0f; // Create polygon style and poses PolygonStyleBuilder polygonBuilder = new PolygonStyleBuilder(); polygonBuilder.Color = new Color(255, 0, 0, 255); // Red polygonBuilder.LineStyle = lineBuilder.BuildStyle(); MapPosVector polygonPoses = new MapPosVector(); polygonPoses.Add(projection.FromWgs84(new MapPos(24.650930, 59.421659))); polygonPoses.Add(projection.FromWgs84(new MapPos(24.657453, 59.416354))); polygonPoses.Add(projection.FromWgs84(new MapPos(24.661187, 59.414607))); polygonPoses.Add(projection.FromWgs84(new MapPos(24.667667, 59.418123))); polygonPoses.Add(projection.FromWgs84(new MapPos(24.665736, 59.421703))); polygonPoses.Add(projection.FromWgs84(new MapPos(24.661444, 59.421245))); polygonPoses.Add(projection.FromWgs84(new MapPos(24.660199, 59.420677))); polygonPoses.Add(projection.FromWgs84(new MapPos(24.656552, 59.420175))); polygonPoses.Add(projection.FromWgs84(new MapPos(24.654010, 59.421472))); // Create 2 polygon holes MapPosVector holePoses1 = new MapPosVector(); holePoses1.Add(projection.FromWgs84(new MapPos(24.658409, 59.420522))); holePoses1.Add(projection.FromWgs84(new MapPos(24.662207, 59.418896))); holePoses1.Add(projection.FromWgs84(new MapPos(24.662207, 59.417411))); holePoses1.Add(projection.FromWgs84(new MapPos(24.659524, 59.417171))); holePoses1.Add(projection.FromWgs84(new MapPos(24.657615, 59.419834))); MapPosVector holePoses2 = new MapPosVector(); holePoses2.Add(projection.FromWgs84(new MapPos(24.665640, 59.421243))); holePoses2.Add(projection.FromWgs84(new MapPos(24.668923, 59.419463))); holePoses2.Add(projection.FromWgs84(new MapPos(24.662893, 59.419365))); MapPosVectorVector polygonHoles = new MapPosVectorVector(); polygonHoles.Add(holePoses1); polygonHoles.Add(holePoses2); // Add polygon Polygon polygon = new Polygon(polygonPoses, polygonHoles, polygonBuilder.BuildStyle()); polygon.SetMetaDataElement("ClickText", new Variant("Polygon")); source.Add(polygon); }
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); }
public static void AddOverlyingLines(MapView map, LocalVectorDataSource source, Projection projection) { // Initialize a second vector data source and vector layer // This secondary vector layer will be used for drawing borders for // line elements (by drawing the same line twice, with different widths) // Drawing order withing a layer is currently undefined // Using multiple layers is the only way to guarantee // that point, line and polygon elements are drawn in a specific order LocalVectorDataSource source2 = new LocalVectorDataSource(projection); VectorLayer vectorLayer2 = new VectorLayer(source2); map.Layers.Add(vectorLayer2); vectorLayer2.VisibleZoomRange = new MapRange(10, 24); // Create line style, and line poses LineStyleBuilder lineStyleBuilder = new LineStyleBuilder(); lineStyleBuilder.Color = new Color(255, 255, 255, 255); // White lineStyleBuilder.Width = 8; MapPosVector linePoses = new MapPosVector(); linePoses.Add(projection.FromWgs84(new MapPos(24.645565, 59.422074))); linePoses.Add(projection.FromWgs84(new MapPos(24.643076, 59.420502))); linePoses.Add(projection.FromWgs84(new MapPos(24.645351, 59.419149))); linePoses.Add(projection.FromWgs84(new MapPos(24.648956, 59.420393))); linePoses.Add(projection.FromWgs84(new MapPos(24.650887, 59.422707))); // Add first line Line line1 = new Line(linePoses, lineStyleBuilder.BuildStyle()); line1.SetMetaDataElement("ClickText", new Variant("Line nr 1")); source2.Add(line1); // Create another line style, use the same lines poses lineStyleBuilder = new LineStyleBuilder(); lineStyleBuilder.Color = new Color(204, 15, 0, 255); lineStyleBuilder.Width = 12; // Add second line to the second layer. Line line2 = new Line(linePoses, lineStyleBuilder.BuildStyle()); line2.SetMetaDataElement("ClickText", new Variant("Line nr 2")); source.Add(line2); }
public RoutingResult GetResult(MapPos startPos, MapPos stopPos) { MapPosVector poses = new MapPosVector(); poses.Add(startPos); poses.Add(stopPos); RoutingRequest request = new RoutingRequest(Projection, poses); RoutingResult result = null; try { result = Service.CalculateRoute(request); } catch (Exception e) { Console.WriteLine("Exception calculating route: " + e.Message); } return(result); }
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); }
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); }
public MapPosVector GetCirclePoints(double centerLon, double centerLat, double radius) { // Number of points of circle int N = 100; int EARTH_RADIUS = 6378137; MapPosVector points = new MapPosVector(); for (int i = 0; i <= N; i++) { double angle = Math.PI * 2 * (i % N) / N; double dx = radius * Math.Cos(angle); double dy = radius * Math.Sin(angle); double lat = centerLat + (180 / Math.PI) * (dy / EARTH_RADIUS); double lon = centerLon + (180 / Math.PI) * (dx / EARTH_RADIUS) / Math.Cos(centerLat * Math.PI / 180); points.Add(Projection.FromWgs84(new MapPos(lon, lat))); } return(points); }
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); }
public void showRoute(MapPos startPos, MapPos stopPos) { Log.Debug("calculating path " + startPos + " to " + stopPos); if (!offlinePackageReady) { RunOnUiThread(() => { Toast.MakeText(ApplicationContext, "Offline package is not ready, using online routing", ToastLength.Long).Show(); }); } if (!shortestPathRunning) { shortestPathRunning = true; long timeStart; // run routing in background Task.Run(() => { timeStart = Java.Lang.JavaSystem.CurrentTimeMillis(); MapPosVector poses = new MapPosVector(); poses.Add(startPos); poses.Add(stopPos); RoutingRequest request = new RoutingRequest(baseProjection, poses); RoutingResult result; if (offlinePackageReady) { result = offlineRoutingService.CalculateRoute(request); } else { result = onlineRoutingService.CalculateRoute(request); } // now update response in UI thread RunOnUiThread(() => { if (result == null) { Toast.MakeText(ApplicationContext, "Routing failed", ToastLength.Long).Show(); shortestPathRunning = false; return; } String routeText = "The route is " + (int)(result.TotalDistance / 100) / 10f + "km (" + secondsToHours((int)result.TotalTime) + ") calculation: " + (Java.Lang.JavaSystem.CurrentTimeMillis() - timeStart) + " ms"; Log.Info(routeText); Toast.MakeText(ApplicationContext, routeText, ToastLength.Long).Show(); routeDataSource.RemoveAll(); startMarker.Visible = false; routeDataSource.Add(createPolyline(startMarker.Geometry .CenterPos, stopMarker.Geometry.CenterPos, result)); // add instruction markers RoutingInstructionVector instructions = result.Instructions; for (int i = 0; i < instructions.Count; i++) { RoutingInstruction instruction = instructions [i]; // Log.d(Const.LOG_TAG, instruction.toString()); createRoutePoint(result.Points [instruction.PointIndex], instruction.StreetName, instruction.Time, instruction.Distance, instruction.Action, routeDataSource); } shortestPathRunning = false; }); }); } }
public RoutingResult GetResult(MapPos startPos, MapPos stopPos) { MapPosVector poses = new MapPosVector(); poses.Add(startPos); poses.Add(stopPos); RoutingRequest request = new RoutingRequest(BaseProjection, poses); return Service.CalculateRoute(request); }
public void ShowRoute(MapPos startPos, MapPos stopPos) { Log.Debug("calculating path " + startPos + " to " + stopPos); if (!offlinePackageReady) { RunOnUiThread(() => { string message = "Offline package is not ready, using online routing"; Toast.MakeText(ApplicationContext, message, ToastLength.Long).Show(); }); } if (!shortestPathRunning) { shortestPathRunning = true; long timeStart; // run routing in background Task.Run(() => { timeStart = Java.Lang.JavaSystem.CurrentTimeMillis(); MapPosVector poses = new MapPosVector(); poses.Add(startPos); poses.Add(stopPos); RoutingRequest request = new RoutingRequest(BaseProjection, poses); RoutingResult result; if (offlinePackageReady) { result = offlineRoutingService.CalculateRoute(request); } else { result = onlineRoutingService.CalculateRoute(request); } // Now update response in UI thread RunOnUiThread(() => { if (result == null) { Alert("Routing failed"); shortestPathRunning = false; return; } string distance = "The route is " + (int)(result.TotalDistance / 100) / 10f + "km"; string time = "(" + result.TotalTime.ConvertFromSecondsToHours() + ")"; string calculation = "| Calculation: " + (Java.Lang.JavaSystem.CurrentTimeMillis() - timeStart) + " ms"; Alert(distance + time + calculation); routeDataSource.Clear(); startMarker.Visible = false; Line line = CreatePolyline(startMarker.Geometry.CenterPos, stopMarker.Geometry.CenterPos, result); routeDataSource.Add(line); // Add instruction markers RoutingInstructionVector instructions = result.Instructions; for (int i = 0; i < instructions.Count; i++) { RoutingInstruction instruction = instructions[i]; MapPos position = result.Points[instruction.PointIndex]; CreateRoutePoint(position, instruction, routeDataSource); } shortestPathRunning = false; }); }); } }
async public static void AddMapOverlays(IMapView mapView) { // Create overlay layer for markers var dataSource = new LocalVectorDataSource(proj); var overlayLayer = new VectorLayer(dataSource); mapView.Layers.Add(overlayLayer); // Create line style, and line poses var lineStyleBuilder = new LineStyleBuilder(); lineStyleBuilder.Width = 8; var linePoses = new MapPosVector(); // proj.FromWgs84 returns (spherical) Mercator projection linePoses.Add(proj.FromWgs84(new MapPos(0, 0))); linePoses.Add(proj.FromWgs84(new MapPos(0, 80))); linePoses.Add(proj.FromWgs84(new MapPos(45, 45))); var line = new Line(linePoses, lineStyleBuilder.BuildStyle()); dataSource.Add(line); // Create balloon popup var balloonPopupStyleBuilder = new BalloonPopupStyleBuilder(); balloonPopupStyleBuilder.CornerRadius = 3; balloonPopupStyleBuilder.TitleFontName = "Helvetica"; balloonPopupStyleBuilder.TitleFontSize = 55; balloonPopupStyleBuilder.TitleColor = new Color(200, 0, 0, 255); balloonPopupStyleBuilder.StrokeColor = new Color(200, 120, 0, 255); balloonPopupStyleBuilder.StrokeWidth = 1; balloonPopupStyleBuilder.PlacementPriority = 1; var popup = new BalloonPopup( proj.FromWgs84(new MapPos(0, 20)), balloonPopupStyleBuilder.BuildStyle(), "Title", "Description"); dataSource.Add(popup); // Load NML file model from a file BinaryData modelFile = AssetUtils.LoadAsset("fcd_auto.nml"); // set location for model, and create NMLModel object with this var modelPos = proj.FromWgs84(new MapPos(24.646469, 59.423939)); var model = new NMLModel(modelPos, modelFile); mapView.FocusPos = modelPos; mapView.Zoom = 15; // Oversize it 20*, just to make it more visible (optional) model.Scale = 20; // Add metadata for click handling (optional) model.SetMetaDataElement("ClickText", new Variant("Single model")); // Add it to normal datasource dataSource.Add(model); // Create and set map listener mapView.MapEventListener = new MapListener(dataSource); await AnimateModel(model); }