很抱歉你的头衔不够光鲜,但很难形容.
假设我有两张桌子(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米以内的多边形。
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:
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预期成果:
cad_pid | jtsdctn_id | ogc_fid | dist_meters | wkb_geometry
0002 | def456 | hz4561 | 192.769 | 43545...
0004 | dsk730 | vt9701 | 342.548 | D484D...如果有一些sql向导可以提供帮助,那就太好了!
发布于 2018-09-18 18:27:49
你可以用一个连接
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;或者最好将连接添加到外部。
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;发布于 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更慢,后者将根据球计算距离)。
考虑到这一点,您的查询可以表示为:
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的使用,以避免对每个已处理行进行转换/转换,并使事情更加结构化。
我就是不能放手..。
https://stackoverflow.com/questions/52392508
复制相似问题