PostGIS: Найти ближайшую точку из списка 3D точек - PullRequest
1 голос
/ 23 января 2020

Используя базу данных PostGIS, я бы хотел отфильтровать из списка точек (сохраненных в виде геометрии в таблице) точку, ближайшую к определенной точке, переданной в запрос.
Я уже пробовал ST_3DClosestPoint , но они всегда говорят о точке на линии.
Как я могу отфильтровать свой список, чтобы определить только трехмерную точку моего облака точек, которая находится ближе всего к данной точке? Есть ли шанс сделать это с PostGIS (версия 2.5)?

Редактировать Структура таблицы и некоторые примеры данных:

CREATE TABLE points_list (id SERIAL PRIMARY KEY, name VARCHAR(64), geom GEOMETRY(POINTZ, 3857));

INSERT INTO points_list (geom) VALUES (ST_TRANSFORM(ST_SetSRID(ST_MakePoint(4571450, 5800300, -246.028076), 31468), 3857));
INSERT INTO points_list (geom) VALUES (ST_TRANSFORM(ST_SetSRID(ST_MakePoint(4571550, 5800300, -246.033478), 31468), 3857));
INSERT INTO points_list (geom) VALUES (ST_TRANSFORM(ST_SetSRID(ST_MakePoint(4571650, 5800300, -246.040100), 31468), 3857));
INSERT INTO points_list (geom) VALUES (ST_TRANSFORM(ST_SetSRID(ST_MakePoint(4571750, 5800300, -246.062714), 31468), 3857));
INSERT INTO points_list (geom) VALUES (ST_TRANSFORM(ST_SetSRID(ST_MakePoint(4571850, 5800300, -246.104797), 31468), 3857));
INSERT INTO points_list (geom) VALUES (ST_TRANSFORM(ST_SetSRID(ST_MakePoint(4571950, 5800300, -246.162323), 31468), 3857));

Затем запрос должен спросить для ближайшей точки, переданной в запросе, например, 4571547, 5800297, -246,0312. Я ожидаю, что запись № 2 из моих примеров значений будет результатом этого запроса.

1 Ответ

2 голосов
/ 23 января 2020

Вы были действительно близко.

Принимая во внимание выборку данных, вы выполняете много преобразований SRS для заполнения таблицы. Таким образом, хранимая SRS также должна соответствовать той, которая используется в запросе.

SELECT id, 
  ST_3DDistance(
    geom,
    ST_Transform(
      ST_SetSRID(
        ST_MakePoint(4571547, 5800297, -246,0312),31468),3857)) AS dist
FROM points_list
ORDER BY dist LIMIT 1;

 id |       dist        
----+-------------------
  2 | 6.936250729464996
(1 Zeile)

enter image description here

Вы можете отказаться от использования ST_Transform, если уже можете предоставить ST_3DDistance с координатами в СГД 3857.

...