вторник, 6 декабря 2011 г.

Пространственная фильтрация при создании PDF документа в геосервере

Для создания PDF документа в геосервере я использую плагин geoserver-2.1-SNAPSHOT-printing-plugin. Подробнее о его применении описано в Руководстве пользователя. Я формирую запрос:
http://tomcat:8080/geoserver/pdf/print.pdf?spec={
    "units":"m",
    "srs":"EPSG:60000",
    "layout":"A4 landscape",
    "dpi":100,
    "header":"2 rayon",
    "footer":"",
    "layers": [{
        "baseURL":"http://tomcat:8080/geoserver/wms",
        "opacity":1,
        "singleTile":true,
        "type":"WMS",
        "layers":["egko","net_rayon"],
        "format":"image/png",
        "styles":["",""]
    }],
    "pages":[{"bbox":[1009,4821,7336,12355]}]
}
и получаю ответ
На карте включено два слоя: egko и net_rayon. Мне требуется убрать все объекты с карты, которые расположены за пределами полигона в слое net_rayon, имеющего атрибут name со значением 2. Для этого обычно используют CQL фильтрацию. К сожалению, примера использования такой фильтрации я не нашёл. И в документации Mapfish print module это не описано.
Экспериментально-интуитивным методом я решил эту задачу. Я добавил параметр customParams, содержащий параметр cql_filter. Строка значения этого параметра содержит два фильтра (по одному на каждый слой), разделённые точкой с запятой. Первый слой фильтруется по пересечению с объектом второго слоя, имеющим определённое значение атрибута. Второй слой фильтруется по этому же значению атрибута. Новый запрос выглядит так:
http://tomcat:8080/geoserver/pdf/print.pdf?spec={
    "units":"m",
    "srs":"EPSG:60000",
    "layout":"A4 landscape",
    "dpi":100,
    "header":"2 rayon",
    "footer":"",
    "layers": [{
        "baseURL":"http://tomcat:8080/geoserver/wms",
        "opacity":1,
        "customParams": {
            "cql_filter":"INTERSECTS(geom,querySingle('net_rayon','geom','name=2'));name=2"
        },
        "singleTile":true,
        "type":"WMS",
        "layers":["egko","net_rayon"],
        "format":"image/png",
        "styles":["",""]
    }],
    "pages":[{"bbox":[1009,4821,7336,12355]}]
}
В результате возвращается PDF с отфильтрованными объектами:
Протяжённые объекты (реки, дороги) выходят далеко за пределы выбранного полигона. Такие крупные объекты можно преобразовать в несколько меньших, разделив их по границам полигонов слоя net_rayon. В настоящем примере использована функция querySingle, входящая в плагин querylayer-2.1.0.jar.