如何向PointLatLng输入DMM格式带空格经纬度?有无其他输入方式?
解决DMM格式经纬度输入PointLatLng的问题
DMM格式(示例:41 24.2028)是度 分.分小数的结构,直接转double会因空格报错,删空格会把度和分合并成错误数值。必须先把它转换成十进制度,才能传给PointLatLng。
1. 编写DMM转十进制度的方法
这个方法负责拆分度和分,再通过公式度 + 分/60计算出十进制数值:
private double ConvertDmmToDecimal(string dmmString) { // 按空格拆分度和分部分,过滤空字符串 var parts = dmmString.Trim().Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries); if (parts.Length != 2) throw new ArgumentException("输入不是有效的DMM格式"); // 解析度和分的数值 double degrees = double.Parse(parts[0]); double minutes = double.Parse(parts[1]); // 转换为十进制度 return degrees + minutes / 60; }
2. 修改按钮点击事件代码
把原来直接用Convert.ToDouble的部分,替换成调用上面的转换方法:
private void button1_Click(object sender, EventArgs e) { gMapControl1.DragButton = MouseButtons.Left; gMapControl1.MapProvider = GMapProviders.GoogleMap; // 处理输入格式,转换为十进制度 double lat, longi; try { lat = ConvertDmmToDecimal(textBox1.Text); longi = ConvertDmmToDecimal(textBox2.Text); } catch (ArgumentException ex) { MessageBox.Show($"格式错误:{ex.Message}"); return; } catch (FormatException) { MessageBox.Show("请输入有效的数字内容"); return; } gMapControl1.Position = new PointLatLng(lat, longi); gMapControl1.MinZoom = 5; gMapControl1.MaxZoom = 100; gMapControl1.Zoom = 15; PointLatLng point = new PointLatLng(lat, longi); GMapMarker marker = new GMarkerGoogle(point, GMarkerGoogleType.red_small); GMapOverlay markers = new GMapOverlay("markers"); markers.Markers.Add(marker); gMapControl1.Overlays.Add(markers); }
补充说明
- 如果是南纬(S)或西经(W)的DMM格式,只需要在度的前面加负号(比如
-41 24.2028),方法会自动识别负号并计算正确的十进制数值。 - 加入的
try-catch块可以在用户输入格式错误时弹出提示,避免程序崩溃。
内容的提问来源于stack exchange,提问作者crlrcsnch
相关产品推荐
相关产品推荐

