m_pRubBandPt = new QgsRubberBand(mcanvas, Qgis::GeometryType::Point); //m_pRubBandPt->setColor(QColor(0, 255, 0)); //m_pRubBandPt->setWidth(2); //m_pRubBandPt->setIcon(QgsRubberBand::ICON_X); //m_pRubBandPt->setIconSize(20); QgsSvgMarkerSymbolLayer* svgMarkerLayer = new QgsSvgMarkerSymbolLayer("Point.svg"); QgsSymbolLayerList symbolList; symbolList << svgMarkerLayer; QgsMarkerSymbol* mpMarkerSymbolPt = new QgsMarkerSymbol(symbolList); // 将新创建的符号应用于QgsRubberBand对象 m_pRubBandPt->setSymbol(mpMarkerSymbolPt); 如上的代码能实现m_pRubBandPt在addpoint时候用svg代替么
时间: 2024-04-11 07:30:43 浏览: 147
是的,上述代码可以将`m_pRubBandPt`对象在添加点时使用SVG文件作为符号样式。代码中创建了一个`QgsSvgMarkerSymbolLayer`对象,并将SVG文件路径传递给它。然后,将该符号样式添加到`QgsMarkerSymbol`对象中,并将其应用于`m_pRubBandPt`对象。
请确保SVG文件路径正确,并且SVG文件在指定的位置可访问。这样,当你调用`m_pRubBandPt->addPoint(point)`时,QGIS将使用SVG文件作为点的符号样式。
如果你遇到任何问题,请随时提问。
相关问题
一个画布对象m_mpMapCanvas->setDestinationCrs(national2000Crs);,将其设为国家2000坐标系。现在,我继承QgsMapTool写了一个工具类,鼠标按下时候,传入的点坐标什么坐标? 然后我将点坐标做了如下处理 const QgsMapToPixel* pTransform = mcanvas->getCoordinateTransform(); QgsPointXY mPoint = pTransform->toMapCoordinates(pt.x(), pt.y()); 其中pt为鼠标传入的点坐标,我这样处理的将鼠标传入的点坐标处理为国家2000的坐标了么
根据您提供的代码片段,可以看出以下几点:
1. `m_mpMapCanvas->setDestinationCrs(national2000Crs)` 将地图画布的目标坐标系设置为国家2000坐标系。
2. 您继承了 `QgsMapTool` 并编写了一个工具类,当鼠标按下时会传入一个点坐标。
3. 通过 `mcanvas->getCoordinateTransform()` 获取到一个坐标转换对象,并使用该对象将鼠标传入的点坐标进行转换。
根据以上信息,您已经将鼠标传入的点坐标使用 `pTransform->toMapCoordinates(pt.x(), pt.y())` 进行了从屏幕像素坐标转换到地图坐标系(国家2000坐标系)的转换。
因此,您已经将鼠标传入的点坐标成功地处理为国家2000坐标系的坐标。请注意,这里的 `mPoint` 变量将包含转换后的国家2000坐标系下的点坐标。
private void drawBitmap() { try { mCanvas = null; //Log.d("MyView","判断bt是否为空"); ConcurrentLinkedDeque<Bitmap> drawDeque = cameraService.bitmapDeque; Log.d("调试draw", "drawDeque.size()=" + drawDeque.size()); Bitmap draw_bitmap=drawDeque.poll(); if (draw_bitmap != null) { // synchronized (MyBitmap.class) { //获得canvas对象 获取可以进行绘图的画布 mCanvas = mSurfaceHolder.lockCanvas(); //来锁定画布 //绘制背景 mCanvas.drawColor(Color.BLACK); //位图对象slip 在坐标 (1220, 0) 处绘制。 mCanvas.drawBitmap(slip, 1220, 0, paint); mCanvas.drawBitmap(draw_bitmap, 0, 0, paint); mCanvas.drawBitmap(windowService.getKiwibird(),0,0,paint); mCanvas.drawBitmap(windowService.getattent(),1040,150,paint); Log.d("调试", "画图一次"); //MyBitmap.bt = null; //释放位图资源 } //} //绘图 } catch (Exception e) { } finally { if (mCanvas != null) { //释放画布,并提交绘图操作。 mSurfaceHolder.unlockCanvasAndPost(mCanvas); } } } 为什么这里获取不了cameraService.bitmapDeque;使得drawDeque.size()一直为0
在这段代码中,获取不到`cameraService.bitmapDeque`的原因可能有几个可能情况:
1. `cameraService.bitmapDeque`为空:在调用`drawBitmap()`方法之前,确保`cameraService.bitmapDeque`已经被正确初始化。可以通过调试或添加日志输出来确认。
2. `cameraService.bitmapDeque`在其他地方被修改或清空:确保在调用`drawBitmap()`方法时,`cameraService.bitmapDeque`没有被其他线程修改或清空。可以在访问和修改`cameraService.bitmapDeque`的地方添加适当的同步机制,例如使用`synchronized`关键字或其他线程安全的集合类。
3. `drawDeque.poll()`返回null:`drawDeque.poll()`方法从队列中获取并删除元素,如果队列为空,则返回null。确保在调用`drawDeque.poll()`之前,队列中有元素。可以通过添加日志输出来检查队列中是否有元素。
通过仔细检查这些可能的情况,应该能够找到导致`drawDeque.size()`始终为0的原因,并解决问题。
阅读全文