ST_Buffer в PostGIS дает разные результаты для одного и того же набора строк - PullRequest
0 голосов
/ 27 февраля 2019

У нас есть одна LineString (маршрут на карте), состоящая из нескольких точек (синяя линия), которые мы затем буферизируем для создания области вокруг нее.Мы обнаружили, что все выглядит так, как ожидалось , если только маршрут не пересекает себя , и в этом случае буферная область затем приобретает значительную продольную кривизну.

Пример показывает отличающиеся результаты: http://geojson.io/#id=gist:jgwconsulting/1e2a6e8bad9f018f2c6321016a527bef&map=6/55.621/-3.618

  • Серый: весь маршрут буферизуется как одна строка строк, что приводит к искривлению буферизованной области.
    <code>SELECT ST_AsGeoJSON(
    ST_Buffer(ST_GeomFromGeoJSON('{"type":"LineString","coordinates":[[-14.466666666666667,55.25],[7.233333333333333,54],[0,58.86666666666667],[-11.7,52.06666666666667],[-12.6,56.55]]}')::geography, 9260, 'quad_segs=30 endcap=round join=round')
    );
    
  • Красный / Оранжевый: LineString разбивается на отдельные прямые линии, состоящие из двух точек, каждая из которых затем буферизуется, и результирующие полигоны объединяются с помощью ST_Union.
    <code>SELECT ST_AsGeoJSON(
    ST_Union(
    ARRAY[
    ST_Buffer(ST_GeomFromGeoJSON('{"type":"LineString","coordinates":[[-14.466666666666667,55.25],[7.233333333333333,54]]}')::geography, 9260, 'quad_segs=30 endcap=round join=round')::geometry,
    ST_Buffer(ST_GeomFromGeoJSON('{"type":"LineString","coordinates":[[7.233333333333333,54],[0,58.86666666666667]]}')::geography, 9260, 'quad_segs=30 endcap=round join=round')::geometry,
    ST_Buffer(ST_GeomFromGeoJSON('{"type":"LineString","coordinates":[[0,58.86666666666667],[-11.7,52.06666666666667]]}')::geography, 9260, 'quad_segs=30 endcap=round join=round')::geometry,
    ST_Buffer(ST_GeomFromGeoJSON('{"type":"LineString","coordinates":[[-11.7,52.06666666666667],[-12.6,56.55]]}')::geography, 9260, 'quad_segs=30 endcap=round join=round')::geometry
    ]
    ));
  • Желтый: LineString разбивается на отдельные прямые линии, состоящие из двух точек, каждая из которых затем оборачивается в MultiPolygon с помощью ST_Collect.
    <code>SELECT ST_AsGeoJSON(
    ST_Collect(
    ARRAY[
    ST_Buffer(ST_GeomFromGeoJSON('{"type":"LineString","coordinates":[[-14.466666666666667,55.25],[7.233333333333333,54]]}')::geography, 9260, 'quad_segs=30 endcap=round join=round')::geometry,
    ST_Buffer(ST_GeomFromGeoJSON('{"type":"LineString","coordinates":[[7.233333333333333,54],[0,58.86666666666667]]}')::geography, 9260, 'quad_segs=30 endcap=round join=round')::geometry,
    ST_Buffer(ST_GeomFromGeoJSON('{"type":"LineString","coordinates":[[0,58.86666666666667],[-11.7,52.06666666666667]]}')::geography, 9260, 'quad_segs=30 endcap=round join=round')::geometry,
    ST_Buffer(ST_GeomFromGeoJSON('{"type":"LineString","coordinates":[[-11.7,52.06666666666667],[-12.6,56.55]]}')::geography, 9260, 'quad_segs=30 endcap=round join=round')::geometry
    ]
    ));

Может ли кто-нибудь объяснить различные результаты, которые мы видим, якобы с одним и тем же набором координат и, в частности, почему пересекающаяся линия так существенно меняет буфер?

Это пример создания (другого) маршрута, показывающий, как геометрия буфера значительно изменяется при добавлении линии, которая пересекает другую часть маршрута.

Нажмите на эту ссылку: https://vimeo.com/320203046

1 Ответ

0 голосов
/ 27 февраля 2019

Отличный ответ от очень хорошего человека в ГИС StackExchange:

https://gis.stackexchange.com/questions/313753/st-buffer-in-postgis-produces-different-results-for-the-same-set-of-lines/313772#313772

...