Arcgis runtime sdk for Qt 开发记录(三)地图基本操作

5 篇文章 13 订阅

前言

本文主要介绍地图一般操作,包括设置观察点,旋转,放大,缩小。

实现代码

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 


地图的基本操作就介绍完了,下一篇文章说一下如何去创建绘制点线面符号。

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值