1

私は3つのテーブルを持っています:稲妻電力線マスト

主な分野:

  • lightnings.geo_belief-ヒットの可能性のある楕円。
  • powerlines.geo_path-電力線のパスのジオポリライン。
  • masts.geo_coordinates-マスト配置のジオポイント。

タスク

  1. 電力線の廊下に当たる稲妻のストロークを計算するには(5000メートル-その半径、関数によってジオメトリとして生成されます powerline_corridor()
  2. それぞれの落雷に最も近い電力線のマストに関する情報を取得し、からの距離lightning.geo_ellipseを取得しmasts.geo_coordinatesます。

だから私は稲妻を選択することができます:

SELECT l.*
FROM lightnings l
JOIN ( SELECT geo_path, powerline_corridor(geo_path, 5000::smallint) AS geo_zone 
         FROM powerlines WHERE id=1)
   AS by_pl
   ON ST_Intersects(by_pl.geo_zone, l.geo_belief)

また、私は関数を持っていますnamos_nearest_mast(powerlines.id, lightnings.geo_belief)

CREATE OR REPLACE FUNCTION public.namos_nearest_mast (
  powerline_id integer,
  geo public.geometry
)
RETURNS public.obj_powerline_masts AS
$body$
SELECT *
FROM obj_powerline_masts
WHERE powerline_id=$1
ORDER BY $2 <-> geo_coordinates ASC
LIMIT 1
$body$
LANGUAGE 'sql';

選択するための良い解決策を提案できませんでしたか?

4

1 に答える 1

1

以下は私が自分でやったことのすべてです:

SELECT 
    t.*,
    ROUND(st_distance(namos_transform_meters(m.geo_coordinates), namos_transform_meters(t.geo_belief))) AS dist_m
FROM obj_powerline_masts AS m
JOIN
  (
    SELECT 
    l.*,
    (SELECT id FROM nearest_mast(1, l.geo_belief)) AS mast_id
    FROM lightnings l
    JOIN (SELECT geo_path, powerline_corridor(geo_path, 5000::smallint) AS geo_zone FROM powerlines WHERE id=1) AS by_pl ON ST_Intersects(by_pl.geo_zone, l.geo_belief)
    LIMIT 50 OFFSET 50
  ) AS t
  ON t.mast_id=m.id

しかし、それが最適な解決策であるかどうかはわかりません。たとえば、PHPでは、サブクエリに簡単な方法で影響を与えることができないため、このようなクエリ(ページ付けの操作などを抽象化する)にdataProvidersを適用することはできません。

于 2012-09-13T17:09:35.043 に答える