1、核心代码

#include "stdafx.h"
#include "BingMapProvider.h"
#include "SecureHttpClient.h"// ******************************************************
//    Initialize()
// ******************************************************
// Runs imagery metadata request: http://msdn.microsoft.com/en-us/library/ff701716.aspx
bool BingBaseProvider::Initialize()
{if (_urlFormat.GetLength() > 0) return true;// 如果应用层未设置key,则从网络获取keyif (m_globalSettings.bingApiKey.GetLength() == 0){CallbackHelper::ErrorMsg("No Bing Maps API key was provided. See GlobalSettings.BingApiKey.");//SecureHttpClient httpClient;CAtlNavigateData navData;CString url = _T("http://dev.virtualearth.net/webservices/v1/LoggingService/LoggingService.svc/Log?entry=0&fmt=1&type=3&group=MapControl&name=AJAX&mkt=en-us&auth=Akw4XWHH0ngzzB_4DmHOv_XByRBtX5qwLAS9RgRYDamxvLeIxRfSzmuvWFB9RF7d&jsonp=microsoftMapsNetworkCallback");if (!httpClient.Navigate(url, &navData) || httpClient.GetStatus() != 200){CallbackHelper::ErrorMsg(Debug::Format("Failed to perform imagery metadata request. URL: %s", url));return false;}int bodyLen = httpClient.GetBodyLength();if (bodyLen > 0){// microsoftMapsNetworkCallback({"sessionId" : "xxx", "authenticationResultCode" : "ValidCredentials"})char* body = new char[bodyLen + 1];memcpy(body, httpClient.GetBody(), bodyLen);Debug::WriteLine("%s", body);CString s = body;int pos = s.Find(":");int pos2 = s.Find(",");CString key = s.Mid(pos+1, pos2-pos-1).TrimLeft().TrimRight();key = key.Mid(1, key.GetLength()-2);delete[] body;m_globalSettings.bingApiKey = key;}else{return false;}//}_initAttemptCount++;if (_initAttemptCount > 3){CallbackHelper::ErrorMsg("Number of initialization attempts for Bing Maps provider was exceeded (3).");return false;}/*如果联网在线,可通过如下地址来获取key值http://dev.virtualearth.net/webservices/v1/LoggingService/LoggingService.svc/Log?entry=0&fmt=1&type=3&group=MapControl&name=AJAX&mkt=en-us&auth=Akw4XWHH0ngzzB_4DmHOv_XByRBtX5qwLAS9RgRYDamxvLeIxRfSzmuvWFB9RF7d&jsonp=microsoftMapsNetworkCallback返回值jason格式microsoftMapsNetworkCallback({"sessionId" : "xxx", "authenticationResultCode" : "ValidCredentials"})microsoftMapsNetworkCallback({"sessionId" : "AhtbH82M5_LijAFAcRmsCBLUqYSeXdzF5Yv675hENC6xhwchukbh18IxQkzfYVyP", "authenticationResultCode" : "ValidCredentials"})sessionId就是key值*/SecureHttpClient client;client.SetProxyAndAuthentication(_proxyUsername, _proxyPassword, _proxyDomain);CAtlNavigateData navData;CString url;url.Format("http://dev.virtualearth.net/REST/v1/Imagery/Metadata/%s?key=%s&o=xml", _imagerySet, m_globalSettings.bingApiKey);bool result = false;if (!client.Navigate(url, &navData) || client.GetStatus() != 200){CallbackHelper::ErrorMsg(Debug::Format("Failed to perform imagery metadata request. URL: ", url));return false;}return ParseUrlFormat(reinterpret_cast<void*>(&client));
}// ******************************************************
//    ParseUrlFormat()
// ******************************************************
bool BingBaseProvider::ParseUrlFormat(void* secureHttpClient)
{SecureHttpClient* client = reinterpret_cast<SecureHttpClient*>(secureHttpClient);int bodyLen = client->GetBodyLength();if (bodyLen > 0){char* body = new char[bodyLen + 1];memcpy(body, client->GetBody(), bodyLen);CString s = body;delete[] body;s = s.MakeLower();int pos = s.Find("<imageurl>");int pos2 = s.Find("</imageurl>");s = s.Mid(pos + 10, pos2 - pos - 10);s.Replace("&amp;", "&");if (s.GetLength() == 0)return false;_urlFormat = s;return true;}return false;
}// ******************************************************
//    TileXYToQuadKey()
// ******************************************************
// Converts tile XY coordinates into a QuadKey at a specified level of detail.
// LevelOfDetail: Level of detail, from 1 (lowest detail) to 23 (highest detail).
CString BingBaseProvider::TileXYToQuadKey(int tileX, int tileY, int levelOfDetail)
{CString s;for (int i = levelOfDetail; i > 0; i--){char digit = '0';int mask = 1 << (i - 1);if ((tileX & mask) != 0){digit++;}if ((tileY & mask) != 0){digit++;digit++;}s.AppendChar(digit);}return s;
}// ******************************************************
//    MakeTileImageUrl()
// ******************************************************
CString BingBaseProvider::MakeTileImageUrl(CPoint &pos, int zoom)
{// http://ecn.{subdomain}.tiles.virtualearth.net/tiles/r{quadkey}.jpeg?g=3179&mkt={culture}&shading=hillCString key = TileXYToQuadKey(pos.x, pos.y, zoom);CString subDomain;subDomain.Format("t%d", GetServerNum(pos, 4));CString temp = _urlFormat;temp.Replace("{quadkey}", key);temp.Replace("{culture}", LanguageStr);temp.Replace("{subdomain}", subDomain);return temp;
}// ******************************************************
//    GetCopyright()
// ******************************************************
CStringW BingBaseProvider::GetCopyright()
{if (_urlFormat.GetLength() == 0) {return "INVALID BING MAPS API KEY";}else {return _copyright;}
}

2、AppKey

方法一:调用系统函数CGlobalSettings::SetHereMapsApiKey

方法二:扩展CGlobalSettings接口,修改GlocalSetting.h/cpp文件

// ***************************************************************
//      BingApiKey
// ***************************************************************
STDMETHODIMP CGlobalSettings::get_BingApiKey(BSTR* pVal)
{AFX_MANAGE_STATE(AfxGetStaticModuleState());*pVal = A2BSTR(m_globalSettings.bingApiKey);return S_OK;
}
STDMETHODIMP CGlobalSettings::put_BingApiKey(BSTR newVal)
{AFX_MANAGE_STATE(AfxGetStaticModuleState());USES_CONVERSION;m_globalSettings.bingApiKey = OLE2A(newVal);return S_OK;
}

3、效果图

后期奉上,敬请关注..

MFC之 MapWinGis叠加必应瓦片地图相关推荐

  1. 百度、高德、腾讯、天地图、谷歌、必应等地图切图工具 MapCutter 3.7.1

    百度.高德.腾讯.天地图.谷歌.必应等自定义地图/图片叠加层/瓦片图/金字塔图地图切图高清切片生成工具 MapCutter(旧名MapTiler) ,定位便捷,支持超大地图,支持leaflet.map ...

  2. axtoolbarcontrol加载图层后还是灰的_OpenLayers教程九:多源数据加载之瓦片地图原理一...

    一.瓦片地图简介 瓦片地图(也叫切片地图)源于一种大地图解决方案,就是在多个比例尺下配置地图,然后提前把每个比例尺下的地图绘制为小块图片(瓦片),保存在服务器上用于缓存的目录中.这样客户端在访问地图时 ...

  3. 瓦片地图面面观之缩放级别

    缩放级别 我们知道瓦片地图基于瓦片,而瓦片本身是栅格数据,无法再保证不损失图元数据的情况下对其连续缩放.因此瓦片地图一般通过定义缩放级别的方式来实现瓦片地图的层级缩放. 一般瓦片地图定义缩放级别在1~ ...

  4. 高德地图 sdk 加载 geoserver 发布的瓦片地图服务

    前言 最近,碰到了需求,想要在高德 sdk 中使用在 geoserver 里面发布的瓦片地图. 还好经过一番研究,在其官方文档中发现,从新版本(v1.4.3开始)的高德 sdk 开始,已经支持加载第三 ...

  5. 瓦片地图面面观之投影

    投影 对于地图制图:原面为地球的旋转椭球面,是三维的:承受面(对瓦片地图而言为瓦片)为二维平面的.如何在原面与承受面之间建立点.线.面的一一对应关系是地图制图的必须过程,这一过程通常称之为:地图投影. ...

  6. ios 高德地图加载瓦片地图_iOS高德地图添加自定义瓦片地图

    瓦片地图 首先解释一下什么是瓦片地图,我们使用的地图(例如百度,高德)都有一个底图,在每一级的缩放比例下,都有一张很大的底图,这张底图按固定的大小切割成若干份,在地图显示时根据显示范围和缩放比例,请求 ...

  7. 瓦片地图面面观之瓦片组织

    瓦片组织 通过<瓦片地图面面观>一中图1瓦片网格的辅助,可直观感受到谷歌地图在第一级(缩放级别)的瓦片行列排列方式.可见谷歌地图第一级由四张瓦片构成了整个世界地图. 我们将瓦片地图中,瓦片 ...

  8. 高德WMTS瓦片地图服务地图图源规律

    本篇文章为转载记录,原文:[转]高德WMTS瓦片地图服务地图图源规律_为了淑宝努力努力的博客-CSDN博客 高德地图服务地址规则 先来看一个典型的高德地图的瓦片请求: https://wprd02.i ...

  9. 在openlayer中对瓦片地图进行平移

    失踪人口回归. 这次给大家介绍的是在openlayer中对在线瓦片地图进行平移.可以解决将高德/百度瓦片地图的偏移问题. 适用的场景:当某个在线瓦片地图的坐标系与我们需要的底图坐标系不同,我们很难对每 ...

最新文章

  1. kylin KV+cube方案分析
  2. TCP/IP之TCP连接的建立与中止状态分析
  3. 丽水数据可视化设计价格_50个数据可视化最有价值的图表(建议收藏)
  4. 如何使用ARM创建Teams Bot所需要的Azure资源
  5. vc中把数据库记录表导入Excel
  6. python 玩公众号游戏_从零基础开始,用python手把手教你玩跳一跳小游戏,直接打出高分...
  7. 计算机考研机试指南(九)——搜索(百鸡问题、ABC、胜利大逃亡、迷宫问题、C翻转、旋转矩阵、字符串匹配、)...
  8. 通过一个实例掌握测试工具JMeter的一些基本概念
  9. attachEvent时间监听方式
  10. office实操技能01:修改微软Office页面的(非背景的)浅绿底色、设置默认字体和主题颜色、取消页眉横线、PPT默认的等线字体
  11. tkmybatis 子查询_【10/21】南池袋送餐桌和椅子 收纳盒子 洗衣机 | 下落合站送洗衣机...
  12. Http发送get、post、delete、put请求
  13. 仿真(Simulation)
  14. jquery 输入框失去焦点时 (blur)事件
  15. beatsx三闪红灯_beatsX耳机维修,beats耳机红灯白灯闪维修,南京beatsX耳机维修
  16. 如何在Linux中使用LNMP一键安装包快速安装LNMP环境
  17. 项目管理证书 PMP 考试费用要多少?
  18. 如何清除DNS缓存,使用cmd命令清理DNS缓存方法
  19. 阿里P8的《MySQL学习笔记》火了,完整版开放下载!
  20. 史上最全的Java判断是否为中文字符

热门文章

  1. tft_espi和nodemcu连接
  2. 智慧家——全家具功能
  3. c语言计算阶乘的和的代码,【C语言训练】阶乘和数* (C语言代码)
  4. 客户管理系统 案例分享
  5. Android Flutter开发环境搭建
  6. linux sudo -i 参数,Linux系统中su、sudo、sudo su、sudo -i命令的用法和区别小结
  7. 1000个jquery极品插件
  8. Day314.外观模式享元模式 -Java设计模式
  9. 西电 python OJ作业 1012:汇率兑换
  10. 小红书种草KOC+KOL达人