正则表达式将GIS WKT从3D转换为2D

时间:2017-10-12 20:44:06

标签: regex gis wkt

有人可以告诉我正则表达式转换这种格式:

'LINESTRING ZM ( 574084.51000000 4229857.57000000 0.00000000 0.00000000, 574095.03000000 4229848.23500000 0.00000000 0.00870000)'

到这个

'LINESTRING ZM ( 574084.51000000 4229857.57000000, 574095.03000000 4229848.23500000)'

每个逗号之间只应保留前两个数字。这4个坐标集可能有任意数量。

我尝试了以下(通过oracle sql REGEXP_REPLACE函数),但没有得到预期的结果(详见上文)

select REGEXP_REPLACE( 
  'LINESTRING ZM ( 574084.51000000 4229857.57000000 0.00000000 0.00000000, 574095.03000000 4229848.23500000 0.00000000 0.00870000)',
  '(LINESTRING ZM )((([:digit:]+\.[:digit:]+ ){2})([:digit:]+\.[:digit:]+ ){2}(([:digit:]+\.[:digit:]+ ){2})([:digit:]+\.[:digit:]+ ){2})',
  '\1(\2, \5)'
 ) regex_output from dual;

1 个答案:

答案 0 :(得分:1)

http://www.sqlfiddle.com/#!4/cb0077/7

REGEXP_REPLACE(value, 
  '(( [0-9]+\.[0-9]{8}){2})( [0-9]+\.[0-9]{8}){2}',
  '\1'
)

根据我对使用[:digit:]的某些文档的初步发现,此答案的以下部分是错误的,切换到[0-9]已解决此问题。所有这一切都是为了解决我的懒惰并为此提供了一个功能测试平台。

似乎您第一次提出这个问题时,它最终被删除了。

这是我的回答(正确的格式和一些调整,而我正在花时间重新回答你删除并转发的问题):

(LINESTRING ZM )\((( [:digit:]+\.[:digit:]{8}){2})( [:digit:]+\.[:digit:]{8}){2},(( [:digit:]+\.[:digit:]{8}){2})( [:digit:]+\.[:digit:]{8}){2}\)

并替换为

\1(\2,\5)

编辑:如果有任意数量的这些点需要修剪,你可以匹配一个模式,如

( [:digit:]+\.[:digit:]{8}){2})( [:digit:]+\.[:digit:]{8}){2}

并替换为

\1