Class: FilterGenerator

FilterGenerator

Filter XML 生成器

new FilterGenerator()

service/igs/ogc/support/OGCSqlToFilterBuilder.js, line 1114

Members

_TEMPORAL_OP_MAP

生成时态查询(OGC FES 2.0 Scope 第4条,源自 ISO 19108)

FES 2.0 时态谓词与 XML 元素对照:

SQL 关键字 FES 2.0 XML 元素 说明
DURING fes:During 属性时段在指定时段内(最小时态)
EQUALS fes:TEquals 两个时间相等
AFTER fes:After 属性时间在指定时间之后
BEFORE fes:Before 属性时间在指定时间之前
BEGINS fes:Begins 属性时间等于时段开始时间
BEGUNBY fes:BegunBy 属性时段开始时间等于指定时段开始
ENDS fes:Ends 属性时间等于时段结束时间
ENDEDBY fes:EndedBy 属性时段结束时间等于指定时段结束
MEETS fes:Meets 属性时间紧接在指定时间之前
METBY fes:MetBy 属性时间紧接在指定时间之后
OVERLAPS fes:TOverlaps 时段重叠(时间版本,与空间谓词重名)
OVERLAPPEDBY fes:OverlappedBy 时段被重叠

Methods

_looksLikePropertyValue()

service/igs/ogc/support/OGCSqlToFilterBuilder.js, line 1849

判断值是否为属性引用(字母开头,非 ISO 8601 时间格式)

_parseTimeInstantArguments()

service/igs/ogc/support/OGCSqlToFilterBuilder.js, line 1910

解析即时时间参数,填充 gml:TimeInstant 子元素 arg2 格式支持:

  • ISO 8601 时间: 2007-11-30T14:35:00Z
  • 对象字面量: { time: "..." } 或 { timePosition: "..." }

_parseTimePeriodArguments()

service/igs/ogc/support/OGCSqlToFilterBuilder.js, line 1861

解析时段参数,填充 gml:TimePeriod 子元素 arg2 格式支持:

  • ISO 8601 区间: 2007-11-30T14:35:00Z/2007-11-30T15:35:00Z
  • 对象字面量: { begin: "...", end: "..." }
  • "begin,end" 字符串

createDocument()

service/igs/ogc/support/OGCSqlToFilterBuilder.js, line 1125

创建 Document

createFilterElement()

service/igs/ogc/support/OGCSqlToFilterBuilder.js, line 1136

创建 Filter 命名空间的元素(带前缀)

createGMLElement()

service/igs/ogc/support/OGCSqlToFilterBuilder.js, line 1144

创建 GML 命名空间的元素(带 gml: 前缀)

formatValue()

service/igs/ogc/support/OGCSqlToFilterBuilder.js, line 1926

格式化值(不进行 XML 转义,由 serializeNode 统一处理)

generate()

service/igs/ogc/support/OGCSqlToFilterBuilder.js, line 1152

生成 AST 对应的 Filter XML

generateAnd()

service/igs/ogc/support/OGCSqlToFilterBuilder.js, line 1398

生成 AND

generateBetween()

service/igs/ogc/support/OGCSqlToFilterBuilder.js, line 1475

生成 BETWEEN

generateComparison()

service/igs/ogc/support/OGCSqlToFilterBuilder.js, line 1427

生成比较

generateFunction()

service/igs/ogc/support/OGCSqlToFilterBuilder.js, line 1215

生成 OGC Function 元素 OGC Filter 2.0 语法: <fes:Function name="area"> fes:ValueReferenceshape</fes:ValueReference> </fes:Function>

generateFunctionArg()

service/igs/ogc/support/OGCSqlToFilterBuilder.js, line 1231

生成函数参数

generateFunctionBetween()

service/igs/ogc/support/OGCSqlToFilterBuilder.js, line 1314

生成函数 BETWEEN 表达式 语法: func(args) BETWEEN low AND high 例如: area(shape) BETWEEN 1000 AND 50000

generateFunctionComparison()

service/igs/ogc/support/OGCSqlToFilterBuilder.js, line 1267

生成函数比较表达式 语法: func(args) > value 或 func1(arg) = func2(arg) 例如: area(shape) > 10000 或 strToLowerCase(name) = strToLowerCase('BEIJING')

generateFunctionIn()

service/igs/ogc/support/OGCSqlToFilterBuilder.js, line 1345

生成函数 IN 表达式 语法: func(args) IN (val1, val2, ...) 例如: strToLowerCase(type) IN ('residential', 'commercial', 'industrial')

多值展开为 Or + PropertyIsEqualTo 结构

generateFunctionLike()

service/igs/ogc/support/OGCSqlToFilterBuilder.js, line 1374

生成函数 LIKE 表达式 语法: func(args) LIKE 'pattern'

generateIn()

service/igs/ogc/support/OGCSqlToFilterBuilder.js, line 1516

生成 IN (多值比较)

根据 OGC FES 2.0 规范:

  • PropertyIsEqualTo 的 BinaryComparisonOpType 要求恰好 2 个 fes:expression 子元素
  • 多值展开为 Or + PropertyIsEqualTo 结构,每个 PropertyIsEqualTo 恰好 2 个子元素

SQL: name IN ('a', 'b') 生成: namea nameb

generateLike()

service/igs/ogc/support/OGCSqlToFilterBuilder.js, line 1549

生成 LIKE

generateNode()

service/igs/ogc/support/OGCSqlToFilterBuilder.js, line 1169

生成节点

generateNot()

service/igs/ogc/support/OGCSqlToFilterBuilder.js, line 1418

生成 NOT

generateNotIn()

service/igs/ogc/support/OGCSqlToFilterBuilder.js, line 1624

生成 NOT IN 表达式

SQL: type NOT IN ('a', 'b') 转换为: NOT (type = 'a' OR type = 'b') 生成: fes:Not fes:Or fes:PropertyIsEqualTo fes:ValueReferencetype</fes:ValueReference> fes:Literala</fes:Literal> </fes:PropertyIsEqualTo> fes:PropertyIsEqualTo fes:ValueReferencetype</fes:ValueReference> fes:Literalb</fes:Literal> </fes:PropertyIsEqualTo> </fes:Or> </fes:Not>

generateNull()

service/igs/ogc/support/OGCSqlToFilterBuilder.js, line 1587

生成 NULL (IS NULL / IS NOT NULL)

根据 OGC FES 2.0 规范 (09-026r2, section 7.7.3.5):

  • PropertyIsNull 的 fes:PropertyIsNullType 仅允许 1 个 fes:expression 子元素
  • IS NOT NULL 应使用 fes:Not 包装 fes:PropertyIsNull,而非 PropertyIsNotEqualTo + 空 Literal

正确结构: IS NULL → fes:PropertyIsNullfes:ValueReferencename</fes:ValueReference></fes:PropertyIsNull> IS NOT NULL → fes:Notfes:PropertyIsNullfes:ValueReferencename</fes:ValueReference></fes:PropertyIsNull></fes:Not>

generateOr()

service/igs/ogc/support/OGCSqlToFilterBuilder.js, line 1408

生成 OR

generateSpatial()

service/igs/ogc/support/OGCSqlToFilterBuilder.js, line 1674

生成空间查询

根据 OGC FES 2.0 规范:

  • BinarySpatialOpType (Intersects/Within/Contains 等): choice 中 2 个表达式
  • BBOXType: choice 中 expression + any (gml:Envelope)
  • DistanceBufferType (DWithin): expression + any, distance 属性 required

修复点:

  1. DWithin 必须设置 distance 属性(xsd:double, required)
  2. 几何节点使用 GML 命名空间(如 gml:Point, gml:Envelope),而非 filter 命名空间
  3. BBOX 使用 gml:Envelope 而非自定义 Geometry 元素