автоматический расчет площадей полигонов средствами PostGIS

VorSer
Интересующийся
Сообщения: 31
Зарегистрирован: 18 июл 2017, 12:26
Репутация: 0

Re: автоматический расчет площадей полигонов средствами Post

Сообщение VorSer » 21 июл 2017, 20:45

А как создать функцию по определению зоны МСК, использующую признак пересечения центроида с одним из трех полигонов таблицы msk69zones(область, порезанная на зоны по пкк), чтобы функция возвращала srid 98691/98692/98693(определенные в spatial_ref_sys)?

trir
Гуру
Сообщения: 5271
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1013
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: автоматический расчет площадей полигонов средствами Post

Сообщение trir » 22 июл 2017, 08:28

а граница между зонами - не прямая линия?

VorSer
Интересующийся
Сообщения: 31
Зарегистрирован: 18 июл 2017, 12:26
Репутация: 0

Re: автоматический расчет площадей полигонов средствами Post

Сообщение VorSer » 22 июл 2017, 09:03

Нет, вроде как-то так...
Или это просто для упрощения, чтоб в одном районе - одна СК была так принято, а на самом деле там просто трехградусные зоны?
Вложения
msk69.JPG
msk69.JPG (42.73 КБ) 9984 просмотра

trir
Гуру
Сообщения: 5271
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1013
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: автоматический расчет площадей полигонов средствами Post

Сообщение trir » 22 июл 2017, 09:34


VorSer
Интересующийся
Сообщения: 31
Зарегистрирован: 18 июл 2017, 12:26
Репутация: 0

Re: автоматический расчет площадей полигонов средствами Post

Сообщение VorSer » 22 июл 2017, 10:55

Пока создал аналогичную вышеописанной функцию по определению зоны МСК, опирающуюся на значение долготы границы между зонами.

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

-- Function: msk69zone(geometry)
-- DROP FUNCTION msk69zone(geometry);
-- Usage: SELECT ST_Transform(the_geom, msk69zone(ST_Centroid(the_geom)) ) FROM sometable;

CREATE OR REPLACE FUNCTION msk69zone(geometry)
RETURNS integer AS
$BODY$
DECLARE
 geomgeog geometry;
 zone int;
 pref int;

BEGIN
 geomgeog:= ST_Transform($1,4326);
 pref:=98690;
 
 IF (ST_X(geomgeog))<33.983333 THEN
   zone:=1;
 ELSIF (ST_X(geomgeog))<36.983333 THEN
   zone:=2;
 ELSE
   zone:=3;
 END IF;

 RETURN zone+pref;
END;
$BODY$ LANGUAGE 'plpgsql' IMMUTABLE
COST 100;
Заодно сравнил отклонения между площадями имеющихся 528 полигонов в UTM и МСК:
ср = 0,061%
мин = 0,002%
макс = 0,122%
Со значениями карт(планов) пока не сравнивал, но на вид похоже, по крайней мере 3200 га стал 3200 га, а в UTM он 3197 га получался.

ST_Contains не осилил. Насколько понимаю, мне нужно на выводе получить значение поля zone(=srid) из таблицы msk_zones(id,geom,zone), строки для которой соблюдается условие:

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

ST_Contains([геометрия объекта],[геометрия зоны из таблицы msk_zones])=t
Но как в запросе указать геометрию объекта и геометрию зоны из таблицы msk_zones я так и не понял, в примерах все какие-то GeomAsText... а мне то конкретный полигон нужен, который в базе есть.

freeExec
Гуру
Сообщения: 1195
Зарегистрирован: 23 апр 2011, 10:32
Репутация: 205
Откуда: Ульяновск

Re: автоматический расчет площадей полигонов средствами Post

Сообщение freeExec » 22 июл 2017, 17:03

Что-то типа:

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

SELECT zone FROM msk_zones, table_areas WHERE ST_Contains(msk_zones.geom, ST_Centroid(table_areas.geom))

Ответить

Вернуться в «PostGIS/PostgreSQL»

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

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