前言
本文主要介绍地图一般操作,包括设置观察点,旋转,放大,缩小。
实现代码
1.创建arcgis widget工程,这次选择另一种在线地图lightGrayCanvas,online basemap有很多种类型,可以去官网的sdk查看(SDK online),也可以在QtCreator里F1查看帮助文档。
然后自定义一个垂直布局,后面要添加一些按钮上去。
Arcgis_demo::Arcgis_demo(QWidget* parent /*=nullptr*/):
QMainWindow(parent)
{
QWidget* pMainWidget = new QWidget;
QVBoxLayout* pMainLayout = new QVBoxLayout;
pMainWidget->setLayout(pMainLayout);
// Create the Widget view
m_mapView = new MapGraphicsView(this);
// Create a map using the topographic Basemap
m_map = new Map(Basemap::lightGrayCanvas(this), this);
// Set map to map view
m_mapView->setMap(m_map);
// set the mapView as the central widget
pMainLayout->addWidget(m_mapView);
setCentralWidget(pMainWidget);
m_mapView->setAttributionTextVisible(false);
this->addButtons(pMainLayout);
}
2.定位,旋转,缩放
void Arcgis_demo::addButtons(QVBoxLayout* layout)
{
// 定位
QPushButton* pButtonLocate = new QPushButton("locate");
connect(pButtonLocate, &QPushButton::clicked, this, [this](){
// 经纬度坐标,这里用了“天坛公园”的位置
Point pt(116.4104, 39.8818, SpatialReference::wgs84());
// 比例尺设置
double scale = 30000.0;
m_mapView->setViewpointCenter(pt, scale);
});
layout->addWidget(pButtonLocate);
// 旋转 30°
QPushButton* pButtonRotate = new QPushButton("rotate");
connect(pButtonRotate, &QPushButton::clicked, this, [this](){
double cur_rotation = m_mapView->currentViewpoint(ViewpointType::CenterAndScale).rotation();
cur_rotation += 30.0;
m_mapView->setViewpointRotation(cur_rotation);
});
layout->addWidget(pButtonRotate);
// 放大
QPushButton* pButtonZoomIn = new QPushButton("zoom in");
connect(pButtonZoomIn, &QPushButton::clicked, this, [this](){
double cur_scale = m_mapView->currentViewpoint(ViewpointType::CenterAndScale).targetScale();
cur_scale -= 10000.0;
m_mapView->setViewpointScale(cur_scale);
});
layout->addWidget(pButtonZoomIn);
// 缩小
QPushButton* pButtonZoomOut = new QPushButton("zoom out");
connect(pButtonZoomOut, &QPushButton::clicked, this, [this](){
double cur_scale = m_mapView->currentViewpoint(ViewpointType::CenterAndScale).targetScale();
cur_scale += 10000.0;
m_mapView->setViewpointScale(cur_scale);
});
layout->addWidget(pButtonZoomOut);
}
坐标
sdk里位置的表达一般使用Point类,它的基类是Geometry,我们可以理解为是几何图形的基类。Point只是几何图形的一种,还有Envelope,Multipart,MultiPoint这几种,我们可以把Point理解为QPointF,因为经纬度坐标是double类型的。
对于Point定义的时候要注意使用哪种空间参考,这里使用的是wgs84坐标系,
Point pt(116.4104, 39.8818, SpatialReference::wgs84());
关于坐标系的知识,本人也不是专业做地图的,这里不就卖弄了,大家自行查看sdk或者baidu。
比例尺
对应的就是scale的值,比例尺是表示图上距离比实际地理距离缩小的程度。比如,地图上的1cm代表实地距离100km,就可以写成 1∶10,000,000,相当于scale = 10000000,单位是米。
// 比例尺设置
double scale = 30000.0;
m_mapView->setViewpointCenter(pt, scale);
// 放大
double cur_scale = m_mapView-currentViewpoint(ViewpointType::CenterAndScale).targetScale();
cur_scale -= 10000.0;
// 缩小
double cur_scale = m_mapView>currentViewpoint(ViewpointType::CenterAndScale).targetScale();
cur_scale += 10000.0;
这里设置观察点的比例尺为30000米,放大缩小时,每次差值为1000米。
需要注意的是,旋转map的时候可以不去设置viewpoint观察点,因为旋转是整个地图做旋转。但是缩放的话是基于观察点的,所以如果不先调用setViewpointCenter设置观察点就去缩放,是没有效果的。
获取当前比例尺和旋转角度,也可以用下面的方法:
double cur_scale = m_mapView->mapScale();
double rotation = m_mapView->mapRotation();
效果图
代码网盘地址:
链接:https://pan.baidu.com/s/10-GHB9kST8EXfn_UzlLBbg
提取码:xd4i
地图的基本操作就介绍完了,下一篇文章说一下如何去创建绘制点线面符号。