ThinkGeo.com    |     Documentation    |     Premium Support

Highway number symbol

I need to add a symbol to a line layer.  The symbol is the highway shield.  Additionally I need to add the text from a filed in the line shapefile with the highway number.  I need to filter so that only lines with the value "HIGHWAY" in a particular column will be displayed with the highway symbol.  I know I need a TextSymbol for the highway number, but I do not know how to get the highway shield in.  Is there a bitmap for this? How do you add a symbol to the line?


Thanks.


Elisa



First of all, I let you know that we have an extention World Map Kit with all the symbology done for you with detailed road data for the USA. gis.thinkgeo.com/Products/Ex...fault.aspx


If you want to show highway shields for your own data as you describe, you would need to use the IconValueStyle. I can show you some sample code on how to use and I think that you will figure out how to adapt it for your data.


For the higway icons themselves, you can get the icon libray from us and you will find many icons for different countries. If you don't find the style you need, we can customize that for you. gis.thinkgeo.com/Products/St...fault.aspx


 



 private IconValueStyle GetHighwayIconValueStyle()
        {
            IconValueStyle iconValueStyle = new IconValueStyle("SymbolType");

            IconValueItem item1 = new IconValueItem("R", dataFolder + @"\Images\ushwy-1.gif", new TextStyle("fename", new GeoFont("Arial", 8, DrawingFontStyles.Bold), new GeoSolidBrush(GeoColor.StandardColors.Black)));
            item1.TextValueLengthMin = 1;
            item1.TextValueLengthMax = 5;

            IconValueItem item2 = new IconValueItem("I", dataFolder + @"\Images\Interstate_ThinOutline_Wide.gif", new TextStyle("fename", new GeoFont("Arial", 8, DrawingFontStyles.Bold), new GeoSolidBrush(GeoColor.StandardColors.White)));
            item2.TextValueLengthMin = 1;
            item2.TextValueLengthMax = 5;

            iconValueStyle.IconValueItems.Add(item1);
            iconValueStyle.IconValueItems.Add(item2);

            iconValueStyle.GridSize = 200;
            iconValueStyle.TextLineSegmentRatio = 10;
            iconValueStyle.DuplicateRule = LabelDuplicateRule.OneDuplicateLabelPerQuadrant;
            iconValueStyle.OverlappingRule = LabelOverlappingRule.NoOverlapping;

            return iconValueStyle;
        }


Hi Val 
  
 Thank you for the above example,I have implemented and have it working, however i erratically get the following error message. 
  
 As i mentions,the error is erratic, but should i increase the TextLineSegmentRatio or decrease the GridSize it occurs more often 
  
 System.NullReferenceException was unhandled 
   HResult=-2147467261 
   Message=Object reference not set to an instance of an object. 
   Source=WpfDesktopEdition 
   StackTrace: 
        at ThinkGeo.MapSuite.WpfDesktopEdition.Tile.<>c__DisplayClass6.<DrawException>b__4() 
        at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 
        at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) 
        at System.Windows.Threading.DispatcherOperation.InvokeImpl() 
        at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
        at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
        at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
        at System.Windows.Threading.DispatcherOperation.Invoke() 
        at System.Windows.Threading.Dispatcher.ProcessQueue() 
        at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
        at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
        at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) 
        at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 
        at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) 
        at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs) 
        at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) 
        at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) 
        at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) 
        at System.Windows.Application.RunInternal(Window window) 
        at System.Windows.Application.Run() 
        at MarketScopeV4.App.Main() in d:\Development\App\MarketScopeV4\MarketScopeV4\obj\Debug\App.g.cs:line 0 
        at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
        at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
        at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
        at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
        at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
        at System.Threading.ThreadHelper.ThreadStart() 
   InnerException:  
  
 Herewith my sample code. 
  
   IconValueStyle iconValueStyle = new IconValueStyle("Shield"); 
  
                 IconValueItem item1 = new IconValueItem("N", @"Resources\Shields\N.PNG", new TextStyle("SHIELDNUM", new GeoFont("Arial", 8, DrawingFontStyles.Bold), new GeoSolidBrush(GeoColor.StandardColors.White))); 
                 item1.TextValueLengthMin = 1; 
                 item1.TextValueLengthMax = 5; 
  
                 IconValueItem item2 = new IconValueItem("M", @"Resources\Shields\W.PNG", new TextStyle("NAME", new GeoFont("Arial", 8, DrawingFontStyles.Bold), new GeoSolidBrush(GeoColor.StandardColors.White))); 
                 item2.TextValueLengthMin = 1; 
                 item2.TextValueLengthMax = 5; 
  
                 IconValueItem item3 = new IconValueItem("R", @"Resources\Shields\GB.PNG", new TextStyle("NAME", new GeoFont("Arial", 8, DrawingFontStyles.Bold), new GeoSolidBrush(new GeoColor(255, 250, 220, 12)))); 
                 item3.TextValueLengthMin = 1; 
                 item3.TextValueLengthMax = 5; 
  
                 iconValueStyle.IconValueItems.Add(item1); 
                 iconValueStyle.IconValueItems.Add(item2); 
                 iconValueStyle.IconValueItems.Add(item3); 
  
                  iconValueStyle.GridSize = 200; 
                 iconValueStyle.TextLineSegmentRatio = 10; 
               
                 iconValueStyle.SuppressPartialLabels = true; 
  
 Please advise 

Hi Meyer,



I tried to recreate the issue, but seems it is hard to do this as it is related with threads. Would you please try the attached sample to recreate it?



Thanks,

Troy


DisplayASimpleMapForWPF_Post7433.zip (24.7 KB)

Hi Troy 
  
 I am unable to reproduce the error with the attached sample, however the road network I am using has 2.1 million road segments. 
  
 Could this be the cause? 
  
 Please see the extract from my code below, i had to increase the TextLineSegmentRatio to 1000 to get sufficient shields on high levels but error occurs even on TextLineSegmentRatio 10. 
  
 The data set below has the following count of records 
 NW_0_Shields = 10269 
 NW_1_Shields = 14818 
 NW_2_Shields = 71066 
 NW_4_Shields = 98298 
  
    MsSql2008FeatureLayer NW_0_Shield = new MsSql2008FeatureLayer(connString, "NW_0_Shields", "ident", 4326); 
                 MsSql2008FeatureLayer NW_1_Shield = new MsSql2008FeatureLayer(connString, "NW_1_Shields", "ident", 4326); 
                 MsSql2008FeatureLayer NW_2_Shield = new MsSql2008FeatureLayer(connString, "NW_2_Shields", "ident", 4326); 
                 MsSql2008FeatureLayer NW_4_Shield = new MsSql2008FeatureLayer(connString, "NW_4_Shields", "ident", 4326); 
                 IconValueStyle iconValueStyle = new IconValueStyle("Shield"); 
  
                 IconValueItem item1 = new IconValueItem("N", @"Resources\Shields\N.PNG", new TextStyle("SHIELDNUM", new GeoFont("Arial", 8, DrawingFontStyles.Bold), new GeoSolidBrush(GeoColor.StandardColors.White))); 
                 item1.TextValueLengthMin = 1; 
                 item1.TextValueLengthMax = 5; 
  
                 IconValueItem item2 = new IconValueItem("M", @"Resources\Shields\W.PNG", new TextStyle("NAME", new GeoFont("Arial", 8, DrawingFontStyles.Bold), new GeoSolidBrush(GeoColor.StandardColors.White))); 
                 item2.TextValueLengthMin = 1; 
                 item2.TextValueLengthMax = 5; 
  
                 IconValueItem item3 = new IconValueItem("R", @"Resources\Shields\GB.PNG", new TextStyle("NAME", new GeoFont("Arial", 8, DrawingFontStyles.Bold), new GeoSolidBrush(new GeoColor(255, 250, 220, 12)))); 
                 item3.TextValueLengthMin = 1; 
                 item3.TextValueLengthMax = 5; 
  
                 iconValueStyle.IconValueItems.Add(item1); 
                 iconValueStyle.IconValueItems.Add(item2); 
                 iconValueStyle.IconValueItems.Add(item3); 
  
                 // iconValueStyle.GridSize = 200; 
                 iconValueStyle.TextLineSegmentRatio = 1000; 
               
              
  
                 NW_0_Shield.ZoomLevelSet.ZoomLevel06.CustomStyles.Add(iconValueStyle); 
                 NW_0_Shield.ZoomLevelSet.ZoomLevel06.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; 
                 NW_1_Shield.ZoomLevelSet.ZoomLevel06.CustomStyles.Add(iconValueStyle); 
                 NW_1_Shield.ZoomLevelSet.ZoomLevel06.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; 
                 NW_2_Shield.ZoomLevelSet.ZoomLevel09.CustomStyles.Add(iconValueStyle); 
                 NW_2_Shield.ZoomLevelSet.ZoomLevel09.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; 
                 NW_4_Shield.ZoomLevelSet.ZoomLevel12.CustomStyles.Add(iconValueStyle); 
                 NW_4_Shield.ZoomLevelSet.ZoomLevel12.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;

Hi Meyer, 
  
 I noticed you are sharing one instance of iconValueStyle between the multi-layers and I guess that might be the cause, would you please try the use the clone one? like the below codes: 
  
  
NW_0_Shield.ZoomLevelSet.ZoomLevel06.CustomStyles.Add(iconValueStyle.CloneDeep()); 
NW_0_Shield.ZoomLevelSet.ZoomLevel06.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; 
NW_1_Shield.ZoomLevelSet.ZoomLevel06.CustomStyles.Add(iconValueStyle.CloneDeep()); 
NW_1_Shield.ZoomLevelSet.ZoomLevel06.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; 
NW_2_Shield.ZoomLevelSet.ZoomLevel09.CustomStyles.Add(iconValueStyle.CloneDeep()); 
NW_2_Shield.ZoomLevelSet.ZoomLevel09.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20; 
NW_4_Shield.ZoomLevelSet.ZoomLevel12.CustomStyles.Add(iconValueStyle.CloneDeep()); 
NW_4_Shield.ZoomLevelSet.ZoomLevel12.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20;
 
  
 Hope it helps. 
 Regards, 
 Troy