Проблема при связи MapServer c PostGIS

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
Аватара пользователя
arzobispo
Активный участник
Сообщения: 230
Зарегистрирован: 10 сен 2008, 10:28
Репутация: 3
Контактная информация:

Проблема при связи MapServer c PostGIS

Сообщение arzobispo » 28 окт 2008, 07:24

Доброго времени суток!
Возникла следующая проблема, у меня при связи MapServer c PostGIS появляется странная ошибка, не могу понять почему. Ошибка вот такая: loadLayer(): Unknown identifier. Parsing error near (prostokarta_region-a):(line 62) . Строку 62 отмечу в коде для наглядности, на самом деле там нет цифры.
Код следующий:

LAYER
CONNECTIONTYPE postgis
NAME "Animals"
CONNECTION "user=postgres password=1234 dbname=postgis host=localhost"
--!62! DATA "the_geom from (SELECT public."prostokarta_region-a".id FROM public."Animals" INNER JOIN

public."prostokarta_region-a" ON (public."Animals".id = public."prostokarta_region-a".id) WHERE

public."Animals"."Color" = 'Белый') as foo using unique gid using SRID=4326"

STATUS ON
TYPE POLYGON
CLASS
COLOR 200 0 0
END
END
Последний раз редактировалось arzobispo 02 ноя 2008, 20:47, всего редактировалось 1 раз.
С Уважением, Антон

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

Re: Проблема при связи MapServer c PostGIS

Сообщение Denis Rykov » 31 окт 2008, 09:29

Сам занимаюсь связкой PostGIS+MapServer, поэтому заинтересовался вашей проблемой. Вообщем вот, что получилось:

1. Map-файл:

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

MAP
 IMAGETYPE GIF
 EXTENT -1.782351 0.244013 -0.618259 1.314817
 SIZE 400 300
LAYER
 NAME "prostokarta_region"
 CONNECTIONTYPE postgis
 CONNECTION "user=postgres password=**** dbname=postgis host=localhost"
 DATA "the_geom FROM (
				SELECT prostokarta_region.the_geom AS the_geom,
				prostokarta_region.oid AS oid
				from prostokarta_region, animals
				where (animals.id = prostokarta_region.id) and (animals.color='Белый')
				)
				AS new_table USING SRID=4326"
 STATUS ON
 TYPE POLYGON
 CLASS
   COLOR 200 120 123
 END
END
END
2. Aттрибутивная БД:

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

CREATE TABLE public.animals (
 id VARCHAR(10),
 color TEXT,
 weight REAL,
 name TEXT
) WITH OIDS;

INSERT INTO public.animals (id, Color, weight, name)
VALUES ('1', 'Черный', 15.5, 'Волк');

INSERT INTO public.animals (id, Color, weight, name)
VALUES ('15', 'Рыжий', 10.3, 'Лиса');

INSERT INTO public.animals (id, Color, weight, name)
VALUES ('32', 'Белый', 2.6, 'Заяц');

INSERT INTO public.animals (id, Color, weight, name)
VALUES ('17', 'Серый', 0.1, 'Мышка');

INSERT INTO public.animals (id, Color, weight, name)
VALUES ('30', 'Белый', 14.2, 'Волк');

INSERT INTO public.animals (id, Color, weight, name)
VALUES ('11', 'Желтый', 39, 'Леопард');
3. Пример строки запроса в браузере:

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

http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/mslocal/map/example.map&layer=prostokarta_region&mode=map
Очень важное замечание: чтобы не использовать кавычки - при создании БД необходимо называть таблицы и поля в них в нижнем регистре! И еще, чтобы OID автоматически добавлялся в таблицу, необходимо в файле postgresql.conf, расположенном по умолчанию в C:\Program Files\PostgreSQL\8.3\data\ раскоментировать строку #default_with_oids = off и вместо off указать on. Вот собственно и все. Если проблема решена, следует отметить её как решеную.

PS: Если кто-то захочет поэкспериментировать с MapServer+PostGIS на данном примере, то во вложении имеется шейп-файл (надеюсь автор темы будет не против если я поделюсь присланным им шейпом :wink: ) и скрипт, загружающий данный шейп в БД postgis, предварительно созданную в СУБД PostgreSQL с использованием PostGIS.
Вложения
prosto-karta.rar
(2 КБ) 1744 скачивания
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
arzobispo
Активный участник
Сообщения: 230
Зарегистрирован: 10 сен 2008, 10:28
Репутация: 3
Контактная информация:

Re: Проблема при связи MapServer c PostGIS

Сообщение arzobispo » 01 ноя 2008, 11:45

Доброго времени суток! :)
Прочел ответ очень внимательно, а также попробовал и возникло много вопросов, первые пока читал ответ, а остальные в процессе испытаний. Итак, собственно вопросы, разделять не буду их на До и После, а разделю на МАР-файл и Атрибутивную БД.

МАР-файл:
1. Почему в приведенном мар-файле нет следующих строк:
SHAPEPATH "/MS4W/APPS/MSLOCAL/MAP/SHP/" - сюда же должен MapSever ссылаться и брать шейп-файл для первоначальной отрисовки карты до выполнения SQL запроса.

2. Почему в слое, оносящемуся к SQL запросу имя указывается не таблицы со зверьками (animals), а prostokarta_region?

3. Почему в SQL запросе после, приведу последнюю часть запроса, чтобы было лучше понимать о чем идет речь, ='Белый')) AS new_table USING SRID 4326" указано, что новая_таблица (new_table)?

Атрибутивная БД:
1. Имя таблицы public.animals или просто имя animals?

2. Столбец id почему он описан varchar? В pgAdmin III сегодня пытался создать такой столбец и не нашел varchar, там есть просто char.

3. Для лучшего понимания, надо соотнести нам места расположения таблиц prostokarta_region и animals, у меня когда захожу в pgAdmin, то там выбираю Базы данных, потом активирую postgis, затем захожу в таблицы и там у меня находятся выше указанные таблицы. Правильно ли они находятся?

Итог, у меня не работает и MapServer выдает вот такую длинную ошибку (при использовании мар-файла, приведенного в ответе на форуме:

msDrawMap(): Image handling error. Failed to draw layer named 'prostokarta_region'. prepare_database(): Query error. Error executing POSTGIS DECLARE (the actual query) statement: 'DECLARE mycursor BINARY CURSOR FOR SELECT asbinary(force_collection(force_2d(the_geom)),'NDR'),OID::text from ( SELECT prostokarta_region.the_geom AS the_geom, prostokarta_region.oid AS oid from prostokarta_region, animals where (animals.id = prostokarta_region.id) and (animals.color='Белый') ) AS new_table WHERE the_geom && setSRID('BOX3D(-1.91477121404682 0.244013,-0.485838785953177 1.314817)'::BOX3D, 4326 )' Postgresql reports the error as 'ERROR: неверная последовательность байт РёРјСЏ РєРѕРґРёСЂРѕРІРєРё "UTF8": 0xc1e5 HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding". ' More Help: Error with POSTGIS data variable. You specified 'check your .map file'. Standard ways of specifiying are : (1) 'geometry_column from geometry_table' (2) 'geometry_column from (sub query) as foo using unique column name using SRID=srid#' Make sure you put in the 'using unique column name' and 'using SRID=#' clauses in. For more help, please see http://postgis.refractions.net/documentation/ Mappostgis.c - version of Jan 23/2004. msPOSTGISLayerRetrievePGVersion(): Query error. Error executing POSTGIS statement (msPOSTGISLayerRetrievePGVersion():select substring(version() from 12 for (position('on' in version()) - 13))
Последний раз редактировалось arzobispo 02 ноя 2008, 20:47, всего редактировалось 1 раз.
С Уважением, Антон

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

Re: Проблема при связи MapServer c PostGIS

Сообщение Denis Rykov » 01 ноя 2008, 12:30

Итак, по порядку:

Map-файл

1. Этой строки нет в приведенном map-файле потому что я работал только со слоем PostGIS, слои на основе данных шейп-файлов я не рассматривал.

2. В запросе указаны обе таблицы, будь внимательне.

3. new_table - это просто алиас (псевдоним) таблицы, получающейся в результате запроса.

Атрибутивная БД

1. Это одно и то же.

2. Не знаю, что там в pgAdmin, просто создай таблицу приведенным выше SQL-запросом.

3. Да, обе этих таблиц расположены в одной БД postgis.
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
arzobispo
Активный участник
Сообщения: 230
Зарегистрирован: 10 сен 2008, 10:28
Репутация: 3
Контактная информация:

Re: Проблема при связи MapServer c PostGIS

Сообщение arzobispo » 02 ноя 2008, 20:49

Огромное спасибо участнику форума _DR_ !!! проблема была успешно решана. Всё работает!!! :)
Причина была в неправильной кодировке при создании базы потсгис, при создании базы у меня была кодировка UTF8, а везде была win1251, вывод, коллеги, соблюдайте правильность кодировок!
С Уважением, Антон

Ответить

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

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

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