Oracle - извлечение координат из вершин (первая, последняя и все вершины) - PullRequest
0 голосов
/ 12 апреля 2019

Для заданного объекта (линии или области) и для всех его элементов мне нужно извлечь координаты (1) всех вершин, (2) первая вершина и (3) последняя вершина ( 3 отдельных запроса для создания 3 различных наборов результаты )

Я использую пространственный Oracle.

Я протестировал этот sql-код для таблицы ARAMAL (это трехмерная линейная сущность; столбец первичного ключа: IPID; геометрический столбец: GEOMETRY), и он хорошо работает.

  • (1) - Список все вершин

    ВЫБРАТЬ A.IPID, t.X, t.Y, t.Z, t.id ИЗ АРАМАЛЯ A, TABLE (SDO_UTIL.GETVERTICES (A.GEOMETRY)) t ЗАКАЗАТЬ A.IPID, t.id;

Результат (пример для IPID = 1479723):

IPID X Y Z id

1479723 -99340.38408 -102364.3603 10 1

1479723 -99341.21035 -102366.2701 11 2

1479723 -99342.03375 -102368.1783 12 3

1479723 -99342,86238 -102370.0875 13 4

... ... .... ... ...

  • (2) - Список первый вершина

    ВЫБРАТЬ A.IPID, t.X, t.Y, t.Z, t.id ИЗ АРАМАЛЯ A, TABLE (SDO_UTIL.GETVERTICES (A.GEOMETRY)) t, где t.id = 1 ПОРЯДОК A.IPID;

Результат (пример для IPID = 1479723)

IPID X Y Z id

1479723 -99340.38408 -102364.3603 10 1

  • (3) Как мне получить последнюю вершину чисто с помощью sql (без дополнительных функций)?

(Ожидаемый) Результат (пример для IPID = 1479723)

IPID X Y Z id

1479723 -99342,86238 -102370.0875 13 4

Полагаю, этот процесс мог бы выполняться быстрее, если бы я использовал определенные функции - я также хотел бы использовать их.

Я наткнулся на отличный сайт (Саймон Гринер) с некоторыми функциями, которые, я думаю, могли бы сработать

http://spatialdbadvisor.com/oracle_spatial_tips_tricks/322/st_vertexn-extracting-a-specific-point-from-any-geometry

Функции:

ST_StartPoint

CREATE OR REPLACE
FUNCTION ST_StartPoint(p_geom IN mdsys.sdo_geometry)
    RETURN mdsys.sdo_geometry
  IS
  BEGIN
    RETURN ST_PointN(p_geom,1);
  END ST_StartPoint;
/

ST_EndPoint

CREATE OR REPLACE
  FUNCTION ST_EndPoint(p_geom IN mdsys.sdo_geometry)
    RETURN mdsys.sdo_geometry
  IS
  BEGIN
    RETURN ST_PointN(p_geom,-1);
  END ST_EndPoint;
/

Я новичок в этом мире, и я не совсем понимаю синтаксис этих функций ...

  • Для таблицы ARAMAL, которую я использовал ранее, как я должен использовать / применять их, чтобы получить результаты (и в формате), которые мне нужны?

IPID X Y Z id

1479723 -99340.38408 -102364.3603 10 1

....

Заранее спасибо, С наилучшими пожеланиями, Pedro

1 Ответ

0 голосов
/ 12 апреля 2019

Неважно, работаете ли вы с пространственными данными, вас интересует строка, у которой максимум id для заданного ipid, поэтому вы можете запустить ее как здесь:

select * 
  from (
    select a.ipid, t.x, t.y, t.z, t.id,
           max(t.id) over (partition by a.ipid) mx_id
      from aramal a, table(sdo_util.getvertices(a.geometry)) t)
  where id = mx_id;

демо

Есть несколько способов получить последнюю строку, вы можете использовать row_number(), подзапрос, как во многих top-n вопросах на этом сайте.

...