在(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;
}
}
}