public static IFeature ToFeature(this Feature feature) { if (feature == null) { return(null); } IFeature forms = null; if (feature.Geometry() is Point point) { var cords = point.Coordinates(); forms = new PointFeature(new PointAnnotation { Id = feature.Id(), Coordinate = new Position { Lat = cords[0].DoubleValue(), Long = cords[1].DoubleValue() } }); } else if (feature.Geometry() is LineString line) { var coords = line.Coordinates() .Select(ToForms) .ToArray(); forms = new PolylineFeature(new PolylineAnnotation { Id = feature.Id(), Coordinates = coords }); } else if (feature.Geometry() is MultiLineString mline) { var coords = mline.Coordinates() .Select(x => x.Select(ToForms).ToArray()) .ToArray(); forms = new MultiPolylineFeature(new MultiPolylineAnnotation { Id = feature.Id(), Coordinates = coords }); } if (forms != null) { var json = feature.Properties().ToString(); forms.Attributes = Newtonsoft.Json.JsonConvert.DeserializeObject <Dictionary <string, object> >(json); } return(forms); }
public static IFeature ToFeature(this Feature feature) { if (feature == null) { return(null); } IFeature forms = null; if (feature.Geometry is Point) { var point = (Point)feature.Geometry; forms = new PointFeature(new PointAnnotation { Id = feature.Id, Coordinate = point.Coordinates.ToForms() }); } else if (feature.Geometry is LineString) { var line = (LineString)feature.Geometry; var coords = line.Coordinates .Select(ToForms) .ToArray(); forms = new PolylineFeature(new PolylineAnnotation { Id = feature.Id, Coordinates = coords }); } else if (feature.Geometry is MultiLineString) { var line = (MultiLineString)feature.Geometry; var coords = line.Coordinates .Select(x => x.Select(ToForms).ToArray()) .ToArray(); forms = new MultiPolylineFeature(new MultiPolylineAnnotation { Id = feature.Id, Coordinates = coords }); } if (forms != null) { var json = feature.Properties.ToString(); forms.Attributes = Newtonsoft.Json.JsonConvert.DeserializeObject <Dictionary <string, object> >(json); } return(forms); }
void SetupFunctions() { Element.TakeSnapshot = () => { var image = MapView.Capture(true); var imageData = image.AsJPEG(); Byte [] imgByteArray = new Byte [imageData.Length]; System.Runtime.InteropServices.Marshal.Copy(imageData.Bytes, imgByteArray, 0, Convert.ToInt32(imageData.Length)); return(imgByteArray); }; Element.GetFeaturesAroundPoint = (Point point, double radius, string [] layers) => { var selectableLayers = SelectableLayersFromSources(layers); NSObject [] features; var cgPoint = new CGPoint((nfloat)point.X, (nfloat)point.Y); if (radius <= 0) { features = MapView.VisibleFeaturesAtPoint(cgPoint, selectableLayers); } else { var rect = new CGRect(cgPoint.X - (nfloat)radius, cgPoint.Y - (nfloat)radius, (nfloat)radius * 2, (nfloat)radius * 2); features = MapView.VisibleFeaturesInRect(rect, selectableLayers); } var output = new List <IFeature> (); foreach (NSObject obj in features) { var feature = obj as IMGLFeature; if (feature == null || feature.Attributes == null) { continue; } string id = null; if (feature.Identifier != null) { if (feature.Identifier is NSNumber) { id = ((NSNumber)feature.Identifier).StringValue; } else { id = feature.Identifier.ToString(); } } if (id == null || output.Any((arg) => (arg as Annotation).Id == id)) { continue; } var geoData = feature.GeoJSONDictionary; if (geoData == null) { continue; } IFeature ifeat = null; if (feature is MGLPointFeature) { ifeat = new PointFeature(); (ifeat as PointFeature).Title = ((MGLPointFeature)feature).Title; (ifeat as PointFeature).SubTitle = ((MGLPointFeature)feature).Subtitle; (ifeat as PointFeature).Coordinate = TypeConverter.FromCoordinateToPosition(((MGLPointFeature)feature).Coordinate); } else { var geometry = geoData ["geometry"]; NSArray coorArr = null; var coordinates = (geometry as NSDictionary) ["coordinates"]; if (coordinates != null && coordinates is NSArray) { coorArr = coordinates as NSArray; } if (feature is MGLPolylineFeature) { ifeat = new PolylineFeature(); (ifeat as PolylineFeature).Title = ((MGLPolylineFeature)feature).Title; (ifeat as PolylineFeature).SubTitle = ((MGLPolylineFeature)feature).Subtitle; if (coorArr != null) { var coorsList = new List <Position>(); (ifeat as PolylineFeature).Coordinates = new Position [coorArr.Count]; for (nuint i = 0; i < coorArr.Count; i++) { var childArr = coorArr.GetItem <NSArray> (i); if (childArr != null && childArr.Count == 2) { var coord = new Position(childArr.GetItem <NSNumber> (1).DoubleValue, //lat childArr.GetItem <NSNumber> (0).DoubleValue); //long coorsList.Add(coord); } } (ifeat as PolylineFeature).Coordinates = new ObservableCollection <Position>(coorsList); } } else if (feature is MGLMultiPolylineFeature) { ifeat = new MultiPolylineFeature(); (ifeat as MultiPolylineFeature).Title = ((MGLMultiPolylineFeature)feature).Title; (ifeat as MultiPolylineFeature).SubTitle = ((MGLMultiPolylineFeature)feature).Subtitle; if (coorArr != null) { (ifeat as MultiPolylineFeature).Coordinates = new Position [coorArr.Count] []; for (nuint i = 0; i < coorArr.Count; i++) { var childArr = coorArr.GetItem <NSArray> (i); if (childArr != null) { (ifeat as MultiPolylineFeature).Coordinates [i] = new Position [childArr.Count]; for (nuint j = 0; j < childArr.Count; j++) { var anscArr = childArr.GetItem <NSArray> (j); if (anscArr != null && anscArr.Count == 2) { (ifeat as MultiPolylineFeature).Coordinates [i] [j] = new Position(anscArr.GetItem <NSNumber> (1).DoubleValue, //lat anscArr.GetItem <NSNumber> (0).DoubleValue); } } } } } } } if (ifeat != null) { (ifeat as Annotation).Id = id; ifeat.Attributes = ConvertDictionary(feature.Attributes); output.Add(ifeat); } } return(output.ToArray()); }; Element.ResetPositionFunc = new Command((arg) => { MapView.ResetPosition(); }); Element.ReloadStyleFunc = new Command((arg) => { MapView.ReloadStyle(MapView); }); Element.UpdateShapeOfSourceFunc = (Annotation annotation, string sourceId) => { if (annotation != null && !string.IsNullOrEmpty(sourceId)) { var mglSource = MapView.Style.SourceWithIdentifier((NSString)("NXCustom_" + sourceId)); if (mglSource != null && mglSource is MGLShapeSource) { (mglSource as MGLShapeSource).Shape = ShapeFromAnnotation(annotation); if (Element.MapStyle.CustomSources != null) { var count = Element.MapStyle.CustomSources.Count(); for (var i = 0; i < count; i++) { if (Element.MapStyle.CustomSources.ElementAt(i).Id == sourceId) { Element.MapStyle.CustomSources.ElementAt(i).Shape = annotation; break; } } } return(true); } } return(false); }; Element.UpdateLayerFunc = (string layerId, bool isVisible, bool IsCustom) => { if (!string.IsNullOrEmpty(layerId)) { NSString layerIdStr = IsCustom ? (NSString)("NXCustom_" + layerId) : (NSString)layerId; var layer = MapView.Style.LayerWithIdentifier(layerIdStr); if (layer != null) { layer.Visible = isVisible; if (IsCustom && Element.MapStyle.CustomLayers != null) { var count = Element.MapStyle.CustomLayers.Count(); for (var i = 0; i < count; i++) { if (Element.MapStyle.CustomLayers.ElementAt(i).Id == layerId) { Element.MapStyle.CustomLayers.ElementAt(i).IsVisible = isVisible; break; } } } return(true); } } return(false); }; }
protected void SetupFunctions() { Element.TakeSnapshotFunc = () => { var image = MapView.Capture(true); var imageData = image.AsJPEG(); Byte[] imgByteArray = new Byte[imageData.Length]; System.Runtime.InteropServices.Marshal.Copy(imageData.Bytes, imgByteArray, 0, Convert.ToInt32(imageData.Length)); return(imgByteArray); }; Element.GetFeaturesAroundPointFunc = (Point point, double radius, string[] layers) => { var selectableLayers = SelectableLayersFromSources(layers); NSObject[] features; var cgPoint = new CGPoint((nfloat)point.X, (nfloat)point.Y); if (radius <= 0) { features = MapView.VisibleFeaturesAtPoint(cgPoint, selectableLayers); } else { var rect = new CGRect(cgPoint.X - (nfloat)radius, cgPoint.Y - (nfloat)radius, (nfloat)radius * 2, (nfloat)radius * 2); features = MapView.VisibleFeaturesInRect(rect, selectableLayers); } var output = new List <IFeature>(); foreach (NSObject obj in features) { var feature = obj as IMGLFeature; if (feature == null || feature.Attributes == null) { continue; } string id = null; if (feature.Identifier != null) { if (feature.Identifier is NSNumber) { id = ((NSNumber)feature.Identifier).StringValue; } else { id = feature.Identifier.ToString(); } } if (id == null || output.Any((arg) => (arg as Annotation).Id == id)) { continue; } var geoData = feature.GeoJSONDictionary; if (geoData == null) { continue; } IFeature ifeat = null; if (feature is MGLPointFeature) { ifeat = new PointFeature(); (ifeat as PointFeature).Title = ((MGLPointFeature)feature).Title; (ifeat as PointFeature).SubTitle = ((MGLPointFeature)feature).Subtitle; (ifeat as PointFeature).Coordinate = TypeConverter.FromCoordinateToPosition(((MGLPointFeature)feature).Coordinate); } else { var geometry = geoData["geometry"]; NSArray coorArr = null; var coordinates = (geometry as NSDictionary)["coordinates"]; if (coordinates != null && coordinates is NSArray) { coorArr = coordinates as NSArray; } if (feature is MGLPolylineFeature) { ifeat = new PolylineFeature(); (ifeat as PolylineFeature).Title = ((MGLPolylineFeature)feature).Title; (ifeat as PolylineFeature).SubTitle = ((MGLPolylineFeature)feature).Subtitle; if (coorArr != null) { var coorsList = new List <Position>(); (ifeat as PolylineFeature).Coordinates = new Position[coorArr.Count]; for (nuint i = 0; i < coorArr.Count; i++) { var childArr = coorArr.GetItem <NSArray>(i); if (childArr != null && childArr.Count == 2) { var coord = new Position(childArr.GetItem <NSNumber>(1).DoubleValue, //lat childArr.GetItem <NSNumber>(0).DoubleValue); //long coorsList.Add(coord); } } (ifeat as PolylineFeature).Coordinates = new ObservableCollection <Position>(coorsList); } } else if (feature is MGLMultiPolylineFeature) { ifeat = new MultiPolylineFeature(); (ifeat as MultiPolylineFeature).Title = ((MGLMultiPolylineFeature)feature).Title; (ifeat as MultiPolylineFeature).SubTitle = ((MGLMultiPolylineFeature)feature).Subtitle; if (coorArr != null) { (ifeat as MultiPolylineFeature).Coordinates = new Position[coorArr.Count][]; for (nuint i = 0; i < coorArr.Count; i++) { var childArr = coorArr.GetItem <NSArray>(i); if (childArr != null) { (ifeat as MultiPolylineFeature).Coordinates[i] = new Position[childArr.Count]; for (nuint j = 0; j < childArr.Count; j++) { var anscArr = childArr.GetItem <NSArray>(j); if (anscArr != null && anscArr.Count == 2) { (ifeat as MultiPolylineFeature).Coordinates[i][j] = new Position(anscArr.GetItem <NSNumber>(1).DoubleValue, //lat anscArr.GetItem <NSNumber>(0).DoubleValue); } } } } } } } if (ifeat != null) { (ifeat as Annotation).Id = id; ifeat.Attributes = ConvertDictionary(feature.Attributes); output.Add(ifeat); } } return(output.ToArray()); }; Element.ResetPositionAction = () => { MapView.ResetPosition(); }; Element.ReloadStyleAction = () => { MapView.ReloadStyle(MapView); }; Element.UpdateShapeOfSourceFunc = (Annotation annotation, string sourceId) => { if (annotation != null && !string.IsNullOrEmpty(sourceId)) { var mglSource = MapView.Style.SourceWithIdentifier(sourceId.ToCustomId()); if (mglSource != null && mglSource is MGLShapeSource) { Device.BeginInvokeOnMainThread(() => { (mglSource as MGLShapeSource).Shape = ShapeFromAnnotation(annotation); }); if (Element.MapStyle.CustomSources != null) { var count = Element.MapStyle.CustomSources.Count(); for (var i = 0; i < count; i++) { if (Element.MapStyle.CustomSources.ElementAt(i).Id == sourceId) { Element.MapStyle.CustomSources.ElementAt(i).Shape = annotation; break; } } } return(true); } } return(false); }; Element.UpdateLayerFunc = (string layerId, bool isVisible, bool IsCustom) => { if (!string.IsNullOrEmpty(layerId)) { NSString layerIdStr = IsCustom ? layerId.ToCustomId() : (NSString)layerId; var layer = MapView.Style.LayerWithIdentifier(layerIdStr); if (layer != null) { layer.Visible = isVisible; if (IsCustom && Element.MapStyle.CustomLayers != null) { var count = Element.MapStyle.CustomLayers.Count(); for (var i = 0; i < count; i++) { if (Element.MapStyle.CustomLayers.ElementAt(i).Id == layerId) { Element.MapStyle.CustomLayers.ElementAt(i).IsVisible = isVisible; break; } } } return(true); } } return(false); }; Element.UpdateViewPortAction = (Position centerLocation, double?zoomLevel, double?bearing, bool animated, Action completionBlock) => { MapView.SetCenterCoordinate( centerLocation?.ToCLCoordinate() ?? MapView.CenterCoordinate, zoomLevel ?? MapView.ZoomLevel, bearing ?? MapView.Direction, animated, completionBlock ); }; //Element.GetMapScaleReciprocalFunc = () => { // if (MapView == null) return 500000000; // System.Diagnostics.Debug.WriteLine($"Center latitude: {MapView.CenterCoordinate.Latitude}"); // var metersPerPoint = MapView.MetersPerPointAtLatitude(MapView.CenterCoordinate.Latitude); // System.Diagnostics.Debug.WriteLine($"metersPerPoint: {metersPerPoint}"); // var resolution = metersPerPoint / Math.Pow(2, MapView.ZoomLevel); // System.Diagnostics.Debug.WriteLine($"resolution: {resolution}"); // var output = UIDeviceExtensions.DPI() * 39.37 * resolution; // return output; //}; Element.ToggleScaleBarFunc = (bool show) => { if (MapView == null || MapView.ScaleBar == null) { return(false); } InvokeOnMainThread(() => { System.Diagnostics.Debug.WriteLine($"Toggle scale bar: {show}"); MapView.ScaleBar.Hidden = !show; }); return(true); }; Element.GetStyleImageFunc = (imageName) => { if (string.IsNullOrEmpty(imageName) || MapView == null || MapView.Style == null) { return(null); } return(MapView.Style.ImageForName(imageName)?.AsPNG().ToArray()); }; Element.GetStyleLayerFunc = (string layerId, bool isCustom) => { if (string.IsNullOrEmpty(layerId) || MapView == null || MapView.Style == null) { return(null); } NSString layerIdStr = isCustom ? layerId.ToCustomId() : (NSString)layerId; var layer = MapView.Style.LayerWithIdentifier(layerIdStr); if (layer is MGLVectorStyleLayer vLayer) { return(CreateStyleLayer(vLayer, layerId)); } return(null); }; }