Geoserver 上的动态 SLD

Posted

技术标签:

【中文标题】Geoserver 上的动态 SLD【英文标题】:Dynamic SLD on Geoserver 【发布时间】:2021-11-30 11:23:35 【问题描述】:

有人可以帮我处理 geoserver 上的这个 CSS sld 吗?

如果有人有更好的选择而不是我的方法,请提出建议。

[activity_group_id = 20] [application_status = 'PreSanction-Pending']
  mark:symbol('ttf://ESRI Business#39');
  :symbol 
    fill:#FF0000;
    


[activity_group_id = 20] [application_status = 'Payment-Done']
  mark:symbol('ttf://ESRI Business#39');
  :symbol 
    fill:#00FF00;
    


[activity_group_id = 20] [application_status = 'Work-Completed']
  mark:symbol('ttf://ESRI Business#39');
  :symbol 
    fill:#0000FF;
    


[activity_group_id = 20] [application_status = 'PreSanction-Received']
  mark:symbol('ttf://ESRI Business#39');
  :symbol 
    fill:#00FFFF;
    

这工作正常 但我想使用 if-then-else 来简化它 我被困住了

因为那里有 30 多个唯一的“activity_group_id”

我有每行有两个变量“activity_group_id”和“activity_status”的点数据, 我正在使用 ttf 符号显示为图层,但条件是, 每个点都需要根据其状态分配颜色(填充) 它总共有 4 个独特的价值,因为我是 sld 引用文档的新手,但没有找到任何解决方案。

编辑:- 为点位置图层添加一些测试数据

activity_group_id application_status desk4_longitude desk4_latitude
20  "Work-Completed"    77.8912643252645    20.7848792063826
20  "PreSanction-Pending"   77.8912791454753    20.7796634062134
20  "Payment-Done"  77.874307404545 20.7786504284761
20  "PreSanction-Pending"   77.8748653559629    20.7777572907007
20  "Payment-Done"  77.8935239518168    20.7742195299066
20  "PreSanction-Pending"   77.8887775696933    20.7848194877974
20  "PreSanction-Received"  77.8829004567405    20.7622202218188

【问题讨论】:

似乎有一种方法可以使用 ogc 过滤器,请参阅gis.stackexchange.com/a/262356 @Jose Hermosilla Rodrigo 我使用了这里的 css 链接,并从您的建议中得到了参考,谢谢。 docs.geoserver.org/stable/en/user/styling/css/examples/… 【参考方案1】:

使用recode function 来简化样式。 我无法测试它,但应该是这样的:

[activity_group_id = 20] 
  mark:symbol('ttf://ESRI Business#39');
  :symbol 
     fill: recode(application_status, 
           'Payment-Done', #00FF00,
           'Work-Completed', #0000FF,
           'PreSanction-Received', #00FFFF);
  

如果颜色基于application_status相同,但形状根据组id发生变化,则使用级联并设置单独的规则:

[activity_group_id = 20] 
  mark:symbol('ttf://ESRI Business#39');


[activity_group_id = anotherId] 
  mark:symbol('ttf://anotherSymbol');


* 
  :symbol 
     fill: recode(application_status, 
           'Payment-Done', #00FF00,
           'Work-Completed', #0000FF,
           'PreSanction-Received', #00FFFF);
  

【讨论】:

非常感谢您的回答,在我的情况下第一种情况适用。【参考方案2】:

@Andrea 艾梅

根据您的参考,我检查了文档,并对您的答案的语法进行了一些更改 分享我的答案以供其他人帮助

check geoserver css doc

/* @title Apiculture */
[activity_group_id = 20] 
  mark:symbol('ttf://ESRI Business#39');
  mark-size:15;
  :symbol 
     fill: [recode(application_status,
            'PreSanction-Pending','#FF0000',
           'Payment-Done', '#00FF00',
           'Work-Completed', '#0000FF',
           'PreSanction-Received', '#00FFFF')];
  


/* @title Sprinkler Irrigation */
[activity_group_id = 19] 
  mark:symbol('ttf://ESRI Business#40');
  mark-size:15;
  :symbol 
     fill: [recode(application_status,
            'PreSanction-Pending','#FF0000',
           'Payment-Done', '#00FF00',
           'Work-Completed', '#0000FF',
           'PreSanction-Received', '#00FFFF')];
  

【讨论】:

以上是关于Geoserver 上的动态 SLD的主要内容,如果未能解决你的问题,请参考以下文章

通过SLD_BODY动态改变geoserver的图层样式

GeoServer 上的未知坐标参考系统

在 Leaflet.js 中消除光栅图像上的白色、无数据像素时遇到问题,通过 GeoServer 提供服务

GeoServer Image Mosaics:PostGIS 索引表上的查询超过最大连接限制

关于geoserver 和MapInfo的样式问题

我需要在我的服务器上的同一个 Tomcat 7 中运行 Pentaho CE BI-Server 和 Geoserver