Yesterday I experimented the following error displaying some pushpins on a map using the great Joost library:
public static void Set_WpWinNl_Maps_MapShapeDrawBehavior_ItemsSource(global::WpWinNl.Maps.MapShapeDrawBehavior obj, global::System.Collections.Generic.IEnumerable<global::System.Object> value, string targetNullValue) { if (value == null && targetNullValue != null) { value = (global::System.Collections.Generic.IEnumerable<global::System.Object>) global::Windows.UI.Xaml.Markup.XamlBindingHelper.ConvertValue(typeof(global::System.Collections.Generic.IEnumerable<global::System.Object>), targetNullValue); } <strong>obj.ItemsSource = value;</strong> }
InnerException: “Value does not fall within the expected range.”
Strack trace:
at Windows.Devices.Geolocation.Geopoint..ctor(BasicGeoposition position) at WpWinNl.Maps.MapIconDrawer.CreateShape(Object viewModel, BasicGeoposition pos) at WpWinNl.Maps.MapShapeDrawBehavior.CreateDrawable(Object viewModel, Object locationData) at WpWinNl.Maps.MapShapeDrawBehavior.CreateShape(Object viewModel) at WpWinNl.Maps.MapShapeDrawBehavior.AddNewShapes(IEnumerable viewModels) at WpWinNl.Maps.MapShapeDrawBehavior.ItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) at Windows.UI.Xaml.DependencyObject.SetValue(DependencyProperty dp, Object value) at WpWinNl.Maps.MapShapeDrawBehavior.set_ItemsSource(IEnumerable`1 value) at Urbelog10.Views.MainPage.XamlBindingSetters.Set_WpWinNl_Maps_MapShapeDrawBehavior_ItemsSource(MapShapeDrawBehavior obj, IEnumerable`1 value, String targetNullValue) at Urbelog10.Views.MainPage.MainPage_obj1_Bindings.Update_ViewModel_Pushpins(ObservableCollection`1 obj, Int32 phase) at Urbelog10.Views.MainPage.MainPage_obj1_Bindings.Update_ViewModel(MainPageViewModel obj, Int32 phase) at Urbelog10.Views.MainPage.MainPage_obj1_Bindings.Update_(MainPage obj, Int32 phase) at Urbelog10.Views.MainPage.MainPage_obj1_Bindings.Update()
Because I received the coordinates walues from REST service that I converted in BasicGeopositions (no error in the creation of that objects), I started to think that there could be a “strange” limitation in the number of pushpins that one can ask to be displayed with that library (may be for performance reasons) …
Then I realized that the problem came from the REST service that give one position where the comma is missing in the latitude and longitude values!!
{ ..., "latitude": 451390400000000, "longitude": 77703090000000, ... }
What I found strange is that the conversion from lat/long to BasicGeoposition did not arise an error when creating the object with not valid latitude and longitude values …
bizEntity.GeoPosition = new BasicGeoposition { Altitude = 0, Latitude = dcEntity.latitude, Longitude = dcEntity.longitude };
But I realized that you can put whatever value to a BasicGeoposition object … they are simply Double and there is no check of consistency!! I supposed that some check would done … but on the contrary BasicGeoposition is a simple struct without a constructor that could make some check … so I I realized that I have to do myself a check of the incoming data. before creating each BasicGeoposition object … and possibly make that data consistent …
namespace Windows.Devices.Geolocation { [ContractVersion(typeof(UniversalApiContract), 65536)] public struct BasicGeoposition { public System.Double Altitude; public System.Double Latitude; public System.Double Longitude; } }
This is a possible way to do the applopriate check in order to be sure that a created BasicGeoposition object is a valid one:
//public Double latitude { get; set; } private Double _latitude; public Double latitude { get { return _latitude; } set { if (value < -90 || value > 90) { throw new ArgumentOutOfRangeException("Latitude must be between -90 and 90 degrees inclusive."); // or whatever } _latitude = value; } } //public Double longitude { get; set; } private Double _longitude; public Double longitude { get { return _longitude; } set { if (value < -180 || value > 180) { throw new ArgumentOutOfRangeException("Longitude must be between -180 and 180 degrees inclusive.");// or whatever } _longitude = value; } }
😉