Создание и использование пользовательских функций в PostGIS
-
- Bot
- Сообщения: 276
- Зарегистрирован: 03 фев 2008, 23:13
- Репутация: 3
Создание и использование пользовательских функций в PostGIS
Обсуждение статьи "Создание и использование пользовательских функций в PostGIS"
http://gis-lab.info/qa/pl-pgsql.html
http://gis-lab.info/qa/pl-pgsql.html
- Komяpa
- Интересующийся
- Сообщения: 16
- Зарегистрирован: 13 сен 2009, 11:24
- Репутация: 0
- Откуда: Minsk
- Контактная информация:
Re: Создание и использование пользовательских функций в Post
Статья неплохая. Парочка подумавшихся замечаний:
1. на второй картинке все точки подписаны, как ret :)
2. на больших объёмах лучше так не злоупотреблять MakeLine / MakeBox2D. В текущей нотации постгису сначала придётся создать две точки, потом для них создавать Box2D.. Проще тогда сразу скормить четыре координаты в ST_MakeEnvelope, или что-то наподобие любимого мапником SetSRID('BOX3D(a b, c d)'::box3d,94326);
3. если для рендеринга валидость коллекций не важна, то ST_Union стоит попробовать поменять на ST_Collect. Зачастую даже ST_Buffer(ST_Collect(...),0) отрабатывает быстрее, чем ST_Union напрямую;
4. Вместо извращённой проверки с кучей ветвлений и ST_X, возможно, стоило использовать встроенный http://www.postgis.org/documentation/ma ... itude.html
Жалко, что временные функции нельзя создавать отдельно для мапниковских стилей внутри самих стилей - из-за этого приходится inline-ить кучу кода :)
1. на второй картинке все точки подписаны, как ret :)
2. на больших объёмах лучше так не злоупотреблять MakeLine / MakeBox2D. В текущей нотации постгису сначала придётся создать две точки, потом для них создавать Box2D.. Проще тогда сразу скормить четыре координаты в ST_MakeEnvelope, или что-то наподобие любимого мапником SetSRID('BOX3D(a b, c d)'::box3d,94326);
3. если для рендеринга валидость коллекций не важна, то ST_Union стоит попробовать поменять на ST_Collect. Зачастую даже ST_Buffer(ST_Collect(...),0) отрабатывает быстрее, чем ST_Union напрямую;
4. Вместо извращённой проверки с кучей ветвлений и ST_X, возможно, стоило использовать встроенный http://www.postgis.org/documentation/ma ... itude.html
Жалко, что временные функции нельзя создавать отдельно для мапниковских стилей внутри самих стилей - из-за этого приходится inline-ить кучу кода :)
- Mavka
- Гуру
- Репутация: 9
Re: Создание и использование пользовательских функций в Post
Картинку исправил (в статье sim обновит позже). Функции менять не стал, для примера сойдет.
Я боялся что и так будет будет непонятно и много вопросов. Хотя замечания дельные.
P.S. Не часто вас встретишь на форуме :)
Что значите "inline-ить кучу кода"? (В таком контексте ни разу не встречал.)
Я боялся что и так будет будет непонятно и много вопросов. Хотя замечания дельные.
P.S. Не часто вас встретишь на форуме :)
Что значите "inline-ить кучу кода"? (В таком контексте ни разу не встречал.)
лангольеры под окном жрали время ом-ном-ном
- Komяpa
- Интересующийся
- Сообщения: 16
- Зарегистрирован: 13 сен 2009, 11:24
- Репутация: 0
- Откуда: Minsk
- Контактная информация:
Re: Создание и использование пользовательских функций в Post
В мапнике, к сожалению, нет возможности создать функции перед рендерингом и убить сразу после. Поэтому приходится генерировать десятиэтажные конструкции с повторениями, вместо того, что можно было бы оформить как функции.
Создавать функции в базе заранее не хочу - переносимость стиля пострадает :)
Создавать функции в базе заранее не хочу - переносимость стиля пострадает :)
- Mavka
- Гуру
- Репутация: 9
Re: Создание и использование пользовательских функций в Post
Нужно будет добавить в статью очень хороший пример пользовательских функций - надстройки для работы с геоданными: JASPA - написана на PL/Java; PostGIS использует вызовы из внешней библиотеки, написанной на языке C. Например:
где 'postgis-1.4' - имя файл-библиотеки (в Windows - postgis-1.4.dll), а 'boundary' - экспортируемая функция.
Код: Выделить всё
CREATE OR REPLACE FUNCTION boundary(geometry)
RETURNS geometry AS
'$libdir/postgis-1.4', 'boundary'
LANGUAGE 'c' IMMUTABLE STRICT
COST 1;
ALTER FUNCTION boundary(geometry) OWNER TO postgres;
где 'postgis-1.4' - имя файл-библиотеки (в Windows - postgis-1.4.dll), а 'boundary' - экспортируемая функция.
лангольеры под окном жрали время ом-ном-ном
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей