代码报错:KnownCoordinateSystems.Projected.CoordinateSystems异常求助
问题排查与修复方案
核心问题分析
你遇到的异常是因为代码中UTM坐标系的获取存在语法错误+命名空间调用错误,同时还有变量未初始化、MGRS转换逻辑错误的问题:
KnownCoordinateSystems.Projected.CoordinateSystems.ProjectedCoordinateSystems.UTM(...)这一行既没有将结果赋值给utm变量,DotSpatial的UTM坐标系正确调用路径也不是这个,属于命名空间误用。- 变量
z未初始化,ReprojectPoints方法要求传入有效的高程数组。 - 自定义的MGRS转换逻辑不符合标准规则,比如纬度带字符计算、坐标格式化存在错误。
修复后的完整代码
Imports GeoAPI.CoordinateSystems Imports GeoAPI.CoordinateSystems.Transformations Imports ProjNet.CoordinateSystems Imports ProjNet.Converters Imports ProjNet.Converters.WellKnownText Imports GMap.NET Imports GMap.NET.MapProviders Imports GMap.NET.WindowsForms Imports GMap.NET.WindowsForms.Markers Imports DotSpatial.Projections Imports DotSpatial.Topology Public Class Form1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load GMapControl1.MapProvider = GMapProviders.GoogleMap GMapControl1.Position = New PointLatLng(29.32206, 47.65384) GMapControl1.Zoom = 10 AddHandler GMapControl1.MouseMove, AddressOf GMapControl1_MouseMove End Sub Private Sub GMapControl1_MouseMove(sender As Object, e As MouseEventArgs) Dim point As PointLatLng = GMapControl1.FromLocalToLatLng(e.X, e.Y) Dim mgrs As String = ConvertLatLngToMGRS(point.Lat, point.Lng) TextBox3.Text = mgrs End Sub Private Function ConvertLatLngToMGRS(latitude As Double, longitude As Double) As String Dim utmZone As Integer = CInt(Math.Floor((longitude + 180) / 6) + 1) Dim isNorth As Boolean = latitude >= 0 ' 获取正确的UTM投影坐标系 Dim utm As ProjectionInfo = If(isNorth, KnownCoordinateSystems.Projected.Utm.Wgs1984.NorthernHemisphere(utmZone), KnownCoordinateSystems.Projected.Utm.Wgs1984.SouthernHemisphere(utmZone)) Dim wgs84 As ProjectionInfo = KnownCoordinateSystems.Geographic.World.WGS1984 Dim xy() As Double = {longitude, latitude} Dim z() As Double = {0} ' 初始化高程数组 ' 投影转换:WGS84经纬度转UTM平面坐标 Reproject.ReprojectPoints(xy, z, wgs84, utm, 0, 1) ' 调用标准MGRS转换方法 Dim mgrs As String = UtmToMgrs(utmZone, isNorth, xy(0), xy(1)) Return mgrs End Function ' 标准UTM转MGRS实现 Private Function UtmToMgrs(utmZone As Integer, isNorth As Boolean, easting As Double, northing As Double) As String ' 获取纬度带字符 Dim latBand As Char = GetLatitudeBand(latitude, isNorth) ' 获取100km网格标识 Dim gridLetters As String = GetGridLetters(utmZone, easting, northing) ' 格式化标准MGRS字符串 Return $"{utmZone}{latBand}{gridLetters} {Math.Round(easting) Mod 100000:D5} {Math.Round(northing) Mod 100000:D5}" End Function ' 计算MGRS纬度带字符(排除I/O) Private Function GetLatitudeBand(latitude As Double, isNorth As Boolean) As Char Dim bandIndex As Integer = CInt(Math.Floor((latitude + 80) / 8)) Dim bands As Char() = {"C"c,"D"c,"E"c,"F"c,"G"c,"H"c,"J"c,"K"c,"L"c,"M"c,"N"c,"P"c,"Q"c,"R"c,"S"c,"T"c,"U"c,"V"c,"W"c,"X"c} Return bands(bandIndex) End Function ' 计算100km网格标识字母 Private Function GetGridLetters(utmZone As Integer, easting As Double, northing As Double) As String Dim col As Integer = CInt(Math.Floor((easting - 100000) / 100000)) Dim row As Integer = CInt(Math.Floor((northing Mod 2000000) / 100000)) Dim colLetters As String = "ABCDEFGHJKLMNPQRSTUVWXYZ" Dim rowLetters As String = "ABCDEFGHJKLMNPQRSTUV" col = (col + (utmZone - 1) Mod 3) Mod 20 row = (row + ((utmZone - 1) \ 3) * 2) Mod 20 Return $"{colLetters(col)}{rowLetters(row)}" End Function End Class
关键修复点说明
- UTM坐标系调用修正:改用DotSpatial内置的
KnownCoordinateSystems.Projected.Utm.Wgs1984下的南北半球方法,直接传入带号即可获取正确投影信息,解决命名空间调用错误。 - 变量初始化:给高程数组
z设置默认值,满足ReprojectPoints方法的参数要求。 - MGRS逻辑标准化:替换了错误的纬度带计算和坐标格式化逻辑,实现符合标准的MGRS编码规则。
- 语法错误修复:补全UTM变量的赋值语句,修正原代码中缺失的变量绑定问题。
内容的提问来源于stack exchange,提问作者ابوعبدالوهاب العماوي
相关产品推荐
相关产品推荐

