首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Postgresql复合联接(但不一定与GIS相关)

Postgresql复合联接(但不一定与GIS相关)
EN

Stack Overflow用户
提问于 2018-09-18 18:20:17
回答 2查看 103关注 0票数 0

很抱歉你的头衔不够光鲜,但很难形容.

假设我有两张桌子(cad和cad_polygon).

计算机辅助设计与cad_polygon共享一个与另一个(Cad_pid)相关的列.

计算机辅助设计有以下列: cad_pid,jrsdctn_id

但是,cad_polygon有以下列: cad_pid、ogc_fid、wkb_geometry

现在,下面的查询(半天的尝试)从一个长的,lat -ord中选择一个基于程度的包,从这个小得多的多边形子集中,找到它们与给定的长,lat -ord之间的几米距离,然后只显示出质心在长的,lat -ord的500米以内的多边形。

代码语言:javascript
运行
复制
SELECT SUBQUERY.cad_pid, SUBQUERY.ogc_fid, SUBQUERY.dist_meters,
    SUBQUERY.wkb_geometry FROM (
    SELECT cad_pid, ogc_fid,
    CAST(ST_Distance_Sphere(
        ST_Centroid(wkb_geometry),
            ST_GeomFromText(
                'POINT(00.0000 -00.0000)',
            900914)
        ) AS numeric
    ) AS dist_meters, wkb_geometry
    FROM cad_polygon
    WHERE ST_DWithin(
        ST_Centroid(wkb_geometry),
        ST_GeomFromText(
            'POINT(00.0000 -00.0000)',
        900914),
    0.01)
    ORDER BY dist_meters ASC
) AS SUBQUERY
WHERE SUBQUERY.dist_meters < 500;

我想添加到这个列表中,并使用这个查询发出的列表,加入我的另一个表(cad),这样我就可以为每个结果行提供额外的列"jrsdctn_id“.ie:

样本数据如下: cad:

代码语言:javascript
运行
复制
cad_pid | jrsdctn_id
0001    | abc123
0002    | def456
0003    | dhk778
0004    | dsk730


cad_polygon:

cad_pid | ogc_fid | wkb_geometry
0001    | ht0101  | 67686687601010000200063D7987FF15ASD1518541DAW
0002    | hz4561  | 435453457601010000200063D7987FF15ASDFW4GF8DE4
0003    | yv0301  | 2626WD687601010000200063D7987FF15ASD1WE851D4D
0004    | vt9701  | D484DW4D8441D8W1C684V63D7987FF15ASD1D7DW4848D

预期成果:

代码语言:javascript
运行
复制
cad_pid | jtsdctn_id | ogc_fid | dist_meters | wkb_geometry
0002    | def456     | hz4561  | 192.769     | 43545...
0004    | dsk730     | vt9701  | 342.548     | D484D...

如果有一些sql向导可以提供帮助,那就太好了!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-18 18:27:49

你可以用一个连接

代码语言:javascript
运行
复制
    SELECT SUBQUERY.cad_pid, SUBQUERY.ogc_fid, SUBQUERY.dist_meters,
        SUBQUERY.wkb_geometry, SUBQUERY.jrsdctn_id FROM (
        SELECT cad_pid, ogc_fid,
        CAST(ST_Distance_Sphere(
            ST_Centroid(wkb_geometry),
                ST_GeomFromText(
                    'POINT(00.0000 -00.0000)',
                900914)
            ) AS numeric
        ) AS dist_meters, wkb_geometry, cad.jrsdctn_id
        FROM cad_polygon
        INNER JOIN cad on cad.cad_pid = cad_polygon.cad_pid

        WHERE ST_DWithin(
            ST_Centroid(wkb_geometry),
            ST_GeomFromText(
                'POINT(00.0000 -00.0000)',
            900914),
        0.01)
        ORDER BY dist_meters ASC
    ) AS SUBQUERY
    WHERE SUBQUERY.dist_meters < 500;

或者最好将连接添加到外部。

代码语言:javascript
运行
复制
SELECT SUBQUERY.cad_pid
        , SUBQUERY.ogc_fid
        , SUBQUERY.dist_meters,
        SUBQUERY.wkb_geometry, cad.jrsdctn_id 
    FROM (
        SELECT cad_polygon.cad_pid, ogc_fid,
        CAST(ST_Distance_Sphere(
            ST_Centroid(wkb_geometry),
                ST_GeomFromText(
                    'POINT(00.0000 -00.0000)',
                900914)
            ) AS numeric
        ) AS dist_meters
        , wkb_geometry
        FROM cad_polygon
        WHERE ST_DWithin(
            ST_Centroid(wkb_geometry),
            ST_GeomFromText(
                'POINT(00.0000 -00.0000)',
            900914),
        0.01)
        ORDER BY dist_meters ASC
    ) AS SUBQUERY
    INNER JOIN cad on cad.cad_pid = SUBQUERY.cad_pid
    WHERE SUBQUERY.dist_meters < 500;
票数 0
EN

Stack Overflow用户

发布于 2018-09-23 15:56:40

有点晚了,当然,关于JOIN的公认答案是绝对正确的,但这实际上是与地理信息系统相关的,它的意识最终会使事情变得更容易:

您似乎在使用自定义CRS或ogr2ogr (或任何GDAL/OGR函数)没有在PostGIS的spatial_ref_sys表中找到匹配的SRID/投影;但是,使用LonLat的任何PostGIS函数都将始终假定您的坐标在EPSG:4326 (WGS84)中。

如果您的LonLat不完全匹配的那些WGS84,结果将关闭!

现在,PostGIS还有地理类型,它再次假定EPSG:4326坐标,如果与这些函数一起使用,它将隐式使用米作为单位,如果与默认的ST_Distance参数一起使用,将在WGS84球体上计算(比use_spheroid := false更精确,但比use_spheroid := false更慢,后者将根据球计算距离)。

考虑到这一点,您的查询可以表示为:

代码语言:javascript
运行
复制
WITH
  pt AS (
    SELECT ST_Transform(ST_SetSRID(ST_MakePoint(0, 0), 900914), 4326)::geography AS geog
  ),

  ctr AS (
    SELECT *,
           ST_Transform(ST_Centroid(wkt_geometry), 4326)::geography AS geog
    FROM cad_polygon
  )

SELECT ctr.cad_pid,
       cad.jtsdctn_id,
       ctr.ogr_fid,
       ST_Distance(ctr.geog, pt.geog) AS distance_meter,
       ctr.wkt_geometry
FROM ctr
JOIN cad
  ON ctr.cad_pid = cad.cad_pid
WHERE ST_DWithin(ctr.geog, pt.geog, 500)
ORDER BY distance_meter ASC;

请注意CTE的使用,以避免对每个已处理行进行转换/转换,并使事情更加结构化。

我就是不能放手..。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52392508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档