1

我有 3 张桌子:闪电电力线桅杆

主要领域:

  • lightnings.geo_belief- 可能击中的椭圆。
  • powerlines.geo_path- 电力线路径的地理折线。
  • masts.geo_coordinates- 桅杆放置的地理点。

任务

  1. 计算击中电力线走廊的雷击(5000 米 - 其半径,并由函数生成为几何图形 powerline_corridor()
  2. 获取有关电力线桅杆的信息,最接近相应的闪电击中,并获取到的距离lightning.geo_ellipsemasts.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 回答