PostGIS+Mapserver: не могу соединить точки ST_MakeLine

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
Koba
Новоприбывший
Сообщения: 12
Зарегистрирован: 28 ноя 2011, 16:40
Репутация: 0

PostGIS+Mapserver: не могу соединить точки ST_MakeLine

Сообщение Koba » 06 дек 2011, 11:08

Подскажите:
Дано: таблица в PostgreSQL, в ней поля gid, id, the_geom (point) ... записей в таблице около 200 000
Задача: вывести два слоя, в одном просто точки, во втором соединить точки в линию

Первый слой для вывода точек прекрасно работает вот он:

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

LAYER
    NAME "veget"

    CONNECTIONTYPE postgis
    CONNECTION "user=postgres password= dbname=postgres  host=localhost"
    PROCESSING "CLOSE_CONNECTION=DEFER"

    DATA 'the_geom  FROM ( SELECT the_geom, speed, gid, satelites FROM track) AS geom using unique gid using srid=4326'
    FILTER "satelites>3"
    STATUS ON
    
    TYPE POINT 


    CLASS
      NAME "Bad"
      EXPRESSION ([speed]>32)
      STYLE
       SYMBOL "circlef"
       COLOR 255 0 0 
       SIZE 4
       GAP 1
      END
    END

    PROJECTION
      "proj=latlong"
      "ellps=WGS84"
      "datum=WGS84"
    END

    METADATA
		wms_title "world"
		wms_abstract "world test"
              wms_srs "epsg:4326" 
		wms_include_items "all"
    END

END
А вот второй слой в котором я пытаюсь соединить точки в линию, упорно выводит ошибки в запросе:

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

LAYER
    NAME "veget2"

    CONNECTIONTYPE postgis
    CONNECTION "user=postgres password= dbname=postgres  host=localhost"
    PROCESSING "CLOSE_CONNECTION=DEFER"

    DATA 'ST_MakeLine(the_geom) AS the_geoms, id FROM (SELECT the_geom, id, gid FROM track ) AS the_geoms2 USING UNIQUE gid GROUP BY id;'
    STATUS ON
    
    TYPE LINE


    CLASS
     NAME "Rast"
     STYLE
      SYMBOL "circlef"
      COLOR 50 205 50
      SIZE 4
      GAP 1
     END
    END

    PROJECTION
      "proj=latlong"
      "ellps=WGS84"
      "datum=WGS84"
    END

    METADATA
		wms_title "world"
		wms_abstract "world test"
              wms_srs "epsg:4326" 
		wms_include_items "all"
    END

END 
Ошибка :

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

<?xml version='1.0' encoding="ISO-8859-1" standalone="no" ?>
<!DOCTYPE ServiceExceptionReport SYSTEM "http://schemas.opengis.net/wms/1.1.1/exception_1_1_1.dtd">
<ServiceExceptionReport version="1.1.1">
<ServiceException>
msDrawMap(): Image handling error. Failed to draw layer named 'veget2'.
msPostGISLayerWhichShapes(): Query error. Error (ERROR:  syntax error at or near "AS"
LINE 1: ...ROM track ) the_geoms where ST_MakeLine(the_geom) AS the_geo...
                                                             ^
) executing query: select encode(AsBinary(force_collection(force_2d("ST_MakeLine(the_geom) AS the_geom, id")),'NDR'),'hex') as geom,"gid" from (SELECT the_geom, id, gid FROM track ) the_geoms where ST_MakeLine(the_geom) AS the_geom, id && GeomFromText('POLYGON((31.9921875 49.3823727870096,31.9921875 49.6107099380742,32.34375 49.6107099380742,32.34375 49.3823727870096,31.9921875 49.3823727870096))',find_srid('','track','ST_MakeLine(the_geom) AS the_geom, id'))
</ServiceException>
</ServiceExceptionReport>
Самое интересно, что если выполнить этот запрос в менеджере БД то он что то даже выводит (если только убрать "USING UNIQUE gid" а то на эту запись ругаеться)

Изображение

Koba
Новоприбывший
Сообщения: 12
Зарегистрирован: 28 ноя 2011, 16:40
Репутация: 0

Re: PostGIS+Mapserver: не могу соединить точки ST_MakeLine

Сообщение Koba » 06 дек 2011, 18:46

Попробовал расширенный запрос который возвращается в ошибке и выполнил его в менеджере БД, получил туже самую ошибку ....

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

select encode(AsBinary(force_collection(force_2d("ST_MakeLine(the_geom) AS the_geoma, gid")),'NDR'),'hex') as geom,
"gid" from (SELECT the_geom, id, gid FROM test ORDER BY gid) AS geom where ST_MakeLine(the_geom) AS the_geoma, gid 
&& GeomFromText('POLYGON((31.9921875 49.3823727870096,31.9921875 49.6107099380742,32.34375 49.6107099380742,32.34375 49.3823727870096,31.9921875 49.3823727870096))',4269)
;
ему почему то не нравится код в районе

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

where ST_MakeLine(the_geom) AS the_geoma,
Изображение

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

Re: PostGIS+Mapserver: не могу соединить точки ST_MakeLine

Сообщение Denis Rykov » 12 дек 2011, 04:54

Это как понимать? Что вы хотите сказать этим условием:

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

where ST_MakeLine(the_geom) AS the_geoma
Spatial is now, more than ever, just another column- The Geometry Column.

Koba
Новоприбывший
Сообщения: 12
Зарегистрирован: 28 ноя 2011, 16:40
Репутация: 0

Re: PostGIS+Mapserver: не могу соединить точки ST_MakeLine

Сообщение Koba » 22 дек 2011, 17:57

Спасибо

Причина была в том что отдавать Mapserver нужно простую таблицу, без функций.

В документации к Postgis приведен такой пример:

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

SELECT gps.gps_track, ST_MakeLine(gps.the_geom) As newgeom
	FROM (SELECT gps_track,gps_time, the_geom
			FROM gps_points ORDER BY gps_track, gps_time) As gps
	GROUP BY gps.gps_track
Но такие примеры в связке с Mapserver не работаю и выдают ошибки которые я указал выше.
Все функции должны быть внутри простого запроса, т.е. любой запрос в мапсервер должен иметь минимальный вид:

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

DATA "the_geom FROM ......................... using unique gid using srid=4326"
А уже внутри можно мастерить линни и все что угодно, вот работающий пример с ST_MakeLine:

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

 DATA "the_geom from ( SELECT ST_MakeLine(the_geom) AS the_geom, (select gid from track where track_id=3 order by gid desc limit 1) AS gid FROM (SELECT the_geom, gid FROM track WHERE track_id in (select track_info.track_id from track_info where track_info.user_id=110 and track_info.track_id=3 and track_info.track_salt='23' limit 1) ORDER BY gid desc) AS asd ) AS newtable using unique gid using srid=4326"

Ответить

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

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя