123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338 |
- options {
- STATIC = false; // 成员与方法不生成为静态
- UNICODE_INPUT = true; // 支持中文解析
- JDK_VERSION = "1.8"; // JDK版本为1.8
- IGNORE_CASE = true; // 不区分大小写
- }
- PARSER_BEGIN(SGisWktParser)
- package com.persagy.gis.parser;
- import com.persagy.gis.entity.*;
- import com.persagy.gis.enums.SGisGeometryType;
- import java.util.*;
- /**
- * wkt 格式语法解析器
- *
- * @author 张维新 <zhangweixin@sagacloud.cn>
- */
- public class SGisWktParser {
- public SAbstractGisGeometry parser() throws ParseException {
- return passerGeometry();
- }
- }
- PARSER_END(SGisWktParser)
- SKIP: { <[" ", "\t", "\r", "\n"]> }
- TOKEN: /* 符号 */
- {
- < LPAREN : "(" >
- | < RPAREN : ")" >
- | < COMMA : "," >
- }
- TOKEN: /* 关键字 */
- {
- < POINT : "POINT" >
- | < MULTIPOINT : "MULTIPOINT" >
- | < LINESTRING : "LINESTRING" >
- | < MULTILINESTRING : "MULTILINESTRING" >
- | < POLYGON : "POLYGON" >
- | < MULTIPOLYGON : "MULTIPOLYGON" >
- }
- TOKEN: /* 标识符 */
- {
- < NUM : ("+"|"-")?(["1"-"9"](<DIGIT>)*("."(<DIGIT>)+)?)|"0" >
- | < #DIGIT : ["0"-"9"] >
- }
- /** 解析几何对象 */
- SAbstractGisGeometry passerGeometry():
- {
- SAbstractGisGeometry geometry;
- }
- {
- (
- <POINT> "Z"?
- {
- geometry = passerPointArgs();
- }
- | <MULTIPOINT> "Z"?
- {
- geometry = passerMultiPointArgs();
- }
- | <LINESTRING> "Z"?
- {
- geometry = passerLineStringArgs();
- }
- | <MULTILINESTRING> "Z"?
- {
- geometry = passerMultiLineStringArgs();
- }
- | <POLYGON> "Z"?
- {
- geometry = passerPolygonArgs();
- }
- | <MULTIPOLYGON> "Z"?
- {
- geometry = passerMultiPolygonArgs();
- }
- )
- {
- return geometry;
- }
- }
- /** 解析 Point 参数 */
- SGisPoint passerPointArgs():
- {
- SGisPoint point;
- SGisPosition pos;
- }
- {
- {
- point = new SGisPoint();
- }
- <LPAREN>
- (
- pos = passerPosition()
- {
- point.setCoordinates(pos);
- }
- )?
- <RPAREN>
- {
- return point;
- }
- }
- /** 解析 MultiPoint 参数 */
- SGisMultiPoint passerMultiPointArgs():
- {
- SGisMultiPoint multiPoint;
- ArrayList<SGisPosition> posArr;
- }
- {
- {
- multiPoint = new SGisMultiPoint();
- }
- <LPAREN>
- (
- posArr = passerPositionArray()
- {
- multiPoint.setCoordinates(posArr);
- }
- )?
- <RPAREN>
- {
- return multiPoint;
- }
- }
- /** 解析 LineString 参数 */
- SGisLineString passerLineStringArgs():
- {
- SGisLineString line;
- ArrayList<SGisPosition> posArr;
- }
- {
- {
- line = new SGisLineString();
- }
- <LPAREN>
- (
- posArr = passerPositionArray()
- {
- line.setCoordinates(posArr);
- }
- )?
- <RPAREN>
- {
- return line;
- }
- }
- /** 解析 MultiLineString 参数 */
- SGisMultiLineString passerMultiLineStringArgs():
- {
- SGisMultiLineString multiLine;
- ArrayList<ArrayList<SGisPosition>> posArr2;
- }
- {
- {
- multiLine = new SGisMultiLineString();
- }
- <LPAREN>
- (
- posArr2 = passerPositionArray2()
- {
- multiLine.setCoordinates(posArr2);
- }
- )?
- <RPAREN>
- {
- return multiLine;
- }
- }
- /** 解析 Polygon 参数 */
- SGisPolygon passerPolygonArgs():
- {
- SGisPolygon polygon;
- ArrayList<ArrayList<SGisPosition>> posArr2;
- }
- {
- {
- polygon = new SGisPolygon();
- }
- <LPAREN>
- (
- posArr2 = passerPositionArray2()
- {
- polygon.setCoordinates(posArr2);
- }
- )?
- <RPAREN>
- {
- return polygon;
- }
- }
- /** 解析 MultiPolygon 参数 */
- SGisMultiPolygon passerMultiPolygonArgs():
- {
- SGisMultiPolygon multiPolygon;
- ArrayList<ArrayList<ArrayList<SGisPosition>>> posArr3;
- }
- {
- {
- multiPolygon = new SGisMultiPolygon();
- }
- <LPAREN>
- (
- posArr3 = passerPositionArray3()
- {
- multiPolygon.setCoordinates(posArr3);
- }
- )?
- <RPAREN>
- {
- return multiPolygon;
- }
- }
- /** 解析二维 Position 对象数组 */
- ArrayList<ArrayList<ArrayList<SGisPosition>>> passerPositionArray3():
- {
- ArrayList<ArrayList<SGisPosition>> posArray;
- ArrayList<ArrayList<ArrayList<SGisPosition>>> positionList = new ArrayList<ArrayList<ArrayList<SGisPosition>>>();
- }
- {
- <LPAREN>posArray = passerPositionArray2()<RPAREN>
- {
- positionList.add(posArray);
- }
- (
- <COMMA>
- <LPAREN>posArray = passerPositionArray2()<RPAREN>
- {
- positionList.add(posArray);
- }
- )*
- {
- return positionList;
- }
- }
- /** 解析二维 Position 对象数组 */
- ArrayList<ArrayList<SGisPosition>> passerPositionArray2():
- {
- ArrayList<SGisPosition> posArray;
- ArrayList<ArrayList<SGisPosition>> positionList = new ArrayList<ArrayList<SGisPosition>>();
- }
- {
- <LPAREN>posArray = passerPositionArray()<RPAREN>
- {
- positionList.add(posArray);
- }
- (
- <COMMA>
- <LPAREN>posArray = passerPositionArray()<RPAREN>
- {
- positionList.add(posArray);
- }
- )*
- {
- return positionList;
- }
- }
- /** 解析 Position 对象数组 */
- ArrayList<SGisPosition> passerPositionArray():
- {
- SGisPosition pos;
- ArrayList<SGisPosition> positionList = new ArrayList<SGisPosition>();
- }
- {
- pos = passerPosition()
- {
- positionList.add(pos);
- }
- (
- <COMMA>
- pos = passerPosition()
- {
- positionList.add(pos);
- }
- )*
- {
- return positionList;
- }
- }
- /** 解析 Position 对象 */
- SGisPosition passerPosition():
- {
- Double pos;
- ArrayList<Double> valList = new ArrayList<Double>();
- }
- {
- pos = parserNum()
- {
- valList.add(pos);
- }
- (
- pos = parserNum()
- {
- valList.add(pos);
- }
- )*
- {
- if (valList.size() >= 3) {
- return new SGisPosition(valList.get(0), valList.get(1), valList.get(2));
- }
- if (valList.size() >= 2) {
- return new SGisPosition(valList.get(0), valList.get(1), 0.0);
- }
- if (valList.size() >= 1) {
- return new SGisPosition(valList.get(0), 0.0, 0.0);
- }
- return new SGisPosition();
- }
- }
- /** 解析数 */
- Double parserNum():
- {
- Token t;
- }
- {
- t = <NUM>
- {
- return Double.parseDouble(t.image);
- }
- }
|