ThinkGeo.com    |     Documentation    |     Premium Support

Markers without labels are rendered with an offset

Hi,


I'm adding a layer of markers with individual popup, as explained in other threads. The position of the markers are taken from a feature dataset, which is also added as a separate layer. The code is shown in this thread:


gis.thinkgeo.com/Support/DiscussionForums/tabid/143/aff/12/aft/8634/afv/topic/Default.aspx


When I display the two layer, the original feature layer and the marker layer, on top of each other the markers are rendered at an offset, about 5 meters to the NW. This can be clearly seen in this link: hvmgo01.hvenegaard.dk/TestMapSuite/


I've tried to set the marker's WebImage.ImageOffsetX and Y = 0 to no avail. The offset stays the same.


Is this WAD, or can I reposition the marker to match the original feature's position ?


TIA


 



 


Lars,
 
In the original feature layer, we draw the point based on the image’s center point, but we draw the point based on the image’s upper left point in the marker layer. So it seems like that they are in the different position. You want to draw point based on the image’s center point, here is the code you need:
 
                //the original width is 21 and height is 25
                WebImage webImage = new WebImage("../../theme/default/img/marker_blue.gif");
                webImage.ImageOffsetX = -10.5F;
                webImage.ImageOffsetY = -12.5F;
 
Thanks,

James



Hi James,


Alas, no change when applying the ImageOffset parameters. Here what I do:



Dim m As New Marker

m.IsVisible = True

If m_ColumnName_WebImage = "" Then
    m.WebImage = New WebImage("/images/red_point.gif")
Else
    m.WebImage = New WebImage(ft.ColumnValues(m_ColumnName_WebImage))
End If

With m.WebImage
    .ImageOffsetX = -3.5F
    .ImageOffsetY = -3.5F
End With

Dim baseShape As BaseShape = ft.GetShape()
If TypeOf baseShape Is PointShape Then
    m.Position = TryCast(baseShape, PointShape)
Else
    m.Position = TryCast(baseShape.GetCenterPoint, PointShape)
End If


Hi again, 
  
 Forgot to mention, that the "red_point.gif" image is 7x7 pixels large. 


Lars, 
  
 I have done a test. I’m wondering one thing. Why are your markers to the NorthWest of your original ones? Mine is in the opposite direction. In my situation, I set ImageOffsetX=-3.5F and ImageOffsetY=-3.5F, and they can get together. But in yours, I think it should be 3.5F. Actually, you can do it easily if you know how imageOffset affects the position of the markers. If you set ImageOffsetX=-3.5F and ImageOffsetY=-3.5F, the image will move to NorthWest. If you set ImageOffsetX=3.5F and ImageOffsetY=3.5F, it will move to SouthEast. You can adjust the offset value according to your requirement. 
  
 Thanks, 
 James 


Hi James,


I'm working in the Google CRS (meters). And the layer used for positioning is reprojected from Utm 32N ETRS89 (epsg:25832).


Does that explain the differencies ?


 



Lars, 
  
 Yes, that’s right. I think you have already got the appropriate offset value to make them render at the same position. 
  
 Let me know if you have any questions. 
  
 Thanks, 
 James

Hi James, 
  
 The problem is, that nothing happens regardless of what values I set the marker ImageOffsetX and Y to (even ludicrious values). The markers remains where they are on the map, some 8-10 pixels to the NW at their correct position, both compared to the source layer being displayed, and to the Google raster image (i.e. ground placement). 
  
 I’ve now dumped the WKT of all the marker layer features from Map Suite, and compared them to the Google coordinates as calculated in MapInfo Pro (data is in Utm, as explained earlier), and they match to the centimeter. So alas, no conversion errors. 
  
 Instead it looks like the webimage is placed at an offset outside my control, so I’m stuck here. Please advise. 
  


 


Lars,
 
I think it’s a little weird. I have done a test and it worked. Here is a sample for you. In this sample, you will find out the marker offset is under the control. You can set the offset value you want.
 
 


 
Could you give us a simple sample and tell us your WebEdition version if the problem still exists? 
 
Thanks,
James

Post8652.zip (120 KB)

Hi James,


As explained earlier in the thread, I'm using a custom marker style class to enable individual column based popups.


The markers are added to an InMemoryMarkerOverlay via a reprojected vector layer, but the reprojection seems to be in order, producing correct coordinates for the markers.


Here how the two layers are built and added to CustomOverlays:



Public Class ColumnBasedMarkerStyle
    Inherits ThinkGeo.MapSuite.WebEdition.MarkerStyle

    Private m_ColumnName_Name As String = ""
    Private m_ColumnName_WebImage As String = ""

    Public Sub New(ByVal cn As String, ByVal wi As String)
        m_ColumnName_Name = cn
        m_ColumnName_WebImage = wi
    End Sub

    Public Overrides Function GetMarkers(ByVal fts As System.Collections.Generic.IEnumerable(Of Feature)) _
                                                                As System.Collections.ObjectModel.Collection(Of Marker)
        Dim mks As New System.Collections.ObjectModel.Collection(Of Marker)

        For Each ft In fts
            Dim m As New Marker()

            m.IsVisible = True

            Dim baseShape As BaseShape = ft.GetShape()
            If TypeOf baseShape Is PointShape Then
                m.Position = TryCast(baseShape, PointShape)
            Else
                m.Position = TryCast(baseShape.GetCenterPoint, PointShape)
            End If

            If m_ColumnName_WebImage = "" Then
                m.WebImage = New WebImage("/images/red_point.gif")
            Else
                m.WebImage = New WebImage(ft.ColumnValues(m_ColumnName_WebImage))
            End If

            With m.WebImage
                'hardcoded for red_point.gif !
                .ImageOffsetX = -3.5F
                .ImageOffsetY = -3.5F
            End With

            Dim msg As String = ""
            If m_ColumnName_Name = "" Then
                msg = "<b>Uden navn:</b><hr/>"
            Else
                msg = "<b>" + ft.ColumnValues(m_ColumnName_Name).ToString() + "</b><hr/>"
            End If

            With m.Popup
                .BorderWidth = 2
                .Width = 300
                .Height = 250
                .ContentHtml = msg
            End With

            mks.Add(m)
        Next
        Return mks
    End Function
End Class
 

Here the definition of the custom marker style object:



Dim skulpturer = New TabFileFeatureLayer("C:\Maps\MapInfo\Skulpturer_webgis.TAB", "ID", "OGRSchema")

With skulpturer.ZoomLevelSet.ZoomLevel01
    .DefaultPointStyle = PointStyles.CreateSimplePointStyle(PointSymbolType.Circle, New GeoColor(0, 0, 255), 10)
    .DefaultTextStyle = TextStyles.Capital2("NAVN")
    .ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20
End With

skulpturer.IsVisible = True
skulpturer.FeatureSource.Projection = New ManagedProj4Projection( _
                                    ManagedProj4Projection.GetEpsgParameters(25832), _
                                    ManagedProj4Projection.GetGoogleMapParameters())

Dim ptsOverlay = New LayerOverlay("Odense skulpturer P", False, TileType.SingleTile)
ptsOverlay.Layers.Add(skulpturer)
ptsOverlay.IsVisible = True
Map1.CustomOverlays.Add(ptsOverlay)

'..............................................

Dim mo As New InMemoryMarkerOverlay("MyMarkers")

skulpturer.FeatureSource.Open()
mo.FeatureSource.Open()

For Each c In skulpturer.FeatureSource.GetColumns()
    mo.Columns.Add(New FeatureSourceColumn(c.ColumnName, c.TypeName, c.MaxLength))
Next

For Each ft In skulpturer.FeatureSource.GetAllFeatures(ReturningColumnsType.AllColumns)
    mo.Features.Add(ft) 'transfers column data ??
Next

mo.FeatureSource.Close()
skulpturer.FeatureSource.Close()

mo.Name = "Odense skulpturer M"
mo.IsVisible = True 'False 'for now
mo.IsBaseOverlay = False
mo.IsVisibleInOverlaySwitcher = True

With mo.ZoomLevelSet.ZoomLevel01
    .CustomMarkerStyle = New ColumnBasedMarkerStyle("NAVN", "") ', mo.ZoomLevelSet.ZoomLevel01.DefaultMarkerStyle.WebImage)
    .ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20
End With

Map1.CustomOverlays.Add(mo)
 

I'm attaching the "Skulpturer_webgis" MapInfo TAB.


TIA


 



Skupturer_webgis.zip (14.8 KB)

Hi, 
  
 Forgot to mention that I use WebEdition version 4.5.0.0 


 


Lars,
 
Thanks for your detailed description and we have found out where the problem is. In WebEdition4.5.0.0, if you don’t set value to WebImage.ImageWidth and WebImage.ImageHeight explicitly, the offset will be -10 automatically. We have fix this issue in our new version. So here are 2 solutions for you:
 
1.       Set value to WebImage.ImageWidth and WebImage.ImageHeight, for example:  “m.WebImage.ImageHeight=7;m.WebImage.ImageWidth = 7;”;
2.       Get the latest dailybuild and replace your DLLs with it;
 
Thanks,
James

Hi James, 
  
 Thanks for confirming my problem :-) 
  
 I can see that all DLL’s in today’s daily build are dated Feb. 9. I assume this is caused by the build routine, and not an indication that all DLL’s are changed since the day before, right ? 
  
 But I assume I should deploy all included DLL’s regardless of whether changed have been implemented ? 
  
  
  


Hi James, 
  
 Alas, when deploying the updated (4.5.101.0) DLL’s, the markers are placed correctly, but now the OverlaySwitcher goes haywire. And the old error concerning failing to load Google Maps initially has returned as well, but that may of course be a consequence of the above problem. 
  
 The solution can still be seen here - hvmgo01.hvenegaard.dk/TestMapSuite/ 
  
 Does copying the 4.5.101.0 DLL’s have any requirements ? 
  
 Or do you have any other ideas on how to overcome this problem ? 
  
 TIA 


 


Lars,
 
I did a test with 4.5.101.0. Everything goes fine. I think you should set googleOverlay as base layer. There is only one Base layer in the map. Here is the code.
 
                googleOverlay.IsBaseOverlay = true;
 
The issue about overlaySwitcher is that css file was modified. You can remove “theme” folder from your project, the program will create a new one automatically when you run it.
 
Thanks,
James

Hi James, 
  
 There’s nothing wrong with my base layer settings (there are in fact two such), the only problem is the OverlaySwitcher being trashed… 
  
 And deleting the theme sub folder just resulted in an application exception being thrown, so that didn’t work either. 
  
 Where can I find the missing - updated - CSS stylesheet file (et.al.) ? 
  


 


Lars,
 
I have downloaded your CSS file from hvmgo01.hvenegaard.dk/TestMapSuite/theme/default/style.css. It is really modified. Here attached is the original CSS file. You can replace your CSS file(~/theme/default/style.css) with the original CSS file and the OverlaySwitcher issue will be fixed.
 
About the baseoverlay, I have no idea where the problem is just according to your description. Could you please attach your code or give us a sample to help us solve this problem better?
 
Thanks,
James

001_style.zip (1.86 KB)

 


Lars,
 
I have downloaded your CSS file from hvmgo01.hvenegaard.dk/TestMapSuite/theme/default/style.css. It is really modified. Here attached is the original CSS file. You can replace your CSS file(~/theme/default/style.css) with the original CSS file and the OverlaySwitcher issue will be fixed.
 
About the baseoverlay, I have no idea where the problem is just according to your description. Could you please attach your code or give us a sample to help us solve this problem better?
 
Thanks,
James

001_style.zip (1.86 KB)

Hi James,


Thanks for the new style.css, it seems to work.


I've never modified its content, so I'm at a loss to say where it comes from. It may have been version 4.0 for all I know.


BUT, my solution worked last week, before I downloaded and upgraded the DLL assemblies included in the 4.5.101.0 package !


So something changed between 4.5.0.0 and 4.5.101.0 that broke my solution. You really should include _all_ changed files since first release (4.5.0.0 in this case) in such an update package.


 


As for the Google rendering problem, we solved it in this thread several weeks ago:


gis.thinkgeo.com/Support/DiscussionForums/tabid/143/aff/12/aft/8607/afv/topic/Default.aspx


And again, the solution worked last week, and no code has changed ! So any functional changes has to be related to the new DLL/assemblies.


I'll reopen the old thread above, so we can get to the bottom of the matter.





Lars, 
  
 I am glad the new style.css is working with you. And also thanks for your more information. 
  
 About Google rendering problem, I will give your solution at thread 8607, please keep an eye on it. 
  
 James