ST_DWithin
используется для выбора геометрии, которая хотя бы частично находится в пределах указанного расстояния от контрольной точки.
Чтобы вычислить фактическую длину (или площадь для полигонов) внутри, вам нужно будет вычислить пересечение.
select highway,
st_length(way) full_length,
st_length(
ST_INTERSECTION(
ST_Transform(way,4326)::geography,
ST_BUFFER(
ST_GeomFromText('POINT(4.1884918 51.144580)',4326)::geography,
100)
)
)
from planet_osm_line
where
ST_DWITHIN(
ST_Transform(way,4326)::geography,
ST_GeomFromText('POINT(4.1884918 51.144580)',4326)::geography,100)
and highway is not null;
Для оптимизации этого запроса вы должны использовать
WITH buff as (
SELECT ST_BUFFER(
ST_GeomFromText('POINT(4.1884918 51.144580)',4326)::geography,
1000) as geog)
select highway,
st_length(way) full_length,
st_length(
ST_INTERSECTION(
ST_Transform(way,4326)::geography,
buff.geog
)
)
from osm.osm_line
INNER JOIN buff
ON ST_DWITHIN(
ST_Transform(way,4326),
buff.geog,
1000)
where highway is not null;
Обратите внимание, что буфер - это только приблизительное значение круга, поэтому результат может быть немного не таким.