|
|
|
PostGIS. ST_Buffer() не работает
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Есть такая задача: взять участок дороги и найти все объекты вдоль него на заданном расстоянии. Для этого беру этот участок оси дороги и транслирую его в обе стороны, создавая таким образом полигон. Полученный полигон загоняю в 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() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2014, 17:22:45 |
|
||
|
|

start [/forum/topic.php?fid=53&fpage=121&tid=1998423]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
60ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
21ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 323ms |

| 0 / 0 |
