/////////////////////////
#include "mygis.h"
# pragma warning (disable:4819)
//qt
#include <qmessagebox.h>
#include <QString>
#include <QFileDialog>
//gis
#include <qgsvectorlayer.h>
#include <qgsrasterlayer.h>
#include <qgsmapcanvas.h>
#include <qgsrasterlayer.h>
#include<qgsCoordinatetransform.h>
#include<qgsapplication.h>
#include<qgsproviderregistry.h>
#include<qgsmaplayerref.h>
#include<qgsmaplayerrenderer.h>
#include<qgsauthimportcertdialog.h>
//************ 创建图层 **********************************************************************************************
QgsVectorLayer* mygis::createLayer(QgsVectorLayer*newLayer)
{
QString layerProperties = "Point?"; // 定义了我们创建图层的几何类型,可以是"Point"、"LineString"、"Polygon"、"MultiPoint"、"MultiLineString"、"MultiPolygon"其中之一
layerProperties.append(QString("crs=EPSG:4236&")); //定义图层的参照坐标,如果需要一定灵活性可以参照QGis的方式通过对话框选取,或是根据自己的需求来实现,需要改变的仅仅是"EPSG:4326" 而已
layerProperties.append(QString("field=id:integer&field=name:string(50)&")); //定义的图层字段,多个字段用"&" 进行连接,完整形式为 field=name:type(length,precision) ,从参数看不仅可以定义长度还可以定义其精度
layerProperties.append(QString("index=yes&")); // 定义空间索引,于数据量较大的图层很有用
layerProperties.append(QString( // 通过QUuid创建了一个全局唯一标识符(UUID),Qt中解释主要是用于分布式计算环境中的实体标识,而此处是用于当我们多次创建临时图层时的唯一标识符
"memoryid=%1").arg(QUuid::createUuid().toString()));
newLayer = new QgsVectorLayer(
layerProperties, QString("临时点层"), QString("memory"));//开始创建临时图层
return newLayer;
}
//*************** 获取地图 *******************************************************************************************
void mygis::openMap(QgsVectorLayer*newLayer)
{
QString myPluginsDir = "..\\plugins"; //注册插件库
QgsProviderRegistry::instance(myPluginsDir);
QList<QgsMapLayer*>layer;
//创建地图画布
QgsMapCanvas*mapCanvas = new QgsMapCanvas();
//*************获取网络地图************************
//QgsRasterLayer*rastermap = new QgsRasterLayer("type=xyz&url=https://webst01.is.autonavi.com/appmaptile?style%3D6%26x%3D%7Bx%7D%26y%3D%7By%7D%26z%3D%7Bz%7D&zmax=18&zmin=0","gaode", "wms");
QgsRasterLayer*rastermap = new QgsRasterLayer("type=xyz&url=https://tile.openstreetmap.org/%7Bz%7D/%7Bx%7D/%7By%7D.png&zmax=19&zmin=0", " ", "wms");
//*************添加shp地图*************************
//QString fileName = QFileDialog::getOpenFileName(this, tr("Open shape file"), "", "*.shp");
//QStringList temp = fileName.split('/');
//QString basename = temp.at(temp.size() - 1);
//QgsVectorLayer*rastermap = new QgsVectorLayer(fileName, basename, "ogr");
if (!rastermap->isValid())
{
QMessageBox::critical(this, "error", QString("This layer is invalid"));
}
else
{
layer.append(newLayer);
}
//把图层添加到地图画布并显示
mapCanvas->setExtent(rastermap->extent());////设置显示范围。Extent:范围、尺度
layer.append(rastermap);
mapCanvas->setLayers(layer);//设置图层集合
mapCanvas->setVisible(true);//设置是否可见
mapCanvas->freeze(false);//解冻对图层的操作
mapCanvas->resize(800, 500);
layer.append(rastermap);
mapCanvas->setVisible(true);//设置是否可见
mapCanvas->refresh();
mapCanvas->show();
//mapCanvas->exec();
//mapCanvas->resize(800, 500);
//layout->addWidget(mapCanvas);
}
//*************** 创建点 ******************************************************************************************
QgsVectorLayer* mygis::drawPoint(QgsVectorLayer*newLayer, double x, double y)
{
//定义坐标转换对象trans,从src向dest转换(CRS转换)
//EPSG:4326指的是WGS84系统..EPSG是最常用的授权机构,它涵盖了全世界范围广泛的坐标系统。
QgsCoordinateReferenceSystem src(4326, QgsCoordinateReferenceSystem::EpsgCrsId);
QgsCoordinateReferenceSystem dest(3857, QgsCoordinateReferenceSystem::EpsgCrsId);
QgsCoordinateTransformContext context;
QgsCoordinateTransform trans(src, dest, context);
//转换坐标
QgsPointXY point = trans.transform(x, y);
QgsVectorDataProvider* dateProvider = newLayer->dataProvider();//创建一个容器
// 创建点
QgsFeature MyFeature;
MyFeature.setGeometry(QgsGeometry::fromPointXY(point));
MyFeature.setAttributes(QgsAttributes() << QVariant() << QVariant("test"));
// 开始编辑
newLayer->startEditing();
// 添加要素
if (newLayer->isValid())
dateProvider->addFeatures(QgsFeatureList() << MyFeature);
else
QMessageBox::critical(this, "error", QString("enter layer is invalid"));
// 保存
newLayer->commitChanges();
// 更新范围
newLayer->updateExtents();
//newLayer->show();
return newLayer;
}
vs+qgis+qt实现地图上画点
需积分: 50 22 浏览量
2020-11-07
10:47:46
上传
评论 6
收藏 3KB ZIP 举报
UniteOne
- 粉丝: 238
- 资源: 34
最新资源
- 笔记实验六,spark,大数据分析
- ####蓝桥杯python的详细的信息介绍
- 电子万年历软件仿真(经过多次修改,保证正确性)
- Unity XR 手势射击控制脚本(适用于任何可手势识别的设备)
- 机械设计全自动电表(NB和IC卡表)控制和上壳装配线sw16可编辑非常好的设计图纸100%好用.zip
- 基于matlab的EAN-13条形码识别系统GUI界面.zip代码53
- matlab基于bp神经网络交通信号标志识别GUI界面13个标志.zip代码54
- 电子万年历答辩实物展示视频mp4格式
- 基于python实现的程序,包括哈希感知算法cvHash,图像切割cvsplit,固定目标检测cvRec(附文档ppt)等
- 计算0-10000之间所有偶数的和
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0