Проблема при связи MapServer c PostGIS
- arzobispo
- Активный участник
- Сообщения: 230
- Зарегистрирован: 10 сен 2008, 10:28
- Репутация: 3
- Контактная информация:
Проблема при связи MapServer c PostGIS
Доброго времени суток!
Возникла следующая проблема, у меня при связи 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
Возникла следующая проблема, у меня при связи 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
Сам занимаюсь связкой PostGIS+MapServer, поэтому заинтересовался вашей проблемой. Вообщем вот, что получилось:
1. Map-файл:
2. Aттрибутивная БД:
3. Пример строки запроса в браузере:
Очень важное замечание: чтобы не использовать кавычки - при создании БД необходимо называть таблицы и поля в них в нижнем регистре! И еще, чтобы OID автоматически добавлялся в таблицу, необходимо в файле postgresql.conf, расположенном по умолчанию в C:\Program Files\PostgreSQL\8.3\data\ раскоментировать строку #default_with_oids = off и вместо off указать on. Вот собственно и все. Если проблема решена, следует отметить её как решеную.
PS: Если кто-то захочет поэкспериментировать с MapServer+PostGIS на данном примере, то во вложении имеется шейп-файл (надеюсь автор темы будет не против если я поделюсь присланным им шейпом
) и скрипт, загружающий данный шейп в БД postgis, предварительно созданную в СУБД PostgreSQL с использованием PostGIS.
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
Код: Выделить всё
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, 'Леопард');
Код: Выделить всё
http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/mslocal/map/example.map&layer=prostokarta_region&mode=map
PS: Если кто-то захочет поэкспериментировать с MapServer+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
Доброго времени суток! 
Прочел ответ очень внимательно, а также попробовал и возникло много вопросов, первые пока читал ответ, а остальные в процессе испытаний. Итак, собственно вопросы, разделять не буду их на До и После, а разделю на МАР-файл и Атрибутивную БД.
МАР-файл:
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))

Прочел ответ очень внимательно, а также попробовал и возникло много вопросов, первые пока читал ответ, а остальные в процессе испытаний. Итак, собственно вопросы, разделять не буду их на До и После, а разделю на МАР-файл и Атрибутивную БД.
МАР-файл:
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
Итак, по порядку:
Map-файл
1. Этой строки нет в приведенном map-файле потому что я работал только со слоем PostGIS, слои на основе данных шейп-файлов я не рассматривал.
2. В запросе указаны обе таблицы, будь внимательне.
3. new_table - это просто алиас (псевдоним) таблицы, получающейся в результате запроса.
Атрибутивная БД
1. Это одно и то же.
2. Не знаю, что там в pgAdmin, просто создай таблицу приведенным выше SQL-запросом.
3. Да, обе этих таблиц расположены в одной БД postgis.
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
Огромное спасибо участнику форума _DR_ !!! проблема была успешно решана. Всё работает!!! 
Причина была в неправильной кодировке при создании базы потсгис, при создании базы у меня была кодировка UTF8, а везде была win1251, вывод, коллеги, соблюдайте правильность кодировок!

Причина была в неправильной кодировке при создании базы потсгис, при создании базы у меня была кодировка UTF8, а везде была win1251, вывод, коллеги, соблюдайте правильность кодировок!
С Уважением, Антон
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 8 гостей