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);
        }
Beispiel #2
0
        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);
            };
        }