Maperver. Линия из отрезков разных цветов

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
onfor
Новоприбывший
Сообщения: 5
Зарегистрирован: 11 ноя 2016, 11:39
Репутация: 1

Maperver. Линия из отрезков разных цветов

Сообщение onfor » 11 ноя 2016, 12:03

Всем доброго дня.

Помогите, пождалуйста, в решении не сложной, как мне кажеться, для специалистов, проблемы.

Есть слой в map-файле, который выводит на карту трек:

Код: Выделить всё

LAYER
  VALIDATION
    "car" "^[0-9]+$"
    "fromd" "^20[0-9]{2}-[0-9]{1,2}-[0-9]{1,2}$"
    "fromt" "^[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}$"
    "tod" "^20[0-9]{2}-[0-9]{1,2}-[0-9]{1,2}$"
    "tot" "^[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}$"
  END
  CONNECTIONTYPE postgis
  NAME "path"
  CONNECTION "user=**** dbname=***** host=******"
  PROCESSING "CLOSE_CONNECTION=DEFER"

  DATA "geom from (select ST_MakeLine(location) as geom, 0 as gid from (select location, gid from gps_points where id_car=%car% and date_p>='%fromd% %fromt%'::date and date_p<='%tod% %tot%'::date order by date_p asc) as track_data) as foo using unique gid using srid=900913"

  STATUS ON
  TYPE LINE
  CLASS
    STYLE
      ANTIALIAS TRUE
      COLOR 80 80 80
      WIDTH 1
    END #STYLE
    STYLE
      #GEOMTRANSFORM "end"
      ANTIALIAS TRUE
      COLOR 50 50 50
      SYMBOL "arrow"
      SIZE 4
      ANGLE AUTO
      #INITIALGAP 1
      #GAP 50
    END # STYLE
  END #CLASS

  METADATA
    wms_title "Track"
    wms_abstract "Map file for track format"
    wms_srs "epsg:900913"
    wms_include_items "all"
    "wms_enable_request" "*"
  END #METADATA
END #LAYER
Выводится трек и в каждой точке есть скорость движения авто. Нужно, чтобы цвет линии до точки зависел от этой скорости - например, если скорость < 60 - зеленый, выше - красный. Грубо говоря, чтоб одна линия состоялда из множества отрезков разных цветов.

Кк это можно реализовать?

Спасибо всем заранее.

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3341
Зарегистрирован: 11 апр 2008, 21:09
Статьи: 33
Проекты: 9
Репутация: 500
Ваше звание: Author
Контактная информация:

Re: Maperver. Линия из отрезков разных цветов

Сообщение Denis Rykov » 14 ноя 2016, 12:15

Если скорость в узлах трека не известна, а известно только время снятия координат (в большинстве случаев треки не содержат в себе непосредственно информацию о скорости), то это можно сделать следующим образом (vid - это [vehicle id] - идентификатор транспортного средства, ts - timestamp, geom - поле с геометрией (точка)):

Код: Выделить всё

MAP
    IMAGETYPE "png"
    SIZE      640 480
    EXTENT    83.6920773610584 51.9811249548305 85.232228066547 53.3810356183646
    NAME      vehicles

    PROJECTION
        "init=epsg:4326"
    END

    OUTPUTFORMAT
        NAME         "png"
        EXTENSION    "png"
        MIMETYPE     "image/png"
        DRIVER        AGG/PNG
        IMAGEMODE     RGBA
        FORMATOPTION "INTERLACE=OFF"
    END

    LAYER
        STATUS          DEFAULT
        CONNECTIONTYPE  postgis 
        NAME            tracks
        CONNECTION     "host=localhost dbname=dbtracks user=track_user password=topsecret"
        DATA           "the_geom from (
                            select vid,
                                   num,
                                   st_makeline(p1, p2) as the_geom,
                                   (st_length(st_makeline(p1, p2)::geography)/1000)/
                                   (extract(epoch from ts2 - ts1)/3600) as speed
                            from (
                                select vid,
                                       row_number() over w as num,
                                       ts as ts1,
                                       geom as p1,
                                       lead(geom) over w as p2,
                                       lead(ts) over w as ts2
                                from trackpoints
                                window w as (partition by vid order by ts)) as query
                                where p2 is not NULL
                        ) as subquery using unique num using srid=4326"
        TYPE           LINE

        CLASS
            EXPRESSION ([speed] < 60)
            STYLE
                COLOR 0 255 0
                WIDTH 5
            END
        END

        CLASS
            EXPRESSION ([speed] > 60)
            STYLE
                COLOR 255 0 0
                WIDTH 5
            END
        END

    END
END
Если же для каждой записи есть ещё и скорость в точке, то аналогично, используя оконную функцию lead, получаем доступ к ней (а не вычисляем, как в примере выше). На моих данных получилось так:

Код: Выделить всё

shp2img -m speed.map -e 85.172 52.509 85.261 52.562 -o speed.png
Вложения
speed.png
speed.png (11.74 КБ) 1405 просмотров
Spatial is now, more than ever, just another column- The Geometry Column.

onfor
Новоприбывший
Сообщения: 5
Зарегистрирован: 11 ноя 2016, 11:39
Репутация: 1

Re: Maperver. Линия из отрезков разных цветов

Сообщение onfor » 16 ноя 2016, 17:40

Спасибо за Ваш ответ!

Методом проб и ошибок пытался свести Ваш и свой слои, но в итоге результат не получил.
Привожу map-файл:

Код: Выделить всё

MAP
    IMAGETYPE "png"
    SIZE      256 256
    NAME      track

    PROJECTION
        "init=epsg:900913"
    END

    OUTPUTFORMAT
        NAME         "png"
        EXTENSION    "png"
        MIMETYPE     "image/png"
        DRIVER        AGG/PNG
        IMAGEMODE     RGBA
        FORMATOPTION "INTERLACE=OFF"
    END



    LAYER
        STATUS          DEFAULT
        CONNECTIONTYPE  postgis
        NAME            path
        VALIDATION
          "car" "^[0-9]+$"
          "fromd" "^20[0-9]{2}-[0-9]{1,2}-[0-9]{1,2}$" 
          "fromt" "^[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}$" 
          "tod" "^20[0-9]{2}-[0-9]{1,2}-[0-9]{1,2}$" 
          "tot" "^[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}$" 
        END
        CONNECTION "user=postgres dbname=mapserver host=localhost"

# Ваш запрос
# Выводит пустоту
        DATA "geom from (
          select 
            st_makeline(p1, p2) as geom, gid, num, speed 
          from 
            ( 
              select 
                gid, row_number() over w as num, date_p as ts1, speed, location as p1, lead(location) over w as p2, lead(date_p) over w as ts2 
              from 
                gps_points 
              where 
                id_car=%car% and date_p>='%fromd% %fromt%'::date and date_p<='%tod% %tot%'::date window w as (partition by gid order by date_p)
           ) as query where p2 is not NULL
        ) as foo using unique gid using srid=900913"

# Мой запрос
# Выводит сплошную линию
#          DATA "geom from (
#              select 
#                ST_MakeLine(location) as geom, 0 as gid 
#              from 
#               (
#                  select 
#                    location, gid 
#                  from 
#                    gps_points 
#                  where 
#                    active = true and id_car=%car% and date_p>='%fromd% %fromt%'::date and date_p<='%tod% %tot%'::date order by date_p asc
#                ) as track_data
#             ) as foo using unique gid using srid=900913"

        #FILTER "foo.id_car = '%car%'"


        TYPE           LINE
  STATUS ON
  TYPE LINE
  CLASS
   STYLE
    ANTIALIAS TRUE
    COLOR 87 51 253
    WIDTH 1
   END #STYLE

  END #CLASS

      METADATA
       wms_title "world"
       wms_abstract "world test"
       wms_srs "epsg:900913"
       wms_include_items "all"
       "wms_enable_request" "*"
      END #METADATA


    END
END
Здесь, как видите, две DATA. В одной запрос по Вашему примеру, с измененными названиями полей, во второй тот запрос, которым был у меня.

По итогу - мой запрос, по прежнему выводит сплошную линию, а Ваш, как ни странно, выводит просто пустоту. Ни ошибок, ничего нет - просто пустота. При этом сам запрос:

Код: Выделить всё

  select 
            st_makeline(p1, p2) as geom, gid, num, speed 
          from 
            ( 
              select 
                gid, row_number() over w as num, date_p as ts1, speed, location as p1, lead(location) over w as p2, lead(date_p) over w as ts2 
              from 
                gps_points 
              where 
                id_car=452 and date_p>='2016-11-01 00:00:00'::date and date_p<='2016-12-01 00:00:00'::date window w as (partition by gid order by date_p)
           ) as query where p2 is not NULL
        
, если его выполнить напрямую в БД - отрабатывает и возвращает множество результатов:
Изображение

Что я делаю не так? В чем может быть проблема?\
Спасибо.

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3341
Зарегистрирован: 11 апр 2008, 21:09
Статьи: 33
Проекты: 9
Репутация: 500
Ваше звание: Author
Контактная информация:

Re: Maperver. Линия из отрезков разных цветов

Сообщение Denis Rykov » 16 ноя 2016, 19:09

Видимо, вы не поняли сути запроса. Судя по всему, вместо:

Код: Выделить всё

partition by gid order by date_p
должно быть :

Код: Выделить всё

partition by id_car order by date_p
Spatial is now, more than ever, just another column- The Geometry Column.

onfor
Новоприбывший
Сообщения: 5
Зарегистрирован: 11 ноя 2016, 11:39
Репутация: 1

Re: Maperver. Линия из отрезков разных цветов

Сообщение onfor » 14 янв 2017, 18:49

Огромное спасибо за Ваш ответ - трек выглядит прекрасно!

Скажите, а можно на треке вывести стрелку - направление движения. Я пробовал вывести LAYER с точками и по разным примерам указать символ стрелки - но нужного результата все равно не добился. Это реально вообще реализовать?

Спасибо.

Ответить

Вернуться в «Веб-картография»