public void DataFill(CrimeReport[] reports)
        {
            foreach (var report in reports)
            {
                var toAdd = new List <CustomPin>();

                if (pins.IndexOf(report.DCN) == -1)
                {
                    var pin = new CustomPin
                    {
                        Pin = new Pin
                        {
                            Type     = PinType.Place,
                            Position = new Position(report.Latitutde.Value, report.Longitude.Value),
                            Label    = report.Title,
                            Address  = report.Address
                        },
                        Id        = report.DCN,
                        Url       = "http://xamarin.com/about/",
                        Occurred  = report.Occurred.GetValueOrDefault().ToString("dddd M/d h:mm tt"),
                        CrimeType = report.Type
                    };

                    pins.Add(report.DCN);
                    toAdd.Add(pin);
                }

                Device.BeginInvokeOnMainThread(() =>
                {
                    MyMap.CustomPins.AddRange(toAdd);

                    //Throw all the new pins on at once.
                    foreach (CustomPin pin in toAdd)
                    {
                        // On iOS we're doing the checking of pin
                        // type using the renderer.  But on Droid
                        // this is next to impossible because
                        // we can't get to the pin collection when
                        // a pin is added to adjust the icon
                        // that Xamarin.Forms.Maps sets by default :-(
                        Device.OnPlatform(() =>
                        {
                            MyMap.Pins.Add(pin.Pin);
                        },
                                          () =>
                        {
#pragma warning disable IDE0004 // Remove Unnecessary Cast
                            MessagingCenter.Send <CrimesNearMeView, CustomPin>((CrimesNearMeView)this, "DroidPin", pin);
#pragma warning restore IDE0004 // Remove Unnecessary Cast
                        }, null, null);
                    }
                });
            }
        }
        public CrimeDetailPage(CustomPin pin)
        {
            _pin  = pin;
            _type = pin.CrimeType;
            InitializeComponent();

            Appearing += (object sender, EventArgs e) =>
            {
                SetupMessaging();
            };
            Disappearing += (object sender, EventArgs e) =>
            {
                TeardownMessaging();
            };

            GetCrimeDetails();
        }
        public CrimeDetailPage(string dcn, CrimeType crimeType)
        {
            _pin    = new CustomPin();
            _pin.Id = dcn;
            _type   = crimeType;
            InitializeComponent();

            Appearing += (object sender, EventArgs e) =>
            {
                SetupMessaging();
            };
            Disappearing += (object sender, EventArgs e) =>
            {
                TeardownMessaging();
            };

            GetCrimeDetails();
        }
        public CrimeDetailPage(CrimeReport report)
        {
            _pin    = new CustomPin();
            _pin.Id = report.DCN;
            _type   = report.Type;
            InitializeComponent();

            Appearing += (object sender, EventArgs e) =>
            {
                SetupMessaging();
            };
            Disappearing += (object sender, EventArgs e) =>
            {
                TeardownMessaging();
            };

            GetCrimeDetails();
        }
        public void DataFill(CrimeReport[] reports)
        {
            foreach (var report in reports)
            {
                // Some shit is geocoded badly or not at all by police.  I have no choice here
                // but to skip those records for map display
                if (report.Latitutde.Value == 0.00 || report.Longitude.Value == 0.00)
                {
                    continue;
                }

                // Calculate maximum and minimum latitude of data
                var maxLat  = _crimes.Max(p => p.Latitutde);
                var minLat  = _crimes.Min(p => p.Latitutde);
                var maxLong = _crimes.Max(p => p.Longitude);
                var minLong = _crimes.Min(p => p.Longitude);

                // The center is going to be the halfway point between x1<->x2 and y1<->y2
                var latC  = minLat + (Math.Abs(maxLat.Value - minLat.Value) / 2);
                var longC = minLong + (Math.Abs(maxLong.Value - minLong.Value) / 2);

                //MyMap.MoveToRegion(MapSpan.FromCenterAndRadius(new Position(latC.Value, longC.Value), Distance.FromMiles(2)));

                MapSpan span = new MapSpan(new Position(latC.Value, longC.Value), Math.Abs(maxLat.Value - minLat.Value) + 0.01,
                                           Math.Abs(maxLong.Value - minLong.Value) + 0.01);
                MyMap.MoveToRegion(span);


                var toAdd = new List <CustomPin>();

                if (pins.IndexOf(report.DCN) == -1)
                {
                    var pin = new CustomPin
                    {
                        Pin = new Pin
                        {
                            Type     = PinType.Place,
                            Position = new Position(report.Latitutde.Value, report.Longitude.Value),
                            Label    = report.Title,
                            Address  = report.Address
                        },
                        Id        = report.DCN,
                        Url       = "http://xamarin.com/about/",
                        Occurred  = report.Occurred.GetValueOrDefault().ToString("dddd M/d h:mm tt"),
                        CrimeType = report.Type
                    };

                    pins.Add(report.DCN);
                    toAdd.Add(pin);
                }

                Device.BeginInvokeOnMainThread(() =>
                {
                    MyMap.CustomPins.AddRange(toAdd);

                    //Throw all the new pins on at once.
                    foreach (CustomPin pin in toAdd)
                    {
                        // On iOS we're doing the checking of pin
                        // type using the renderer.  But on Droid
                        // this is next to impossible because
                        // we can't get to the pin collection when
                        // a pin is added to adjust the icon
                        // that Xamarin.Forms.Maps sets by default :-(
                        Device.OnPlatform(() =>
                        {
                            MyMap.Pins.Add(pin.Pin);
                        },
                                          () =>
                        {
#pragma warning disable IDE0004 // Remove Unnecessary Cast
                            MessagingCenter.Send <SearchResultsMap, CustomPin>((SearchResultsMap)this, "DroidPin", pin);
#pragma warning restore IDE0004 // Remove Unnecessary Cast
                        }, null, null);
                    }
                });
            }
        }