如何查询包含多个多边形的MDSYS.SDO_GEOMETRY对象?
问题描述
我有一个包含2个多边形的MDSYS.SDO_GEOMETRY对象:
MDSYS.SDO_GEOMETRY( 2003, 32723, NULL, MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,1,11,1003,1), MDSYS.SDO_ORDINATE_ARRAY( -47.907596018183,-15.823197195244, -47.90770574636,-15.824928365549, -47.906349238544,-15.82507008862, -47.906743123853,-15.822948594956, -47.907596018183,-15.823197195244, --- end of coordinate 1 -47.910025764977,-15.822772155044, -47.910292291122,-15.827300809061, -47.908579370537,-15.827056272436, -47.908374813318,-15.823197247034, -47.910025764977,-15.822772155044))
执行以下查询时,仅返回第一个多边形:
SELECT cd_geomet, cd_empr, cd_estud, cd_demand, SDO_UTIL.TO_WKTGEOMETRY(ge_geomet) AS ge_geomet, dt_cad FROM "ALG"."TS_ALG_GEOMET" WHERE "CD_DEMAND" = 589;
查询返回结果:
POLYGON ((-47.907596018183 -15.823197195244, -47.90770574636 -15.824928365549, -47.906349238544 -15.82507008862, -47.906743123853 -15.822948594956, -47.907596018183 -15.823197195244))
我尝试了以下查询,结果仍相同:
SELECT cd_geomet, cd_empr, cd_estud, cd_demand, SDO_UTIL.TO_WKTGEOMETRY_VARCHAR(ge_geomet) AS ge_geomet, dt_cad FROM "ALG"."TS_ALG_GEOMET" WHERE "CD_DEMAND" = 589;
执行以下查询得到1个元素、2个环的结果,对应这两个多边形,但无法完整返回它们:
SELECT SDO_UTIL.GETNUMELEM(ge_geomet) AS num_elem, SDO_UTIL.GETNUMRINGS(ge_geomet) AS num_rings FROM ALG.TS_ALG_GEOMET WHERE CD_GLA_GEOMET = 3;
请问如何返回这2个多边形?
解决方法
原因分析
你的SDO_GEOMETRY对象类型代码是2003(单个多边形),但内部包含两个独立的环。Oracle的TO_WKTGEOMETRY会默认仅解析单个多边形,因此只返回第一个环对应的多边形。
方案1:将几何对象转换为多多边形类型(推荐)
如果这两个多边形是独立的,正确的类型应该是多多边形(MULTIPOLYGON),类型代码为2007。可以通过以下语句更新几何对象:
UPDATE "ALG"."TS_ALG_GEOMET" SET ge_geomet = MDSYS.SDO_GEOMETRY( 2007, ge_geomet.SDO_SRID, NULL, ge_geomet.SDO_ELEM_INFO, ge_geomet.SDO_ORDINATES ) WHERE "CD_DEMAND" = 589; COMMIT;
更新后,再执行原来的TO_WKTGEOMETRY查询,会返回完整的MULTIPOLYGON格式,包含两个多边形。
方案2:使用SDO_UTIL.EXTRACT拆分单个多边形
如果不想修改原有几何对象,可以用SDO_UTIL.EXTRACT函数提取每个环对应的多边形:
SELECT cd_geomet, cd_empr, cd_estud, cd_demand, SDO_UTIL.TO_WKTGEOMETRY(SDO_UTIL.EXTRACT(ge_geomet, 1, rownum)) AS single_polygon, dt_cad FROM "ALG"."TS_ALG_GEOMET" WHERE "CD_DEMAND" = 589 CONNECT BY rownum <= SDO_UTIL.GETNUMRINGS(ge_geomet);
这个查询会返回两行结果,每行对应一个独立的多边形。
内容的提问来源于stack exchange,提问作者CORRIDAS DE BOLINHAS DE GUDE
相关产品推荐
相关产品推荐

