This is a migrated thread and some comments may be shown as answers.

How do you bind information layers at runtime

1 Answer 198 Views
Map
This is a migrated thread and some comments may be shown as answers.
FieldTRAKS
Top achievements
Rank 1
FieldTRAKS asked on 01 Apr 2011, 02:15 AM
Our application has user defined objects so we do not know the information layers or the geometry type until run time. We are using MVVM and I am struggling to find a way to bind several information layers and then to use the itemtemplateselector to decide wether the data should be displayed as mappolygon, mappolyline or mappoint.

I eventually gave up and tried to just get my polygons to show in a pre-existing information layer

However, nothing displays on the map. What am I am doing wrong???? I want to be able to bind any collection of mny viewmodels that implement the interfaces described below.

public interface IPolygon
 {
    Telerik.Windows.Controls.Map.Location[] Points {get;set; }
 }
 
 
 public interface IPolyline
 {
     Telerik.Windows.Controls.Map.Location[] Points { get; set; }
 }
 
 public interface IPoint
 {
     Telerik.Windows.Controls.Map.Location Point { get; set; }
 }

Here is a sample class that I implement it on

  
   
public class PolygonObjectDataViewModel : ObjectDataViewModel, IPolygon
    {
        long _geopid;
 
        public PolygonObjectDataViewModel(ObjectActivity oa, bool multi, long geoid)
            : base(oa, multi)
        {
            _geopid = geoid;
        }
 
 
 
        public Telerik.Windows.Controls.Map.Location[] Points
        {
            get
            {
                try
                {
                    string geometry = Activity.Data.First(x => x.Pid == _geopid).Value;
                    return ConvertWKTPolygonToLocationArray(geometry);
                }
                catch
                {
                    return null;
                }
            }
            set
            {
                throw new NotImplementedException();
            }
        }
 
        private Telerik.Windows.Controls.Map.Location[] ConvertWKTPolygonToLocationArray(string geometry)
        {
            List<Telerik.Windows.Controls.Map.Location> temp = new List<Telerik.Windows.Controls.Map.Location>();
            List<string> groups = new List<string>();
            if (geometry.ToLower().StartsWith("multi"))
            {
 
                geometry = geometry.Replace("MULTIPOLYGON(((", "");
                geometry = geometry.Replace("MULTIPOLYGON (((", "");
                geometry = geometry.Replace(")))", "");
                groups.AddRange(System.Text.RegularExpressions.Regex.Split(geometry, "\\)\\)\\,\\(\\("));
            }
 
            else
            {
                geometry = geometry.Replace("POLYGON((", "");
                geometry = geometry.Replace("POLYGON ((", "");
                geometry = geometry.Replace("))", "");
                groups.Add(geometry);
            }
 
            foreach (string group in groups)
            {
                string[] pairs = group.Split(',');
                foreach (string pair in pairs)
                {
                    string[] coords = pair.Trim().Split(' ');
                    Telerik.Windows.Controls.Map.Location l = new Telerik.Windows.Controls.Map.Location(double.Parse(coords[1]), double.Parse(coords[0]));
 
                    temp.Add(l);
                }
            }
 
            return temp.ToArray();
        }
    }





Here is the datatemplate that the itemtemplateselector finds (I checked it using a debug converter to check the value the binding passes and it is indeed passing a valid Location[] object)

 
<DataTemplate x:Key="PolygonObjectDataViewModel">
<telerik:MapPolygon    Points="{Binding Points,Converter={StaticResource debug}}" Stroke="Yellow"  StrokeThickness="2"/>
</DataTemplate>


this is what is in my view (the itemssource binding points to a List<PolygonObjectDataViewModel>)

 
  <telerik:RadMap  UseSpringAnimations="False" Grid.Row="2" Provider="{Binding Provider}"   MouseLeftButtonDown="map_MouseLeftButtonDown"  ZoomLevel="14"   VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Center="{Binding Center}" Name="map" >
      <telerik:InformationLayer Visibility="Visible" ItemTemplateSelector="{Binding Source={StaticResource selector}}"     ItemsSource="{Binding Path=Polygons}" >
 </telerik:InformationLayer>
</telerik:RadMap>

1 Answer, 1 is accepted

Sort by
0
FieldTRAKS
Top achievements
Rank 1
answered on 01 Apr 2011, 04:25 PM
I figured out the display issue...my interface is specifies Location[] and should be specifying a LocationCollection....my polygons are now displaying....
Tags
Map
Asked by
FieldTRAKS
Top achievements
Rank 1
Answers by
FieldTRAKS
Top achievements
Rank 1
Share this question
or