如何在PyQGIS中使用cpt-city目录中的visspec色带
解决QGIS代码调用cpt-city中visspec色带的问题
你遇到的问题核心是错误地将SVG文件路径直接传给了QgsStyle.colorRamp()方法——这个方法需要的是已加载到QGIS样式库中的色带名称,而非文件路径,所以才会出现随机颜色的异常渲染结果。下面给你两种可行的解决方案:
方法一:先通过界面导入色带,再用名称调用(适合重复使用)
如果需要多次使用这个色带,先把它导入QGIS的样式库:
- 打开QGIS,点击顶部菜单栏的「设置」>「样式管理器」
- 切换到「颜色渐变」标签页,点击右上角的「导入」按钮
- 找到路径
C:/Program Files/QGIS 3.0/apps/qgis/resources/cpt-city-qgis-min/jjg/physics/visspec.svg,导入后给色带命名(比如visspec) - 之后就可以像调用内置色带一样在代码中使用:
myRenderer = QgsGraduatedSymbolRenderer() myRenderer.setClassAttribute("totalTraffic") myRenderer.setMode(QgsGraduatedSymbolRenderer.EqualInterval) myRenderer.updateClasses(gridMilano, QgsGraduatedSymbolRenderer.EqualInterval,10000) myStyle = QgsStyle().defaultStyle() # 直接用导入后的色带名称调用 ramp = myStyle.colorRamp("visspec") myRenderer.updateColorRamp(ramp) gridMilano.setRenderer(myRenderer) QgsProject.instance().addMapLayer(gridMilano)
方法二:纯代码直接加载SVG色带(无需提前导入)
如果不想依赖样式库,可以用QgsCptCityColorRamp类直接加载SVG文件,这是QGIS专门为cpt-city色带提供的API:
myRenderer = QgsGraduatedSymbolRenderer() myRenderer.setClassAttribute("totalTraffic") myRenderer.setMode(QgsGraduatedSymbolRenderer.EqualInterval) myRenderer.updateClasses(gridMilano, QgsGraduatedSymbolRenderer.EqualInterval,10000) # 直接加载SVG色带文件 svg_path = "C:/Program Files/QGIS 3.0/apps/qgis/resources/cpt-city-qgis-min/jjg/physics/visspec.svg" ramp = QgsCptCityColorRamp(svg_path) # 确认色带加载成功(可选) if ramp.isValid(): myRenderer.updateColorRamp(ramp) else: print("色带加载失败,请检查路径是否正确") gridMilano.setRenderer(myRenderer) QgsProject.instance().addMapLayer(gridMilano)
两种方法都能让你得到和QGIS界面中应用visspec色带一致的渲染效果,不会再出现随机颜色的问题。
内容的提问来源于stack exchange,提问作者Neven
相关产品推荐
相关产品推荐

