You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

代码报错: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,提问作者ابوعبدالوهاب العماوي

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 07:59:58