ThinkGeo.com    |     Documentation    |     Premium Support

Date range style

Hi guys,


We display points shapfiles in our map and we'd like to have an option where the user select a range of dates for which he wants to see the points (and at the same time, hide the points that don't fit in the range). All of our shapefiles have a "TIMETAG" column that contains the date value for each point.


Can we do this using a style? Or is there any other solution?


Thank you,



 


Marc,
Welcome to Map Suite discussion forum, any questions please feel free to post here.
There are two ways to manage it.
1.       ClassBreakStyle is right for you, but it uses “Double” for compare. I think we can make a CustomClassBreakStyle inherited from ClassBreakStyle to overwrite the DrawCore method to make sure it can apply to DateTime. Things in my mind are that we can add a new Column or change the “TIMETAG” column value to double before DrawCore method. This is the simpler way I think.

public class CustomClassBreakStyle : ClassBreakStyle
    {
        public CustomClassBreakStyle(string columnName)
            : this(columnName, BreakValueInclusion.IncludeValue)
        {
        }
 
        public CustomClassBreakStyle(string columnName, BreakValueInclusion breakValueInclusion)
            : this(columnName, breakValueInclusion, new Collection<ClassBreak>())
        {
        }
 
        public CustomClassBreakStyle(string columnName, BreakValueInclusion breakValueInclusion, Collection<ClassBreak> classBreaks)
            : base(columnName, breakValueInclusion, classBreaks)
        {
        }
 
        protected override void DrawCore(System.Collections.Generic.IEnumerable<Feature> features, GeoCanvas canvas, System.Collections.ObjectModel.Collection<SimpleCandidate> labelsInThisLayer, System.Collections.ObjectModel.Collection<SimpleCandidate> labelsInAllLayers)
        {
            // Change the "TIMETAG" value to double type
            foreach (Feature feature in features)
            {
                string dateTime = feature.ColumnValues["TIMETAG"];
                double OADate = Convert.ToDateTime(dateTime).ToOADate();
                feature.ColumnValues["TIMETAG"] = OADate.ToString(System.Globalization.CultureInfo.InvariantCulture);
            }
 
            base.DrawCore(features, canvas, labelsInThisLayer, labelsInAllLayers);
        }
}


2.       Another way is doing the spatial query to filter the features by Date Range. Please refer to the installation sample “QueryingFeatureLayers/ExecuteASqlQuery.aspx” for detail.
 
Thanks,
Johnny

Hi! 
  
 Thanks for the quick and detailed answer! 
  
 Your solution gave me an idea: because we’re controlling the creation of the shapefiles I’ve decided to add a “TIMETAG2” column to the attributes table that contains the date and time in “OADate” format (float value). Once the start date and end date are selected I apply class break styles this way: 
  
                 
                layer.ZoomLevelSet.ZoomLevel01.CustomStyles.Clear();
                ClassBreakStyle dateClassBreakStyle = new ClassBreakStyle();
                dateClassBreakStyle.ColumnName = “TIMETAG2”;
                dateClassBreakStyle.BreakValueInclusion = BreakValueInclusion.IncludeValue;
                dateClassBreakStyle.ClassBreaks.Add(new ClassBreak(StartDateCalendarExtender.SelectedDate.Value.ToOADate(), new
                  PointStyle(PointSymbolType.Circle, new GeoSolidBrush(currentColor), 2)));
                dateClassBreakStyle.ClassBreaks.Add(new ClassBreak(EndDateCalendarExtender.SelectedDate.Value.ToOADate(), new 
                  PointStyle(PointSymbolType.Circle, new GeoSolidBrush(currentColor), 0)));
                layer.ZoomLevelSet.ZoomLevel01.CustomStyles.Add(dateClassBreakStyle);
                layer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
 
 
  
 By the way…in the implementation of the DrawCore method in your solution, the date conversion part (Convert.ToDateTime(dateTime).ToOADate()) does not work because the value returned by feature.ColumnValues[“TIMETAG”] is formatted like this “YYYYMMDD”. It’s already been mentioned in the post here: gis.thinkgeo.com/Support/DiscussionForums/tabid/143/aff/12/aft/7685/afv/topic/Default.aspx#20731  
  
 …just thought you’d be interested to know! 
  
 Thanks again for your support! 
  
 Marc

Marc, 
  
 Thanks for sharing your experience, which makes me know more about Dbf and DateTime. 
  
 Thanks again 
  
 Johnny