ThinkGeo.com    |     Documentation    |     Premium Support

Hemisphere problem with map refresh/SQL2008

When I execute the following command:


WinformsMap1.Refresh()


I get this error:


A first chance exception of type 'System.Data.SqlClient.SqlException' occurred in MapSuiteCore.dll

System.Transactions Critical: 0 : <TraceRecord  xmlns="schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord"  Severity="Critical"><TraceIdentifier>msdn.microsoft.com/TraceCodes/System/ActivityTracing/2004/07/Reliability/Exception/Unhandled</TraceIdentifier><Description>Unhandled   exception</Description><AppDomain>TestSQLServer2.vshost.exe</AppDomain><Exception><ExceptionType>System.Data.SqlClient.SqlException,  System.Data, Version=4.0.0.0, Culture=neutral,  PublicKeyToken=b77a5c561934e089</ExceptionType><Message>A  .NET Framework error occurred during execution of user-defined routine  or aggregate "geography": 

Microsoft.SqlServer.Types.GLArgumentException: 24205: The specified  input does not represent a valid geography instance because it exceeds a  single hemisphere. Each geography instance must fit inside a single  hemisphere. A common reason for this error is that a polygon has the  wrong ring orientation.


I have read a similar posting in the ThinkGeo web control section and I am guessing it is related. However, I am only using points, not polygons and am using the Desktop Edition.


My  map consists of a world base map as well as a selction of about 360  points read from a SQL2008 database - all the points are within a  boundary of +/-10° in Lat & Long so no points are being drawn off  the map.


The error occurs when I maximise  my form which also makes the map bigger (and show more of the world)  but the points are still within the +/-10° Lat/Long boundary so no points are being drawn outside the map area.


Can  anyone tell me what actually is going on to cause this error? Is the  Thinkgeo map control passing some info to SQL Server that SQL Server  cannot handle? Asking it to look for points within a certain boundary  rather than just asking for every point? And that boundary is invalid?


And if that is true, how do I stop the map control doing that? I do want to have a map of the whole workd on display, not just a sngle hemisphere (which I am  not sure of the definition of that - my map starts off already showing  points in both N & S hemispheres as well as E & W hemispheres.


This screen dump shows all the points - to get the crash all I do is Maximize the form which makes the map bigger.






David, 
  
 Thanks for your post and sorry for the delay. 
  
 1)Could you show us the code to create the MsSql2008FeatureLayer? 
 2)It is possible to get all the features out from the layer and save all their wkts into a file and upload it? We will take a try to save these into MsSql2008 table to recreate this problem. 
  
 Any more questions please do not hesitate to let me know. 
  
 Thanks. 


I will strip out all the un-needed code from a small project that creates the layer and post the project, maybe tomorrow. It also creates the full database & table and populates it with data so as long as you have SQL Server it should run. 
  
 saving wkts into a file…that might take longer, mainly because I have no idea how to do that! :-) I am not using wkt at all so I haven’t really paid any attention to how to work with it.

David,


Thanks for your post and feedback.
It definitely would be helpful to figure out the problem if a sample with data attached can be provided to recreate the problem. What I meant is to get all the points out from the sql server and get the wkts using the API provided and save those wkts into txt file,  any all, I think a sql table should also work for us.
Any more questions please feel free to let me know.
Thanks.
Yale

gis.thinkgeo.com/Support/DiscussionForums/tabid/143/aff/21/aft/8452/afv/topic/Default.aspx#21805 has a sample project which exhibits this problems (and 2 others - didn’t want to post the project 3 times).

David, 
  
 If you can find which record cause this problem that will be very helpful, or could you backup your database and send to support@thinkgeo.com and let he forward to James and Yale, then we can restore your database to our local server to find the wrong data and find the exactly reason. 
  
 Thanks 
 James

My posting above from 11-30-2010 01:27 AM has a link to where I posted a sample project. That sample project (follow the link to the other topic) actually creates a database which has the ‘wrong’ data and instructions on how to trigger the crash - basically panning off the edge of the world. As far as I can see, there isn’t any wrong data though - other applications which map the data have no problem with it, including Microsoft SQL Server Management Studio which has a “Spatial results” window. The crash doesn’t occur with the data being put into the ThinkGeo map but when the user pans around the map or zooms out. 
  
 Thanks, 
  
 Dave 


David,


I don't think it will crash from the screen-shot you attached and zoom out a little, I attached my screen-shot, it works. The exception will throw is when you zoom-out or pan very far, the extent of current map is out of the Earth, MapSuite will pass in map's extent to Sql server to retrieve data, but actually the data is fine which all of them inside the Earth, but it still throw exception, such as Latitude values are out of -90 and 90 degrees.


This one is the same as yours, no exception.



This one is no exception too, I zoom out to upper zoom level.



Thanks


James


 



Yes, I agree with your statement - "MapSuite will pass in map's extent to Sql server to retrieve data, but actually the data is fine which all of them inside the Earth, but it still throw exception, such as Latitude values are out of -90 and 90 degrees." 



That is what I am having trouble understanding: 

- why is MapSuite passing something that will cause SQL Server to crash? 

- what exactly does it pass? 



I am trying to understand what is actually happening as there is no way I am going to be able to stop my users trying to pan off the edge of the earth every so often. I don't really understand what MapSuite is sending to SQL Server. Shouldn't MapSuite limit the extents it sends to SQL Server to either the extents of the earth (if in degrees then that is easy to know - might not be so easy with a different projection!)? Is there any way to force MapSuite to send a 'smaller' extent, limited to the extents of the earth without limiting my users from being able to pan or zoom outside the earth boundaries?


 



David, 
  
 I think you can hook up the event CurrentExtentChanging and set the smaller extent pass back to e.NewExtent. 
  
 Thanks 
  
 James

Ok, I will try that. I guess this will actually restrict the pan & zoom rather than just stop the invalid extents being sent to the SQL Server. 
  
 Can you actually restrict the extents in CurrentExtentChanging? I try the following code & zoom out until I get a crash: 
  
         Debug.Print(“WinformsMap1_CurrentExtentChanging - before change”) 
         Debug.Print(e.CurrentExtent.GetBoundingBox.UpperRightPoint.X.ToString + ", " + e.NewExtent.GetBoundingBox.UpperRightPoint.X.ToString) 
  
         If e.NewExtent.GetBoundingBox.UpperRightPoint.X > 179 Then 
             Debug.Print("UR X too high: " + e.NewExtent.GetBoundingBox.UpperRightPoint.X.ToString) 
             e.NewExtent.GetBoundingBox.LowerRightPoint.X = 180 
             e.NewExtent.GetBoundingBox.UpperRightPoint.X = 180 
         End If 
  
         Debug.Print(“WinformsMap1_CurrentExtentChanging - after change”) 
         Debug.Print(e.CurrentExtent.GetBoundingBox.UpperRightPoint.X.ToString + ", " + e.NewExtent.GetBoundingBox.UpperRightPoint.X.ToString) 
  
 and get the following results: 
  
 WinformsMap1_CurrentExtentChanging - before change 
 143.279197603464, 186.169822603464 
 UR X too high: 186.169822603464 
 WinformsMap1_CurrentExtentChanging - after change 
 143.279197603464, 186.169822603464 
  
 As you can see, X is higher than 180 after the zoom out so I get the crash.  
  
 It seems setting the X for upper right and lower right corners to 180 in this event routine doesn’t actually change the X value. I can use the following code: 
  
      e.Cancel = minLon < -180 Or maxLon > 180 Or minLat < -90 Or maxLat > 90 
  
 (as provided by Jeff in a different topic) This stops the zoom out taking place completely which is a workaround but I would prefer rather than just stop the zoom, that the application would zoom out to the maximum allowable.

David, 
  
 Thanks for you detail code and description that make it very clear. 
 I think the extent has been snapped up, so you can try to set WinformsMap1.ZoomLevelSnapping = ZoomLevelSnappingMode.None  
  
 Thanks 
 James

I am finally revisiting this and I have some code to show the problem. It is a code that sets up a map with a background layer just for reference then a dynamic layer and adds in 2 points. 
 Those 2 points are definitely less than 90 degrees in Lat and Long. 
 I then try to zoom to show both points. I get a failure: 
 System.FormatException: 24201: Latitude values must be between -90 and 90 degrees. 
 Why? 
  
 ’ Minimal test platform
’ Add 2 points to a SQL Server database
’ Zoom to show those 2 points

Imports ThinkGeo.MapSuite.Core
Imports ThinkGeo.MapSuite.DesktopEdition
Imports System.Data.SqlClient

Public Class Form1

    Private Sub Form1_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown

        ’ Set up the map - Countries background and zoom to show the whole world.
        Dim WorldCountriesLayer As ShapeFileFeatureLayer
        Dim BackgroundOverlay As New LayerOverlay()
        Dim TrailLayer As MsSql2008FeatureLayer
        Dim DynamicLayerOverlay As LayerOverlay = New LayerOverlay()
        Dim ConnectionString As String
        Dim conn = New SqlConnection(ConnectionString)
        Dim cmd As SqlCommand = Nothing

        ’ Set the worldLayer with a preset Style, as AreaStyles.Country1 has YellowGreen background and black border, our worldLayer will have the same render style.  
        WorldCountriesLayer = New ShapeFileFeatureLayer(“C:\Program Files (x86)\ThinkGeo\Map Suite Desktop Full Edition 5.5\Samples\SampleData\Data\Countries02.shp”)
        WorldCountriesLayer.Name = “WorldCountriesLayer”
        WorldCountriesLayer.ZoomLevelSet.ZoomLevel01.DefaultAreaStyle = AreaStyles.Country1

        ’ Make ocean blue
        WinformsMap1.BackgroundOverlay.Name = “BackgroundOverlay”
        WinformsMap1.BackgroundOverlay.BackgroundBrush = New GeoSolidBrush(GeoColor.GeographicColors.ShallowOcean)

        ‘This is necessary - not displayed if this line is commented out.
        WorldCountriesLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20

        ’ put the layer into an overlay then the overlay into the map, then set the initial extents of the map then refresh to display the map.
        BackgroundOverlay.Layers.Add(“WorldCountriesLayer”, WorldCountriesLayer) ’ add the layer to the overlay
        WinformsMap1.Overlays.Add(“BackgroundOverlay”, BackgroundOverlay) ’ add the overlay to the map
        WinformsMap1.CurrentExtent = New RectangleShape(100, 5.5, 105, 1)
        WinformsMap1.Refresh()

        ’ Add TrailLayer
        TrailLayer = New MsSql2008FeatureLayer(“Data Source=CM\SQLEXPRESS;Initial Catalog=MVMSuiteTest;Integrated Security=True;Connection Timeout=0”, “Trails”, “ID”)
        TrailLayer.Srid = 4326
        TrailLayer.Name = “TrailLayer”
        TrailLayer.ZoomLevelSet.ZoomLevel01.DefaultPointStyle.SymbolPen = New GeoPen(GeoColor.FromArgb(255, GeoColor.StandardColors.Blue), 1)
        TrailLayer.ZoomLevelSet.ZoomLevel01.ApplyUntilZoomLevel = ApplyUntilZoomLevel.Level20
        DynamicLayerOverlay.Layers.Add(“TrailLayer”, TrailLayer)
        ‘Adds the LayerOvelay to the Overlays collection of the map with id “VesselLyrOverlay”
        WinformsMap1.Overlays.Add(“ShipLayerOverlay”, DynamicLayerOverlay)

        Dim InsertPoints As Boolean = True
        If InsertPoints Then
            ’ Add points to TrailLayer at 90, 180 and another at -90, -180.
            ‘Dim SQLString As String = "INSERT INTO Trails(ID, Name, VLon, VLat, VSpd, VCMG, Altitude, Voltage, IO, OceanRegion, VDateTime, RDateTime, WGS84Loc, Origin, MsgType, RPM01, FuelFlow01) " + “VALUES (” + VesselID.ToString + “, '” + VesselID.ToString + "’, " + Longitude.ToString + ", " + Latitude.ToString + ", " + Speed.ToString + ", " + Heading.ToString + “, '” + Altitude + "’, ‘" + Voltage.ToString + "’, ‘" + SUMIO + "’, ‘" + OceanRegion + "’, ‘" + Format(CDate(FixTime), “yyyy-MM-ddTHH:mm:ss”) + "’, ‘" + Format(CDate(PCTime), “yyyy-MM-ddTHH:mm:ss”) + "’, " & SQLString & “, '” + Origin + "’, ‘" & MsgType & ",’, ‘" & RPM01 & "’, ‘" & Fuel01 & "’)"
            Dim SQLString As String = "INSERT INTO Trails(ID, Name, VLon, VLat, VSpd, VCMG, WGS84Loc) " + “VALUES (99999, ‘99999’, 89.99999, 89.99999, 0, 0,‘POINT(89.99999 89.99999)’)”
            ConnectionString = “Integrated Security=SSPI;” + “Initial Catalog=MVMSuiteTest;” + “Data Source=CM\SQLEXPRESS;”
            conn.ConnectionString = ConnectionString
            cmd = New SqlCommand(SQLString, conn)
            conn.Open()
            cmd.ExecuteNonQuery()
            conn.Close()
            SQLString = "INSERT INTO Trails(ID, Name, VLon, VLat, VSpd, VCMG, WGS84Loc) " + “VALUES (99999, ‘99999’, -89.99999, -89.99999, 0, 0,‘POINT(-89.99999 -89.99999)’)”
            ConnectionString = “Integrated Security=SSPI;” + “Initial Catalog=MVMSuiteTest;” + “Data Source=CM\SQLEXPRESS;”
            conn.ConnectionString = ConnectionString
            cmd = New SqlCommand(SQLString, conn)
            conn.Open()
            cmd.ExecuteNonQuery()
            conn.Close()
        End If

        ’ Zoom to show both points.
        Dim tempLayer As MsSql2008FeatureLayer = WinformsMap1.FindFeatureLayer(“TrailLayer”)
        tempLayer.Open()
        WinformsMap1.CurrentExtent = tempLayer.GetBoundingBox
        tempLayer.Close()
        WinformsMap1.Refresh()

        ’ If it fails, zoom to 179.999 and 89.999 instead and see if it still crashes.

    End Sub

End Class
 
   

Failure is at the second instance of the code: 

WinformsMap1.Refresh()



Hi David, 
  
 Which version are you using? I tested with 6.0.0.134 and 6.0.134.0 and there is no exception even I added the new PointShape(185, 100) which is out of the earth and zoom out to (-532.275,433.2875,612.4125,-383.4625). 
  
 Thanks, 
  
 Edgar

Thanks for the reply. I am only using 5.5 but I have been watching the change logs pretty closely - has there been any work done in this area?  
  
 Also note that I am adding spatial records to a SQL server table - not adding point shapes - the crash occurs at the WinformsMap1.Refresh() line after records have been added to the SQL Server table which has spatial data. I am not sure if just adding a pointshape to some other layer is the same - or did you use a MsSql2008FeatureLayer? 
  
 Thanks, 
  
 Dave

Yes I’m using MsSql2008FeatureLayer, I used the sqlLayer.EditTools.Add() method to add the point, and in our Core code, and the spatial data of the table is geometry. I noticed you are using geography right? I’ll confirm it with geography and let you know the result. 
  
 Regards, 
  
 Edgar

Geometry vs Geography…I am not a surveyor, though I do have one as Managing Director - I could ask him I guess. However: 
  
 msdn.microsoft.com/en-us/library/bb933790.aspx says 
     The geometry type represents data in a Euclidean (flat) coordinate system. 
     The geography type represents data in a round-earth coordinate system. 
 I am working with GPS data from all over the world.  
  
 Also 
 stackoverflow.com/questions/4991827/geometry-and-geography-difference-sql-server-2008 says: 
 GEOMETRY is for planar spatial data (that is, data on a flat surface) 
 GEOGRAPHY is for terrestrial spatial data (that is, data on the (curved) surface of the Earth) 
  
 So, I could try Geometry but I am loathe to unless I can understand why I need to. 
  
 I will await the results of your Geography test. 
  
 Thanks, 
  
 Dave

I tested the Geography and got the exception, this is a bug which we just confirmed, and now it has been fixed, please get the 6.0.135.0 or 6.0.0.135 or higher and have a try. Notice the latest daily build won’t be available until tomorrow. 
  
 Regards, 
  
 Edgar

Brilliant - that has had me confused since 2010! I will grab the new version tomorrow. 
  
 (Wow - have I been on this project that long? So much for my 3 month time-frame to finish it!)