геоточка рядом с MULTILINESTRING

Имея столбец геометрии wkb_geometry, srid 4326, который является MULTILINESTRING, я хотел бы определить, какие из этих записей находятся на заданном расстоянии (скажем, 5000 м) от геометрического объекта POINT

в то время как следующий метод позволяет определить, содержит ли многоугольник точку

def self.containing_latlon(lat,lon, polygon)
  ewkb = EWKB.generate(RGeo::Geographic.simple_mercator_factory.point(lon, lat).projection)
  where("ST_Intersects(polygon, ST_GeomFromEWKB(E'\\\\x#{ewkb}'))")
end

ST_Intersects явно не вариант, так как он применяется к любой части пространства, где они пересекаются.
Я не нашел документации, чтобы определить, находится ли линия в пределах X расстояния от точки. Но, может быть, вопрос перевернут? Если вопрос не будет, это точка внутри полигона, определяемая MULTILINESTRING и буфером.

Как нужно изменить вышеуказанный метод, чтобы выполнить это?


person Jerome    schedule 10.05.2021    source источник


Ответы (1)


Вместо этого используйте ST_DWithin.

Для расстояний, использующих метры, укажите параметры geography, например. 5км:

SELECT * FROM t
WHERE ST_DWithin('POINT(7.00 51.82)'::geography,geom::geography,5000);

Если вас устраивает единица измерения вашего SRS, просто придерживайтесь «геометрической формы».

SELECT * FROM t
WHERE ST_DWithin('POINT(7.00 51.82)'::geometry,geom,42);

:: после литералов WKT — это синтаксис postgres для приведения типов данных. Но как это принято в postgres, есть много способов сделать одно и то же. В следующем примере литерал WKT преобразуется в geometry с использованием различных методов:

SELECT 
  CAST('SRID=4326;POINT(1 2)' AS geometry),
  'SRID=4326;POINT(1 2)'::geometry,
  ST_GeomFromText('SRID=4326;POINT(1 2)'),
  ST_SetSRID(ST_MakePoint(1,2),4326);

-[ RECORD 1 ]---+---------------------------------------------------
geometry        | 0101000020E6100000000000000000F03F0000000000000040
geometry        | 0101000020E6100000000000000000F03F0000000000000040
st_geomfromtext | 0101000020E6100000000000000000F03F0000000000000040
st_setsrid      | 0101000020E6100000000000000000F03F0000000000000040

Дополнительная литература: Получение всех зданий в радиусе 5 миль от указанных координат

person Jim Jones    schedule 10.05.2021
comment
Это ST_DWithin, а не ST_Within. Я отбросил последнее, учитывая условия, но не знал о первом... что требует чуть больше внимания для расшифровки, учитывая использование заглавных букв! Могу я также спросить о синтаксисе двойного двоеточия, поскольку я еще не встречал его в postgis.net/docs? - person Jerome; 10.05.2021
comment
@Jerome the :: - это синтаксис postgres. Это краткая форма для CAST(value AS datatype). Я добавлю несколько примеров в свой ответ. Сработал ли ST_DWithin в вашем случае использования? - person Jim Jones; 10.05.2021
comment
Я верю, что подойдет (нашел документы для этого - обувь подходит); Я составляю план работы, и этот элемент был единственной зияющей дырой. Я попытаюсь в ближайшее время, когда шаги будут приняты. - person Jerome; 10.05.2021
comment
Да, это сработало. Требуется немного повозиться с синтаксисом атрибута: where("ST_DWITHIN('#{class.attribute.as_text}'::geography,wkb_geometry::geography,5000)").all - person Jerome; 11.05.2021