在(1)的基础上,增加了选择文件的功能,添加栅格图片的功能,以及删除矢量、栅格数据的功能。
选择栅格图层,实现如下:
void MainWindow::openImage(){
//选择文件
QString fileName = QFileDialog::getOpenFileName(this,tr("Open image file"),"","*.tif");
if(fileName.isEmpty()){
QMessageBox::critical(this,"警告","文件名称为空");
return;
}
//存储图层
QgsRasterLayer *my_layer = nullptr;
//图层 name 设置为tifFile 供删除时使用
QString basename = "tifFile";
QString provideKey = "";
if(provideKey.isEmpty()){
my_layer = new QgsRasterLayer(fileName,basename);
}else{
my_layer = new QgsRasterLayer(fileName,basename,provideKey);
}
if(!my_layer->isValid()){
QMessageBox::critical(this,"警告","栅格图层无效");
return;
}
//添加到图层list
layers.push_front(my_layer);
//画布重绘
mapCanvas->setExtent(my_layer->extent());
mapCanvas->setLayers(layers);
mapCanvas->refresh();
}
选择矢量图层,如下(照葫芦画瓢):
void MainWindow::openVector(){
QgsVectorLayer *my_layer;
QString fileName = QFileDialog::getOpenFileName(this,tr("Open image file"),"","*.shp");
QStringList temp = fileName.split('/');
QString basename = "shpFile";
my_layer = new QgsVectorLayer(fileName,basename,"ogr");
if(!my_layer->isValid()){
QMessageBox::critical(this,"erroe",QString("layer is invalid:\n")+fileName);
}
layers.push_front(my_layer);
mapCanvas->setExtent(my_layer->extent());
mapCanvas->setLayers(layers);
mapCanvas->refresh();
}
删除矢量、栅格图层:
void MainWindow::delImage(){
for(int i = 0;i<layers.size();i++){
if(layers[i]->name() == "tifFile"){
layers.removeAt(i);
mapCanvas->setLayers(layers);
mapCanvas->refresh();
return;
}
}
}
void MainWindow::delVector(){
for(int i = 0;i<layers.size();i++){
if(layers[i]->name() == "shapFile"){
layers.removeAt(i);
mapCanvas->setLayers(layers);
mapCanvas->refresh();
return;
}
}
}
此博客介绍了如何在地图应用程序中实现文件选择功能,包括添加和删除栅格和矢量图层,并展示了相关的代码片段。开发者可以学习如何通过QFileDialog选取文件,创建并管理QgsRasterLayer和QgsVectorLayer,以及如何根据图层名进行删除操作。
6274

被折叠的 条评论
为什么被折叠?



