注意:这个问题与PostGIS和Postgresql有关,并且是通过PHP实现的
现在我有了表A:
gid | kstart | kend | ctrl_sec_no | the_geom | 626 | 238 | 239 | 120802 | 123456 | 638 | 249 | 250 | 120802 | 234567 | 4037| 239 | 249 | 120802 | 345678 |
注意:the_geom是一个几何值(类型:LINE),在这种情况下,我将它们随机化以提高可读性
和表B:
gid | ctrl_sec_no | x | the_geom 543 | 120802 | 239 | null 544 | 120802 | 247 | null
[PostGIS描述]这两个表由ctrl_sec_no关联,这意味着来自表A的ctrl_sec_no 120802上的3条连续线,连接到一条线中,并包含来自表B的两个POINT。我们仅知道距离{MAX(kend)-MIN(线路的公里数(kstart)}和它在线路上的公里数(x)。
问题是PostgreSQL的查询是什么。
(a。)从A.kend中选择最高值,从A.kstart中选择最低值-> 250-238 = 12
(b。)从A.kend中选择最大值,然后减去B中的“ x”值-> 250-239 = 11
(c。)从这两个值((b。)/(a。))-> 11/12计算比率
(d。)使用PostGIS:ST_Interpolate-> ST_Interpolate(A.the_geom,11/12)注意:此函数用于与LINE一起找到POINT,另一方面定义POINT所在的位置
(e。)我们将从(d。)获取一个值,并将其用于UPDATE’the_geom’列上的表B,该表最初为NULL。
(f。)对表B中的每一行循环查询。
[PostGIS描述]这组查询的目的是通过计算一些数学运算来确定表B中的the_geom并将输出放入ST_Interpolate函数中,以获取表B中POINT所在位置的the_geom。
感谢Advanced,我知道这是一个安静而复杂的问题。我不介意您是否会使用太多查询。只是为了获得正确的值。
这些是在danihp的帮助下的实际查询(最终)。
with CTE( max_kend) as ( SELECT MAX(A.kend) FROM centerline A ), r_b as ( select B.ctrl_sec_no,B.gid, MAX(CTE.max_kend) - B.km as b FROM land_inventory B cross join CTE group by B.gid,B.ctrl_sec_no,B.km ), r_a as ( SELECT MAX(A.kend) - MIN(A.kstart) as a FROM centerline A ), r_ratio as ( select r_b.gid, r_b.b / r_a.a as my_ratio from r_a cross join r_b ), r_new_int as ( select B.gid,r_ratio.my_ratio,B.ctrl_sec_no,B.km,ST_AsText(ST_Envelope(ST_Collect(ST_line_interpolate_point(A.the_geom, r_ratio.my_ratio )))) as new_int from centerline A, land_inventory B inner join r_ratio on B.gid = r_ratio.gid where A.ctrl_sec_no = B.ctrl_sec_no group by B.ctrl_sec_no,B.gid,r_ratio.my_ratio,B.km order by B.ctrl_sec_no ) UPDATE land_inventory set land_inventory.the_geom = n.new_int from r_new_int n where n.gid = land_inventory.gid and land_inventory.the_geom is NULL;
好了,走吧。
(一种)
SELECT MAX(A.kend) - MIN( A.kstart) as a FROM Table A
(b)
编辑 假设表B的gid为PK …
with CTE( max_kend, min_x) as ( SELECT MAX(A.kend), NULL FROM TableA A ) select B.gid, MAX(CTE.max_kend) - B.min_x as b FROM TableB B cross join CTE
(C)
with CTE( max_kend, min_x) as ( SELECT MAX(A.kend), NULL FROM TableA A ), r_b as ( select B.gid, MAX(CTE.max_kend) - B.min_x as b FROM TableB B cross join CTE ), r_a as ( SELECT MAX(A.kend) - MIN( A.kstart) as a FROM Table A ) select r_b.gid, r_a.a / r_b.b as my_ratio from r_a cross join r_b
(d)
with CTE( max_kend, min_x) as ( SELECT MAX(A.kend), NULL FROM TableA A ), r_b as ( select B.gid, MAX(CTE.max_kend) - B.min_x as b FROM TableB B cross join CTE ), r_a as ( SELECT MAX(A.kend) - MIN( A.kstart) as a FROM Table A ), r_ratio as ( select r_b.gid, r_a.a / r_b.b as my_ratio from r_a cross join r_b ) select ST_Interpolate(A.the_geom, r_ratio.my_ratio ) from TableB B inner join r_ratio on B.gid = r_ratio.gid
(e,f)
with CTE( max_kend, min_x) as ( SELECT MAX(A.kend), NULL FROM TableA A ), r_b as ( select B.gid, MAX(CTE.max_kend) - B.min_x as b FROM TableB B cross join CTE ), r_a as ( SELECT MAX(A.kend) - MIN( A.kstart) as a FROM Table A ), r_ratio as ( select r_b.gid, r_a.a / r_b.b as my_ratio from r_a cross join r_b ), r_new_int as ( select ST_Interpolate(A.the_geom, r_ratio.my_ratio ) as new_int from TableB B inner join r_ratio on B.gid = r_ratio.gid ) UPDATE tableB set tableB.the_geom = n.new_int from r_new_int n where n.gid = tableB.gid and tableB.the_geom is NULL
免责声明,不是睾丸。
已编辑
with CTE( max_kend) as ( SELECT MAX(A.kend) FROM centerline A ), r_b as ( select B.ctrl_sec_no,B.gid, MAX(CTE.max_kend) - B.km as b FROM land_inventory B cross join CTE group by B.gid,B.ctrl_sec_no,B.km ), r_a as ( SELECT MAX(A.kend) - MIN(A.kstart) as a FROM centerline A ), r_ratio as ( select r_b.gid, r_b.b / r_a.a as my_ratio from r_a cross join r_b ), r_new_int as ( select B.gid, r_ratio.my_ratio, B.ctrl_sec_no,B.km, ST_AsText(ST_Envelope(ST_Collect( ST_line_interpolate_point(A.the_geom, r_ratio.my_ratio )))) as new_int from centerline A inner join land_inventory B on A.ctrl_sec_no = B.ctrl_sec_no inner join r_ratio on B.gid = r_ratio.gid group by B.ctrl_sec_no,B.gid,r_ratio.my_ratio,B.km order by B.ctrl_sec_no ) UPDATE land_inventory set the_geom = n.new_int from r_new_int n where n.gid = land_inventory.gid and land_inventory.the_geom is NULL;