MFC之 MapWinGis叠加OpenStreet瓦片地图

1、核心代码

/**************************************************************************************
 * Project: MapWindow Open Source (MapWinGis ActiveX control)
 **************************************************************************************
 * The contents of this file are subject to the Mozilla Public License Version 1.1
 * (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at http://www.mozilla.org/mpl/
 * See the License for the specific language governing rights and limitations
 * under the License.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 **************************************************************************************
 * Contributor(s):
 * (Open source contributors should list themselves and their modifications here). */

#pragma once
#include "BaseProvider.h"

// *******************************************************
//			OpenStreetMapProvider
// *******************************************************
class OpenStreetMapProvider : public BaseProvider
{
public:
	int count;

	OpenStreetMapProvider()
	{
		count = 0;
		Id = tkTileProvider::OpenStreetMap;
		Name = "OpenStreetMap";
		_copyright.Format(L"Copyright @ %d, OpenStreetMap,All Rights Reserved");
		this->_projection = new MercatorProjection();
		_subProviders.push_back(this);
		_serverLetters = "abc";
		_refererUrl = "http://www.openstreetmap.org/";
		_urlFormat = "http://%c.tile.openstreetmap.org/%d/%d/%d.png";
		_maxZoom = 19;
		_licenseUrl = "http://wiki.openstreetmap.org/wiki/Tile_usage_policy";
	}

	CString MakeTileImageUrl(CPoint &pos, int zoom)
	{
		char letter = _serverLetters[count % 3];
		count++;
		CString s;
		s.Format(_urlFormat, letter, zoom, pos.x, pos.y);
		return s;
	}
};


class OpenStreet4UMapProvider : public OpenStreetMapProvider
{
public:	
	OpenStreet4UMapProvider() 
	{
		Id = tkTileProvider::OpenStreet4UMap;
		Name = "OpenStreet4UMap";
		_refererUrl = "http://www.opencyclemap.org/";
		_licenseUrl = "http://www.opencyclemap.org/docs/";
		_urlFormat = "http://4umaps.eu/%d/%d/%d.png";
	}

	CString MakeTileImageUrl(CPoint &pos, int zoom)
	{
		CString s; 
		s.Format(_urlFormat, zoom, pos.x, pos.y);
		return s;
	}
};


class OpenCycleMapProvider: public OpenStreetMapProvider
{
public:	
	OpenCycleMapProvider() 
	{
		Id = tkTileProvider::OpenCycleMap;
		Name = "OpenCycleMap";
		_refererUrl = "http://www.opencyclemap.org/";
		_licenseUrl = "http://www.opencyclemap.org/docs/";
		_urlFormat = "http://%c.tile.opencyclemap.org/cycle/%d/%d/%d.png";
	}
};


class OpenCycleLandscapeMapProvider : public OpenStreetMapProvider
{
public:	
	OpenCycleLandscapeMapProvider() 
	{
		Id = tkTileProvider::OpenCycleLandscapeMap;
		Name = "OpenCycleLandscapeMap";
		_refererUrl = "http://www.opencyclemap.org/";
		_licenseUrl = "http://www.opencyclemap.org/docs/";
		_urlFormat = "http://%c.tile3.opencyclemap.org/landscape/%d/%d/%d.png";;
	}
};


class OpenTransportMapProvider: public OpenStreetMapProvider
{
public:	
	OpenTransportMapProvider() 
	{
		Id = tkTileProvider::OpenTransportMap;
		Name = "OpenTransportMap";
		_refererUrl = "http://www.opencyclemap.org/";
		_urlFormat = "http://%c.tile2.opencyclemap.org/transport/%d/%d/%d.png";
	}
};


class OpenHumanitarianMapProvider : public OpenStreetMapProvider
{
public:
	OpenHumanitarianMapProvider()
	{
		Id = tkTileProvider::OpenHumanitarianMap;
		Name = "OpenHumanitarianMap";
		_refererUrl = "http://www.openstreetmap.org/";
		_urlFormat = "http://%c.tile.openstreetmap.fr/hot/%d/%d/%d.png";
	}
};

class OpenSeaHybridMapProvider : public OpenStreet4UMapProvider
{
public:
	OpenSeaHybridMapProvider()
	{
		Id = tkTileProvider::OpenSeaHybridMap;
		Name = "OpenSeaHybridMap";
		_refererUrl = "http://www.mapquest.com/";
		_licenseUrl = "http://developer.mapquest.com/web/products/open/map";
		_urlFormat = "http://tiles.openseamap.org/seamark/%d/%d/%d.png";
	}
};

class MapQuestProvider : public OpenStreetMapProvider
{
public:
	MapQuestProvider()
	{
		Id = tkTileProvider::MapQuestAerial;
		Name = "MapQuest Aerial";
		_refererUrl = "http://www.mapquest.com/";
		_licenseUrl = "http://developer.mapquest.com/web/products/open/map";
		_urlFormat = "http://otile%c.mqcdn.com/tiles/1.0.0/sat/%d/%d/%d.png";
		_serverLetters = "1234";
		_copyright = "Tiles Courtesy of MapQuest";
	}
};


class OpenStreetQuestHybridMapProvider : public OpenStreetMapProvider
{
public:
	OpenStreetQuestHybridMapProvider()
	{
		Id = tkTileProvider::OpenStreetQuestHybridMap;
		Name = "OpenStreetQuestHybridMap";
		_refererUrl = "http://www.mapquest.com/";
		_licenseUrl = "http://developer.mapquest.com/web/products/open/map";
		_urlFormat = "http://otile%d.mqcdn.com/tiles/1.0.0/hyb/%d/%d/%d.png";
	}
	CString MakeTileImageUrl(CPoint &pos, int zoom)
	{
		CString s; 
		s.Format(_urlFormat, GetServerNum(pos, 3)+1, zoom, pos.x, pos.y);
		return s;
	}
};

class OpenStreetQuestSatteliteMapProvider : public OpenStreetMapProvider
{
public:
	OpenStreetQuestSatteliteMapProvider()
	{
		Id = tkTileProvider::OpenStreetQuestSatteliteMap;
		Name = "OpenStreetQuestSatteliteMap";
		_refererUrl = "http://www.mapquest.com/";
		_licenseUrl = "http://developer.mapquest.com/web/products/open/map";
		_urlFormat = "http://otile%d.mqcdn.com/tiles/1.0.0/sat/%d/%d/%d.jpg";
	}
};

class OpenStreetSurferMapProvider :	public OpenStreet4UMapProvider
{
public:
	OpenStreetSurferMapProvider()
	{
		Id = tkTileProvider::OpenStreetSurferMap;
		Name = "OpenStreetSurferMap";
		_refererUrl = "http://www.mapquest.com/";
		_licenseUrl = "http://developer.mapquest.com/web/products/open/map";
		_urlFormat = "http://tiles1.mapsurfer.net/tms_r.ashx?x=%d&y=%d&z=%d";
	}
};

class OpenStreetSurferTerrainMapProvider :	public OpenStreet4UMapProvider
{
public:
	OpenStreetSurferTerrainMapProvider()
	{
		Id = tkTileProvider::OpenStreetSurferTerrainMap;
		Name = "OpenStreetSurferTerrainMap";
		_refererUrl = "http://www.mapquest.com/";
		_licenseUrl = "http://developer.mapquest.com/web/products/open/map";
		_urlFormat = "http://tiles2.mapsurfer.net/tms_t.ashx?x=%d&y=%d&z=%d";
	}
};

class OpenStreetOsmMapProvider : public OpenStreetMapProvider
{
public:
	OpenStreetOsmMapProvider()
	{
		Id = tkTileProvider::OpenStreetOsmMap;
		Name = "OpenStreetOsmMap";
		_refererUrl = "http://www.mapquest.com/";
		_licenseUrl = "http://developer.mapquest.com/web/products/open/map";
		_urlFormat = "http://%d.tah.openstreetmap.org/Tiles/tile/%d/%d/%d.png";
	}
};

2、效果图


版权声明:本文为u012156872原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。