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. [日常] Go语言圣经-基于select的多路复用习题
  2. python杂记(一)
  3. 可口的JAVA-并发控制之CountDownLatch
  4. LiveVideoStackCon深圳-服务端的任务越来越重
  5. 程序员效率:如何合理的分解任务
  6. OAuth 2.1 带来了哪些变化
  7. ToString:身份哈希码的十六进制表示形式
  8. HDU - 4348To the moon——主席树+区间修改
  9. numpy中方法参数axis取值理解
  10. python datetime datetime
  11. Black Hat USA 2021主议题介绍
  12. vxworks源码剖析- 数据结构篇一(双向链表)-转
  13. DXUT框架剖析(1)
  14. SEO实战密码阅读笔记
  15. fir低通滤波器c语言,大神教你:FIR与IIR低通滤波器的最简最快实现
  16. Verilog HDL 实现 74HC595
  17. [轉貼]奋斗5年从月薪3500到700万!
  18. Pandas官方文档!(中文版PDF下载)
  19. Linux基础入门--驱动开发--USB
  20. mytrader-开源股票期货金融软件+支持C/C++/Python/Excel/VBA/麦语言的量化分析交易平台

热门文章

  1. IAAS,PAAS,SAAS
  2. TI ADI DSP 与 ARM Cortex-A 的 FIR FFT 性能对比
  3. Wordpress博客程序网站优化该怎么做
  4. 虹科案例 | 监测各种材料液位居然如此轻松?
  5. C语言入门 - 迷信的吴医生和机智的护士
  6. C# Flurl 高性能的访问http
  7. Java各类技能知识点学习链接大全:六、SpringCloud
  8. beanstalk简介
  9. 毕设IDEA2019之ssm+Echarts框架快速入门实现数据可视化(图表统计)
  10. 浅析NOIP中的动态规划