Search code examples
windows-phone-7dictionarypushpin

Pushpin size at WP7 map control


while trying to implement logic that show current user location i encountered an issue.

<Maps:Pushpin Location="{Binding MyLocation}" Canvas.ZIndex="1000" PositionOrigin="Center"  >
            <Maps:Pushpin.Template>
                <ControlTemplate>
                    <Grid>
                        <Ellipse Width="{Binding MyAccuracyViewSize}" Height="{Binding MyAccuracyViewSize}"
                                 Fill="#60008000" Stroke="Green" StrokeThickness="3"/>
                        <Ellipse Width="18" Height="18" Fill="#A0FF4500" VerticalAlignment="Center" HorizontalAlignment="Center"  />
                    </Grid>
                </ControlTemplate>
            </Maps:Pushpin.Template>
        </Maps:Pushpin>

Bigger green circle shows accuracy area. Its size in pixels varies depending on zoom. If zoom level is big - it becomes rather big (> 480 pixels). At that point it gets cropped by screen resolution. AFAIK WP7 restriction is 2000x2000 px for control size.

Seems that this is a kind of a map control restriction.

Any ideas how to remove this restriction to show ellipse of size up to 2000x2000 px?

Screenshot with this behavior

Thanks!


Solution

  • How about MapPolygon?

    void OnPositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
            {
                SecondsCounter = 0; //reset counter
                double accuracy = e.Position.Location.HorizontalAccuracy;
            if (accuracy < e.Position.Location.VerticalAccuracy)
            {
                accuracy = e.Position.Location.VerticalAccuracy;
            }
    
            if (PolyCircle == null)
            {
                PolyCircle = new MapPolygon();
                PolyCircle.Opacity = 0.7;
                //Set the polygon properties 
    
                PolyCircle.Fill = new SolidColorBrush(Colors.Orange);
                PolyCircle.Stroke = new SolidColorBrush(Colors.Purple);
                PolyCircle.StrokeThickness = 4;
    
                map1.Children.Add(PolyCircle);
            }
    
            PolyCircle.Locations = CreateCircle(e.Position.Location, accuracy);
    
    
            map1.Center = e.Position.Location;    
    
        }
    
        public static double ToRadian(double degrees)
        {
            return degrees * (Math.PI / 180);
        }
    
        public static double ToDegrees(double radians)
        {
            return radians * (180 / Math.PI);
        }
    
        public static LocationCollection CreateCircle(GeoCoordinate center, double radius)
        {
            var earthRadius = 6367000; // radius in meters
            var lat = ToRadian(center.Latitude); //radians
            var lng = ToRadian(center.Longitude); //radians
            var d = radius / earthRadius; // d = angular distance covered on earth's surface
            var locations = new LocationCollection();
    
            for (var x = 0; x <= 360; x++)
            {
                var brng = ToRadian(x);
                var latRadians = Math.Asin(Math.Sin(lat) * Math.Cos(d) + Math.Cos(lat) * Math.Sin(d) * Math.Cos(brng));
                var lngRadians = lng + Math.Atan2(Math.Sin(brng) * Math.Sin(d) * Math.Cos(lat), Math.Cos(d) - Math.Sin(lat) * Math.Sin(latRadians));
    
                locations.Add(new GeoCoordinate(ToDegrees(latRadians), ToDegrees(lngRadians)));
            }
    
            return locations;
        }
    

    More here, in My Map position example. Good luck!