ThinkGeo.com    |     Documentation    |     Premium Support

Change layer styles depending on the zoom

 


Hi everybody, i am new in the forum. i don't know if is there a question similar to mine.


i have loaded several layers and now i want to show each layer with their won stile depending on the actual zoom level.


I have created a method for loading all the layers, and some functions for the styles.

In the method I have written something like:


Dim Highway As New ShapeFileLayer(MapPath("~\Maps\espes2________00.shp"))

        Highway.FeatureSource.Projection = New Proj4Projection(23030, 23030)

        Highway.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = EstHighway(1, 3)

        Highway.ZoomLevelSet.ZoomLevel02.DefaultLineStyle = EstHighway(4, 8)

        Highway.ZoomLevelSet.ZoomLevel03.DefaultLineStyle = EstHighway(7, 10)

        (...)

        until zoomlevel 20, but it does not work


I have tested also with something like:


Dim Highway As New ShapeFileLayer(MapPath("~\Maps\espes2________00.shp"))

        Highway.FeatureSource.Projection = New Proj4Projection(23030, 23030)

        Highway.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel =    ApplyUntilZoomLevel.Level03

        Highway.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = EstHighway(1, 3)

        (...) dividing the styles in some groups of zooms.




*EstHighway is a function where I introduce two parameters, the width of internal and external line


If anyone knows how to solve it...


thanks very much.


Tyffany



Tyffany,


 Thanks for the post!
 
I think the reason of the issue lays on your projection. As your data is in UTM (I guessed from your projection number 23030), you need to set the Map1.MapUnit to meters, otherwise, map engine will keep using the decimal degrees as default unit and apparently, that’s not right.
 
Also I don’t think you need the following code:
  Highway.FeatureSource.Projection = New Proj4Projection(23030, 23030)
 
The projection property is for the case that you want to convert one projection into another. For example I have a US cities shape file in decimal degree and a US rivers shape file in UTM, to display them properly on one map together, I need to convert one layer from one projection to the other.  In that case, I need to use the Projection property for the conversion. Code might be like following:
 
citiesLayer.FeatureSource.Projection = New Proj4Projection(4326, 23030)


    

One customer has the similar issue here  and just have a look if you are interested. Also, if you still have issues, please let us know more about your application, like what the projection of your shape data is and what projection you want it to display. 
 

Ben.

Hi Ben,

first of all, thank you very much for your answer.

unfortunately the problem still exists after changing Meter parameter instead of DecimalDegree inside GeographicUnit field.

The program reacts only depending on the parameters of the first zoom, for example:

if  I write,



Imports ThinkGeo.MapSuite.WebEdition
Imports ThinkGeo.MapSuite.Core
Imports System.Collections.Generic
Imports System.Collections.ObjectModel
Imports System.Data.OleDb
Imports Microsoft.VisualBasic
Imports System.Web.UI.WebControls


Partial Class _Default
    Inherits System.Web.UI.Page
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If (Not Page.IsPostBack) Then
            Map1.BackgroundFillBrush = New GeoSolidBrush(New GeoColor(255, 239, 213))
            Map1.MapUnit = GeographyUnit.Meter
            cargaDeCapas()
            Map1.PanZoomBar.Enabled = True
            Map1.ToolTip = “Haz click para ver la informacion del objeto”
        End If
    End Sub
    Private Sub cargaDeCapas()
        Dim Autopistas As New ShapeFileLayer(MapPath("~\Mapas\espes2________00.shp"))
        Autopistas.FeatureSource.Projection = New Proj4Projection(23030, 23030)
        'Autopistas.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level03
        Autopistas.ZoomLevelSet.ZoomLevel01.DefaultLineStyle = EstAutopista(1, 3)
        Autopistas.ZoomLevelSet.ZoomLevel02.DefaultLineStyle = EstAutopista(1, 3)
        Autopistas.ZoomLevelSet.ZoomLevel03.DefaultLineStyle = EstAutopista(1, 3)
        'Autopistas.ZoomLevelSet.ZoomLevel04.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level13
        Autopistas.ZoomLevelSet.ZoomLevel04.DefaultLineStyle = EstAutopista(200, 400)
        Autopistas.ZoomLevelSet.ZoomLevel05.DefaultLineStyle = EstAutopista(2, 4)
        Autopistas.ZoomLevelSet.ZoomLevel06.DefaultLineStyle = EstAutopista(3, 5)
        Autopistas.ZoomLevelSet.ZoomLevel07.DefaultLineStyle = EstAutopista(3, 6)
        Autopistas.ZoomLevelSet.ZoomLevel08.DefaultLineStyle = EstAutopista(55, 60)
        Autopistas.ZoomLevelSet.ZoomLevel09.DefaultLineStyle = EstAutopista(60, 65)
        Autopistas.ZoomLevelSet.ZoomLevel10.DefaultLineStyle = EstAutopista(70, 75)
        Autopistas.ZoomLevelSet.ZoomLevel11.DefaultLineStyle = EstAutopista(75, 80)
        Autopistas.ZoomLevelSet.ZoomLevel12.DefaultLineStyle = EstAutopista(80, 85)
        Autopistas.ZoomLevelSet.ZoomLevel13.DefaultLineStyle = EstAutopista(85, 90)
        'Autopistas.ZoomLevelSet.ZoomLevel14.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20
        Autopistas.ZoomLevelSet.ZoomLevel14.DefaultLineStyle = EstAutopista(1, 3)
        Autopistas.ZoomLevelSet.ZoomLevel15.DefaultLineStyle = EstAutopista(95, 100)
        Autopistas.ZoomLevelSet.ZoomLevel16.DefaultLineStyle = EstAutopista(100, 105)
        Autopistas.ZoomLevelSet.ZoomLevel17.DefaultLineStyle = EstAutopista(105, 110)
        Autopistas.ZoomLevelSet.ZoomLevel18.DefaultLineStyle = EstAutopista(110, 115)
        Autopistas.ZoomLevelSet.ZoomLevel19.DefaultLineStyle = EstAutopista(115, 120)
        Autopistas.ZoomLevelSet.ZoomLevel20.DefaultLineStyle = EstAutopista(125, 150)
        Autopistas.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20

        Map1.StaticLayers.Add(“Autopistas”, Autopistas)

        Autopistas.Open()
        Map1.CurrentExtent = Autopistas.GetBoundingBox
        Autopistas.Close()
    End Sub
    Private Function EstAutopista(ByVal AnchuraInt As Integer, ByVal AnchuraExt As Integer) As LineStyle
        Dim estiloPropio As LineStyle
        Dim linExterior As GeoPen
        Dim linInterior As GeoPen
        linExterior = New GeoPen(New GeoColor(255, 0, 0), AnchuraExt)
        linInterior = New GeoPen(New GeoColor(255, 242, 0), AnchuraInt)
        estiloPropio = New LineStyle(linExterior, linInterior)
        Return estiloPropio
    End Function
End Class



Let me know if you find the solution 

Thank you very much for your attention. We keep in touch.

*I have tried to copy the sourcecode in this post but i have had some problems in the preview, so in the case this source cant be properly viewed i add the link to public server where you can download the textfile with the sourcecode.


megaupload.com/?d=KFFN9OF0
 

Tiffany

i did not see before the atachment option.


 already uploaded.


thanks.


Tiffany



111-test.txt (3.62 KB)

Tiffany,


There is a mistake in your codes that the following line

 Autopistas.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20
which means you would like to apply the same settings from ZoomLevel01 to ZoomLevel20, overrides all your settings above. That’s why you have only one renders for the highway all over the zoomlevels.
 
Also a small issue, which will not affect the final result, is I don’t think you need the following code, as you didn’t have any projection conversion:
  Highway.FeatureSource.Projection = New Proj4Projection(23030, 23030)
 
Any more queries please let us know.
 
Ben.

hi Ben,


Thank you very much for answering. I have tested erasing both lines and the problem still appears.


I dont know what happens becasue the sourcecode is quite simple...


i wait your answer.


thanks again.


 


Tiffany



Tiffany, 
  
 I think I know what the problem is. That’s an issue when handling the data with the projections other than DecimalDegrees. We have fixed that in the latest version which will be released in a couple days. I think it will work fine with your code.  
  
 Also, if you don’t mind, you can send the data to me so I can make sure your data works well with the latest edition. 
  
 Ben. 


Thanks very much Ben


i will wait until that version is released. i hope the problem can be solved. it seems to be a problem with UTM coordinates or changes between WGS-84 and UTM coordinates.


By the way, i upload you the layer i have used in the example.


i wait your answer. We keep in touch.


Tiffany


PD: Regarding the layer extension and the upload requirements i have noticed it is impossible to upload teh layers via this forum, so i have compressed (WinRar) and i have uploaded to a free server.


LINK--> megaupload.com/?d=IJMBOHNK



Tiffany, 
  
 I got the file.  Seems still has some issue but as we are busy on the releases and we don’t have time to have a further investigation. I will let you know the result when  we get it. 
  
 Ben

Tiffany


I saw Proj4Projection(23030, 23030) in your code so I supposed your data is with projection UTM (EPSG: 23030), After I got your data I found I made a bad assumption that your data is in fact in Decimal Degree.
 
The code you posted is almost right, map will be shown properly just change the map unit to decimal degree and remove the following line.
 
Autopistas.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20
 
I also attached the sample code using the new Web Edition(Beta) which was released a couple hours ago.
 
 
Ben.

122-ZoomLevelsForTiffany.txt (3.11 KB)