1、正常使用m_rasterLaye = new QgsRasterLayer(filename, basename, "gdal");加载一幅.mbtiles格式的地图
2、使用
QString path = "multipoint?";
path.append( QString( "crs=EPSG:4326&")); //参照坐标系
path.append( QString( "field=id:integer&field=name:string(50)&")); //添加字段属性
path.append( QString( "index=yes&" )); // 创建索引
path.append( QString( "memoryid=%1").arg(QUuid::createUuid().toString())); // 临时编码
// 创建新矢量图层
DotLayer = new QgsVectorLayer( path, QString("dot Layer"), QString( "memory"));
添加渲染器
QgsSimpleMarkerSymbolLayer* dot_Renderer_Layer = new QgsSimpleMarkerSymbolLayer();
dot_Renderer_Layer->setColor(Qt::red);
dot_Renderer_Layer->setSize(1.0);
// 创建QgsSymbolLayerList
QgsSymbolLayerList Sym_Layer_List;
Sym_Layer_List.append(dot_Renderer_Layer);
// 构建QgsMarkerSymbol
QgsMarkerSymbol* MarkerSymbol = new QgsMarkerSymbol(Sym_Layer_List);
// 构建QgsSingleSymbolRenderer, 即最终图层的渲染器
QgsSingleSymbolRenderer* Sym_Renderer = new QgsSingleSymbolRenderer(MarkerSymbol);
// 设置当前图层的渲染器
DotLayer->setRenderer(Sym_Renderer);
3、开启一个线程,在线程中开启一个40ms的定时器,使用以下先删除特征
sInstance->m_mapcanvas->freeze();
// 开始编辑会话后,所作的修改不会被永久记录,需要调用commitChanges()以确认保存,或者调用rollBack()撤销修改。
sInstance->DotLayer->startEditing();
if(sInstance->DotLayer->allFeatureIds().size() > 0)
{
sInstance->DotLayer->deleteFeatures(sInstance->DotLayer->allFeatureIds());//删除特征(清空图层)
}
然后在添加新的特征,确认变化,解锁画布
sInstance->DotLayer->addFeature(feature);
// 确认变化
sInstance->DotLayer->commitChanges(); // alternatively, using rollBack() to Undo the change
sInstance->DotLayer->updateExtents();
sInstance->m_mapcanvas->freeze(false); // 画布解锁
运行程序,加载的地图地图无法显示,要把地图画布缩放很小时,底图才能显示。
或把定时器的时间改为300ms时,底图才能显示。
我查看了,画布默认的MapUpdateInterval时间是250ms,难道是定时器40ms刷新太快了,地图反应不过来,当我把创建的矢量图层不显示时,地图底图又显示出来了,不知道怎么弄了,望朋友们指导。
还有,有没有动态添加大容量图层特征的方法?望指导!