powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / PostGIS. ST_Buffer() не работает
1 сообщений из 1, страница 1 из 1
PostGIS. ST_Buffer() не работает
    #38778943
Здравствуйте. Есть такая задача: взять участок дороги и найти все объекты вдоль него на заданном расстоянии. Для этого беру этот участок оси дороги и транслирую его в обе стороны, создавая таким образом полигон. Полученный полигон загоняю в ST_Buffer, чтобы стал еще лучше (без этого выдает ошибки, когда ищу пересечение этого полигона с искомыми объектами). Так вот все работало, но на одной дороге после буферизации полигон из нормального превращается в очень маленький (на карте его не видно, а площадь его стремится к нулю). Что может быть тому причиной? Исходный полигон вроде нормальный.

Вот запрос, если что:

select geoloc into axis from "о_осьа" where data_id = road__id; --ось дороги
set search_path to public;
if l_L1 < ST_M(ST_PointN(axis, 1)) then --l_L1, l_L2 - границы участка
l_L1 := ST_M(ST_PointN(axis, 1));
end if;
if l_L2 > ST_M(ST_PointN(axis, ST_NPoints(axis))) then
l_L2 := ST_M(ST_PointN(axis, ST_NPoints(axis)));
end if;
newGeo := ST_Force_2D(st_mline_substring(axis, l_L1, l_L2));
ortGeo := ST_Transform(newGeo, 3644);
FOR g IN 1..ST_Npoints(ortGeo)-1 LOOP
pt1 := ST_PointN(ortGeo, g);
pt2 := ST_PointN(ortGeo, g+1);
alfa := (pi() / 2.0) - ST_azimuth(pt1, pt2);
dx1 := -d1 * sin(alfa);
dy1 := d1 * cos(alfa);
dx2 := d1 * sin(alfa);
dy2 := -d1 * cos(alfa);
if (g = 2) then
geom1 := ST_MakeLine(newPt1, ST_Transform(ST_Translate(pt1, dx1, dy1), 4326)); --Каждую точку оси переносим в обе стороны под прямым углом к отрезку, из которого она взялась
geom2 := ST_MakeLine(newPt2, ST_Transform(ST_Translate(pt1, dx2, dy2), 4326));
else
newPt1 := ST_Transform(ST_Translate(pt1, dx1, dy1), 4326);
newPt2 := ST_Transform(ST_Translate(pt1, dx2, dy2), 4326);
end if;
if (g > 2) then
geom1 := ST_AddPoint(geom1, newPt1);
geom2 := ST_AddPoint(geom2, newPt2);
end if;
END LOOP;
geom1 := ST_AddPoint(geom1, ST_Transform(ST_Translate(pt2, dx1, dy1), 4326));
geom2 := ST_AddPoint(geom2, ST_Transform(ST_Translate(pt2, dx2, dy2), 4326));
geom2 := ST_Reverse(geom2);
geom1 := ST_AddPoint(geom1,ST_PointN(geom2, 1));
geom2 := ST_AddPoint(geom2,ST_PointN(geom1, 1));
poly := ST_Buffer(ST_Transform(st_makepolygon(st_linemerge(st_collect(geom1,geom2))),4326),0); --искомый полигон

Во вложенной картинке, что получается, если без ST_Buffer()
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / PostGIS. ST_Buffer() не работает
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]