GMap.net控件学习记录

article/2025/11/11 7:38:33

主要参考网址
http://www.cnblogs.com/luxiaoxun/p/3802559.html
http://www.cnblogs.com/luxiaoxun/p/3463250.html
http://blog.csdn.net/onepiecehuiyu/article/details/19159565
GMap官方网址
http://greatmaps.codeplex.com/
WGS84,GCJ02,BD09坐标转换
http://blog.csdn.net/ma969070578/article/details/41013547
GMap总结
http://wenku.baidu.com/link?url=0JOy2cyTf8RUokKbfDelzSs29pvPnuzRNLqcT5VM451bnfKZ-gBmCg3QOFyuFut2zep_qBfp2bqqsQnaAHNGBdG5kVZoIvt8Rhgdg3raOdy
http://wenku.baidu.com/link?url=OKVBEUV5ekfPEcSRRdUyBAG6PN4Lh330gUZogBv30L92pgJECvvDPZ4hcz7h8XAt4SBw-9sTxDddeleYHvbYtDe2Y9vKtlvY2d_Pd-n4V9C
下面介绍如何在GMap.net官方控件的基础上添加国内高德地图以及添加墨卡托mercator坐标系在中国的翻版GCJ02转换投影
因为基本所有的gps芯片获取的都是wgs84坐标系数据,但是google中国,高德地图都是用的wgs84经过gcj02转换的投影,所以gmap.net获取gps数据后再地图上显示时,需要使用gcj的投影,而官方的GMap.net控件中只是标准的mercator投影
从官网下载GMap.net控件,里面是没有高德地图的所以需要添加,并且原来官方控件中是没有MercatorProjectionGCJ投影换算的。


1,http://greatmaps.codeplex.com/ 官网下载GMap.net控件

2,在GMap.NET.MapProviders文件夹下,建立AMap文件夹,在该文件夹下新建AMapProvider.cs AMapSateliteProvider.cs文件,如图所示


AMapProvider.cs文件

using System;
using GMap.NET;
using GMap.NET.MapProviders;
using GMap.NET.Projections;namespace GMap.NET.MapProviders
{public abstract class AMapProviderBase : GMapProvider{private GMapProvider[] overlays;public AMapProviderBase(){this.MaxZoom = null;base.RefererUrl = "http://www.amap.com/";base.Copyright = string.Format("©{0} 高德软件 Image© DigitalGlobe & chinasiwei | AIRBUS & EastDawn", DateTime.Today.Year);}public override GMapProvider[] Overlays{get{if (this.overlays == null){this.overlays = new GMapProvider[] { this };}return this.overlays;}}public override PureProjection Projection{get{return MercatorProjectionGCJ.Instance;}}}public class AMapProvider : AMapProviderBase{private readonly Guid id = new Guid("EF3DD303-3F74-4938-BF40-232D0595EE88");public static readonly AMapProvider Instance = new AMapProvider();//private readonly string name = Resources.Strings.AMap;private readonly string name = "AMap";private static readonly string UrlFormat = "http://webrd04.is.autonavi.com/appmaptile?x={0}&y={1}&z={2}&lang=zh_cn&size=1&scale=1&style=7";public override PureImage GetTileImage(GPoint pos, int zoom){string url = this.MakeTileImageUrl(pos, zoom, GMapProvider.LanguageStr);return base.GetTileImageUsingHttp(url);}private string MakeTileImageUrl(GPoint pos, int zoom, string language){string str = string.Format(UrlFormat, pos.X, pos.Y, zoom);Console.WriteLine("url:" + str);return str;}public override Guid Id{get{return this.id;}}public override string Name{get{return this.name;}}}}
AMapSateliteProvider.cs文件如下

namespace GMap.NET.MapProviders
{using GMap.NET;using System;public class AMapSateliteProvider : AMapProviderBase{private readonly Guid id = new Guid("FCA94AF4-3467-47c6-BDA2-6F52E4A145BC");public static readonly AMapSateliteProvider Instance = new AMapSateliteProvider();//private readonly string name = Resources.Strings.AMapSatellite;private readonly string name = "AMapSatellite";private static readonly string UrlFormat = "http://webst04.is.autonavi.com/appmaptile?x={0}&y={1}&z={2}&lang=zh_cn&size=1&scale=1&style=6";public override PureImage GetTileImage(GPoint pos, int zoom){string url = this.MakeTileImageUrl(pos, zoom, GMapProvider.LanguageStr);return base.GetTileImageUsingHttp(url);}private string MakeTileImageUrl(GPoint pos, int zoom, string language){string str = string.Format(UrlFormat, pos.X, pos.Y, zoom);Console.WriteLine("url:" + str);return str;}public override Guid Id{get{return this.id;}}public override string Name{get{return this.name;}}}
}
3,在GMap.NET.Projections文件夹下添加MercatorProjectionGCJ.cs文件如下

namespace GMap.NET.Projections
{using GMap.NET;using System;public class MercatorProjectionGCJ : PureProjection{internal double a = 6378245.0;internal double ee = 0.0066934216229659433;public static readonly MercatorProjectionGCJ Instance = new MercatorProjectionGCJ();private static readonly double MaxLatitude = 85.05112878;private static readonly double MaxLongitude = 180.0;private static readonly double MinLatitude = -85.05112878;private static readonly double MinLongitude = -180.0;private readonly GSize tileSize = new GSize(0x100L, 0x100L);public override GPoint FromLatLngToPixel(double lat, double lng, int zoom){double[] latlng = new double[2];this.transform(lat, lng, latlng);lat = latlng[0];lng = latlng[1];GPoint empty = GPoint.Empty;lat = PureProjection.Clip(lat, MinLatitude, MaxLatitude);lng = PureProjection.Clip(lng, MinLongitude, MaxLongitude);double num = (lng + 180.0) / 360.0;double num2 = Math.Sin((lat * 3.1415926535897931) / 180.0);double num3 = 0.5 - (Math.Log((1.0 + num2) / (1.0 - num2)) / 12.566370614359172);GSize tileMatrixSizePixel = this.GetTileMatrixSizePixel(zoom);long width = tileMatrixSizePixel.Width;long height = tileMatrixSizePixel.Height;empty.X = (long)PureProjection.Clip((num * width) + 0.5, 0.0, (double)(width - 1L));empty.Y = (long)PureProjection.Clip((num3 * height) + 0.5, 0.0, (double)(height - 1L));return empty;}public override PointLatLng FromPixelToLatLng(long x, long y, int zoom){PointLatLng empty = PointLatLng.Empty;GSize tileMatrixSizePixel = this.GetTileMatrixSizePixel(zoom);double width = tileMatrixSizePixel.Width;double height = tileMatrixSizePixel.Height;double num3 = (PureProjection.Clip((double)x, 0.0, width - 1.0) / width) - 0.5;double num4 = 0.5 - (PureProjection.Clip((double)y, 0.0, height - 1.0) / height);empty.Lat = 90.0 - ((360.0 * Math.Atan(Math.Exp((-num4 * 2.0) * 3.1415926535897931))) / 3.1415926535897931);empty.Lng = 360.0 * num3;PointLatLng lng2 = new PointLatLng();double[] latlng = new double[2];this.transform(empty.Lat, empty.Lng, latlng);lng2.Lat = latlng[0];lng2.Lng = latlng[1];empty.Lat -= lng2.Lat - empty.Lat;empty.Lng -= lng2.Lng - empty.Lng;return empty;}public override GSize GetTileMatrixMaxXY(int zoom){long num = ((int)1) << zoom;return new GSize(num - 1L, num - 1L);}public override GSize GetTileMatrixMinXY(int zoom){return new GSize(0L, 0L);}private static bool outOfChina(double lat, double lon){if (((lon >= 72.004) && (lon <= 137.8347)) && ((lat >= 0.8293) && (lat <= 55.8271))){return false;}return true;}private void transform(double wgLat, double wgLon, double[] latlng){if (outOfChina(wgLat, wgLon)){latlng[0] = wgLat;latlng[1] = wgLon;}else{double num = this.transformLat(wgLon - 105.0, wgLat - 35.0);double num2 = this.transformLon(wgLon - 105.0, wgLat - 35.0);double a = (wgLat / 180.0) * 3.1415926535897931;double d = Math.Sin(a);d = 1.0 - ((this.ee * d) * d);double num5 = Math.Sqrt(d);num = (num * 180.0) / (((this.a * (1.0 - this.ee)) / (d * num5)) * 3.1415926535897931);num2 = (num2 * 180.0) / (((this.a / num5) * Math.Cos(a)) * 3.1415926535897931);latlng[0] = wgLat + num;latlng[1] = wgLon + num2;}}private double transformLat(double x, double y){double num = ((((-100.0 + (2.0 * x)) + (3.0 * y)) + ((0.2 * y) * y)) + ((0.1 * x) * y)) + (0.2 * Math.Sqrt(Math.Abs(x)));num += (((20.0 * Math.Sin((6.0 * x) * 3.1415926535897931)) + (20.0 * Math.Sin((2.0 * x) * 3.1415926535897931))) * 2.0) / 3.0;num += (((20.0 * Math.Sin(y * 3.1415926535897931)) + (40.0 * Math.Sin((y / 3.0) * 3.1415926535897931))) * 2.0) / 3.0;return (num + ((((160.0 * Math.Sin((y / 12.0) * 3.1415926535897931)) + (320.0 * Math.Sin((y * 3.1415926535897931) / 30.0))) * 2.0) / 3.0));}private double transformLon(double x, double y){double num = ((((300.0 + x) + (2.0 * y)) + ((0.1 * x) * x)) + ((0.1 * x) * y)) + (0.1 * Math.Sqrt(Math.Abs(x)));num += (((20.0 * Math.Sin((6.0 * x) * 3.1415926535897931)) + (20.0 * Math.Sin((2.0 * x) * 3.1415926535897931))) * 2.0) / 3.0;num += (((20.0 * Math.Sin(x * 3.1415926535897931)) + (40.0 * Math.Sin((x / 3.0) * 3.1415926535897931))) * 2.0) / 3.0;return (num + ((((150.0 * Math.Sin((x / 12.0) * 3.1415926535897931)) + (300.0 * Math.Sin((x / 30.0) * 3.1415926535897931))) * 2.0) / 3.0));}public override double Axis{get{return 6378137.0;}}public override RectLatLng Bounds{get{return RectLatLng.FromLTRB(MinLongitude, MaxLatitude, MaxLongitude, MinLatitude);}}public override double Flattening{get{return 0.0033528106647474805;}}public override GSize TileSize{get{return this.tileSize;}}}
}
4,编译,在bin/Debug文件夹下生成GMap.NET.Core.dll文件,然后在工程中引用这个dll文件,即可出现高德地图





http://chatgpt.dhexx.cn/article/AMptL1TL.shtml

相关文章

Gmap使用说明,通过输入经纬度查询位置

由于本人对于Gmap的使用时间不长&#xff0c;有很多东西不是太熟悉&#xff0c;所以本人的代码有借鉴的部分&#xff0c;如有发现侵权&#xff0c;还请及时联系本人。 我目前已经基本实现了&#xff0c;地图的放大、缩小、平移的功能。完成了鼠标单击标点&#xff0c;输入经纬度…

GMap.net 自定义Marker

说明 自定义Marker部分内容来源于互联网&#xff0c;具体来源不记得了&#xff0c;若有人发现此处没注明出处&#xff0c;请海涵&#xff01; nuget包 GMapMarkerArrow using GMap.NET.WindowsForms; using System; using System.Collections.Generic; using System.Linq; usin…

C#基于开源地图GMap的开发示例

一.介绍 本示例程序是我在做项目前的探索示例。示例中测试了一些简单的功能&#xff0c;满足了我项目中的基本功能。更进一步的开发&#xff0c;有待继续研究。 二.项目源代码地址 源代码下载地址 三.项目讲解 1.引用GMap的dll文件 利用GMap开发&#xff0c;需要用到两个…

GMAP一款比对工具用于ALLHiC构建等位基因表

在ALLHiC使用过程中需要构建Allele.ctg.table&#xff0c;用于过滤多倍体基因组中因等位序列相似引起的HiC噪音的必要输入。官网提供了两种办法&#xff0c;一种是blastn&#xff0c;需要对草图基因组进行注释&#xff0c;这个过程挺麻烦的&#xff0c;在最下边看到了也可以使用…

Gmap使用心得分享C#-winform-Gmap

目录 一、Gmap库引用 1.下载Gmap引用库 2.Visual Studio添加项目引用 &#xff08;1&#xff09;打开项目后点击项目后添加引用 ​ &#xff08;2&#xff09;浏览本地库 &#xff08;3&#xff09;添加引用即可 二、Gmap使用流程 1.添加GmapControl 2.图…

基于GMap.Net的地图解决方案

一 地图的加载与显示 关于GMap的介绍与使用可以看我以前的文章: GMap.Net开发之在WinForm和WPF中使用GMap.Net地图插件 GMap.Net是.Net下一个地图控件,可以基于Http协议加载各个公司的地图,如Google,Bing,ArcGIS的,主要原理是通过解析各个公司的地图服务的URL,传入相应的…

Jersey框架常用注解3:媒体类型注解@Consumes和@Produces

Consumes 指定http请求的MIME类型&#xff0c;默认是*/*&#xff0c;表示任意的MIME类型。该注解的值是数组类型&#xff0c;支持多个MIME类型&#xff0c;可以使用MediaType来指定MIME类型。 Produces 指定http响应的MIME类型&#xff0c;默认是*/*&#xff0c;表示任意的M…

12.@RequestMapping中的consumes属性和produces属性

请求头header中很重要的两个参数:Accept:text/html只在响应中存在,表示当前请求希望服务器将来返回的数据类型是text/htmlContent-Type:application/json既可以出现在请求中,也可以出现在响应中,例如响应中代表服务器响应的是什么数据类型响应中response.setContentType("…

springmvc @RequestMapping注解中produces以及consumes属性的含义

http协议基础知识 首先需要了解什么叫MediaType&#xff08;媒体类型&#xff09;&#xff1f; 通俗来说&#xff0c;在http协议中&#xff0c;用来表示传输内容的格式就是MediaType&#xff0c;比如text/html&#xff0c;application/json等&#xff0c;其中text代表介质&am…

AJAX、异步和同步区别

1. 概念&#xff1a; ASynchronous JavaScript And XML (异步的JavaScript 和 XML) 异步和同步区别 2.Ajax作用&#xff1a; Ajax 是一种在无需重新加载整个网页的情况下&#xff0c;能够更新部分网页的技术。通过在后台与服务器进行少量数据交换&#xff0c;Ajax 可以使网页…

js异步与同步的区别

你应该知道&#xff0c;javascript语言是一门“单线程”的语言&#xff0c;不像java语言&#xff0c;类继承Thread再来个thread.start就可以开辟一个线程&#xff0c;所以&#xff0c;javascript就像一条流水线&#xff0c;仅仅是一条流水线而已&#xff0c;要么加工&#xff0…

同步调制和异步调制区别

在PWM控制电路中&#xff0c;载波频率 fc 和调制信号频率 fr 之比成为载波比&#xff0c;根据载波信号和信号波信号是否同步分为同步调制和异步调制。 1 什么是异步调制&#xff1f; 载波信号和调制信号不保持同步的方式称为异步调制&#xff0c;如下图所示&#xff0c;异步调…

同步和异步,区别

同步&#xff1a; 同步的思想是&#xff1a;所有的操作都做完&#xff0c;才返回给用户。这样用户在线等待的时间太长&#xff0c;给用户一种卡死了的感觉&#xff08;就是系统迁移中&#xff0c;点击了迁移&#xff0c;界面就不动了&#xff0c;但是程序还在执行&#xff0c;…

java同步和异步的区别_java中同步与异步区别是什么

一、同步与异步概念&#xff1a;(推荐&#xff1a;java视频教程) 1.同步&#xff1a;所有的操作都做完&#xff0c;才返回给用户。这样用户在线等待的时间太长&#xff0c;给用户一种卡死了的感觉(就是系统迁移中&#xff0c;点击了迁移&#xff0c;界面就不动了&#xff0c;但…

ajax什么是异步和同步,ajax异步和同步的区别

AJAX异步 打个比方吧,通常情况下,用户注册,那么用户首先得填写好表单,然后点提交,这样表单就会向服务发出一个请求,则服务器处理代码,如果用户存在,则返回一个信息。总之,就是所有的数据需要你点提交后,信息才会发送! 而AJAX就相当于是模拟了一个信息发送请求,你可…

java8拉姆达表达式对Object去重复

java8拉姆达表达式对Object去重复 public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {Map<Object, Boolean> seen new ConcurrentHashMap<>();return object -> seen.putIfAbsent(keyExtractor.a…

拉姆达表达式 filter与map的讲解

filter 根据条件过滤元素 map 获取(映射)每个元素,并对其进行操作 参考链接

sort()与拉姆达表达式

sort()与拉姆达表达式的结合 #include <iostream> #include <string> #include <vector> #include <ctime> #include <map> #include <utility> #include <algorithm>using std::cout; using std::endl; using std::string; using …

java 拉姆达表达式_一看就懂之java8新特性函数式编程:我是拉姆达表达式lambda...

我们都知道&#xff0c; java8之后增加了很多新特性&#xff0c;大大的简化了代码的编写、阅读的负担。 先发个牢骚&#xff1a; 今天up主根据自己的理解跟大家说说新特性之一的lambda express(拉姆达表达式)&#xff0c;每当看到新的语法改动&#xff0c;内心我都是拒绝的。因…

拉姆达表达式学习(1)

我曾经遇到一个项目,项目里面需要经常对一系列的同类型集合进行操作,如对集合进行增加元素,删除集合的指定索引的元素等等.    我们可以使用ArrayList来进行.如 1 ArrayList stringListnew ArrayList(); 2 stringList.Add("大家好"); 3 stringList.Add("你们好…