1、概述
(1)mapbox
官网:https://docs.mapbox.com/mapbox-gl-js/example/
github: https://github.com/mapbox/mapbox-gl-native
(2)mapX
使用VC++创建MapX控件步骤
在vc中作用mapx
C++ 如何根据地理坐标范围获取瓦片地图并使用CImage库实现多张图片(瓦片地图)的快速合并
用VC实现GIS系统基本功能(mapx)
(3)arcEngine
ArcEngine10.2 VC++实现地图浏览基本功能
2、arcgis
chatgpt给出的arcgis使用代码:
#include <iostream>
#include <conio.h>
#include <Windows.h>
#include <atlbase.h>
//引入ArcGIS相关头文件
#import "esriSystem.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
#import "esriGeometry.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
#import "esriDisplay.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
#import "esriCarto.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids
using namespace std;
int main() {
//初始化COM组件
CoInitialize(NULL);
//创建一个MapControl对象
CComPtr<IMapControl3> pMapControl;
HRESULT hr = pMapControl.CoCreateInstance(CLSID_MapControl);
if (FAILED(hr)) {
cout << "Failed to create MapControl" << endl;
return 1;
}
//获取ArcGIS安装路径
CComPtr<ISetup> pSetup;
hr = pSetup.CoCreateInstance(CLSID_Setup);
BSTR bstrPath;
pSetup->get_ARCGIS_INSTALL_DIR(&bstrPath);
CString strPath(bstrPath);
//加载ESRI.ArcGIS.Display.dll和ESRI.ArcGIS.System.dll
CString strDisplayPath = strPath + _T("bin\\ESRI.ArcGIS.Display.dll");
CString strSystemPath = strPath + _T("bin\\ESRI.ArcGIS.System.dll");
HINSTANCE hinstDisplay = LoadLibrary(strDisplayPath);
HINSTANCE hinstSystem = LoadLibrary(strSystemPath);
//设置MapControl的父窗口
HWND hWnd = GetConsoleWindow();
hr = pMapControl->put_HWND((OLE_HANDLE)hWnd);
//设置MapControl的显示范围
CComPtr<IMap> pMap;
pMapControl->get_Map(&pMap);
CComPtr<IEnvelope> pEnvelope;
pEnvelope.CoCreateInstance(CLSID_Envelope);
pEnvelope->PutCoords(0, 0, 100, 100);
CComPtr<IActiveView> pActiveView;
pMap->QueryInterface(IID_IActiveView, (void**)&pActiveView);
pActiveView->Extent = pEnvelope;
//加载地图文档
CString strMapPath = _T("C:\\data\\example.mxd");
CComPtr<IMapDocument> pMapDoc;
pMapDoc.CoCreateInstance(CLSID_MapDocument);
hr = pMapDoc->Open(CComBSTR(strMapPath));
if (FAILED(hr)) {
cout << "Failed to open map document" << endl;
return 1;
}
//获取MapControl中的AxMapControl对象
CComPtr<IAxMapControl3> pAxMapControl;
hr = pMapControl.QueryInterface(&pAxMapControl);
if (FAILED(hr)) {
cout << "Failed to get AxMapControl interface" << endl;
return 1;
}
//将地图文档中的地图添加到AxMapControl中
long lCount = 0;
hr = pMapDoc->get_MapCount(&lCount);
for (int i = 0; i < lCount; i++) {
CComPtr<IMap> pDocMap;
hr = pMapDoc->get_Map(i, &pDocMap);
if (FAILED(hr)) {
cout << "Failed to get map from map document" << endl;
return 1;
}
pAxMapControl->AddLayer(pDocMap, i);
}
//刷新地图
pAxMapControl->Refresh();
//开始消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
//释放资源
pMapControl.Release();
pAxMapControl.Release();
pMap.Release();
pActiveView.Release();
pEnvelope.Release();
pMapDoc.Release();
pSetup.Release();
CoUninitialize();
return 0;
}
chatgpt给出的使用mapCtrl Active控件代码:
好的,下面是使用MFC界面中加入MapControl Active控件的示例代码:
在VC++2008中创建一个MFC应用程序项目。
打开资源视图,双击IDD_DIALOG1对话框,将MapControl控件拖拽到对话框中,并调整其大小和位置。
双击IDD_DIALOG1对话框,在ClassWizard中添加成员变量,将MapControl控件命名为m_mapControl,并选择类型为CMapCtrl。
在OnInitDialog函数中添加以下代码:
BOOL CMyDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 初始化 COM 组件
CoInitialize(NULL);
// 设置 MapControl 父窗口为对话框
m_mapControl.SetParent(this);
// 获取 ArcGIS 安装路径
CComPtr<ISetup> pSetup;
HRESULT hr = pSetup.CoCreateInstance(CLSID_Setup);
BSTR bstrPath;
pSetup->get_ARCGIS_INSTALL_DIR(&bstrPath);
CString strPath(bstrPath);
// 加载 ESRI.ArcGIS.Display.dll 和 ESRI.ArcGIS.System.dll
CString strDisplayPath = strPath + _T("bin\\ESRI.ArcGIS.Display.dll");
CString strSystemPath = strPath + _T("bin\\ESRI.ArcGIS.System.dll");
HINSTANCE hinstDisplay = LoadLibrary(strDisplayPath);
HINSTANCE hinstSystem = LoadLibrary(strSystemPath);
// 设置 MapControl 显示范围
CComPtr<IEnvelope> pEnvelope;
pEnvelope.CoCreateInstance(CLSID_Envelope);
pEnvelope->PutCoords(0, 0, 100, 100);
CComPtr<IActiveView> pActiveView;
m_mapControl.GetOcx()->QueryInterface(IID_IActiveView, (void**)&pActiveView);
pActiveView->Extent = pEnvelope;
// 加载地图文档
CString strMapPath = _T("C:\\data\\example.mxd");
CComPtr<IMapDocument> pMapDoc;
pMapDoc.CoCreateInstance(CLSID_MapDocument);
hr = pMapDoc->Open(CComBSTR(strMapPath));
if (FAILED(hr)) {
MessageBox(_T("Failed to open map document"));
return FALSE;
}
// 将地图文档中的地图添加到 MapControl 中
long lCount = 0;
hr = pMapDoc->get_MapCount(&lCount);
for (int i = 0; i < lCount; i++) {
CComPtr<IMap> pDocMap;
hr = pMapDoc->get_Map(i, &pDocMap);
if (FAILED(hr)) {
MessageBox(_T("Failed to get map from map document"));
return FALSE;
}
m_mapControl.AddLayer(pDocMap, i);
}
// 刷新地图
m_mapControl.Refresh();
return TRUE;
}