SGisWktParser.jj 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. options {
  2. STATIC = false; // 成员与方法不生成为静态
  3. UNICODE_INPUT = true; // 支持中文解析
  4. JDK_VERSION = "1.8"; // JDK版本为1.8
  5. IGNORE_CASE = true; // 不区分大小写
  6. }
  7. PARSER_BEGIN(SGisWktParser)
  8. package com.persagy.gis.parser;
  9. import com.persagy.gis.entity.*;
  10. import com.persagy.gis.enums.SGisGeometryType;
  11. import java.util.*;
  12. /**
  13. * wkt 格式语法解析器
  14. *
  15. * @author 张维新 <zhangweixin@sagacloud.cn>
  16. */
  17. public class SGisWktParser {
  18. public SAbstractGisGeometry parser() throws ParseException {
  19. return passerGeometry();
  20. }
  21. }
  22. PARSER_END(SGisWktParser)
  23. SKIP: { <[" ", "\t", "\r", "\n"]> }
  24. TOKEN: /* 符号 */
  25. {
  26. < LPAREN : "(" >
  27. | < RPAREN : ")" >
  28. | < COMMA : "," >
  29. }
  30. TOKEN: /* 关键字 */
  31. {
  32. < POINT : "POINT" >
  33. | < MULTIPOINT : "MULTIPOINT" >
  34. | < LINESTRING : "LINESTRING" >
  35. | < MULTILINESTRING : "MULTILINESTRING" >
  36. | < POLYGON : "POLYGON" >
  37. | < MULTIPOLYGON : "MULTIPOLYGON" >
  38. }
  39. TOKEN: /* 标识符 */
  40. {
  41. < NUM : ("+"|"-")?(["1"-"9"](<DIGIT>)*("."(<DIGIT>)+)?)|"0" >
  42. | < #DIGIT : ["0"-"9"] >
  43. }
  44. /** 解析几何对象 */
  45. SAbstractGisGeometry passerGeometry():
  46. {
  47. SAbstractGisGeometry geometry;
  48. }
  49. {
  50. (
  51. <POINT> "Z"?
  52. {
  53. geometry = passerPointArgs();
  54. }
  55. | <MULTIPOINT> "Z"?
  56. {
  57. geometry = passerMultiPointArgs();
  58. }
  59. | <LINESTRING> "Z"?
  60. {
  61. geometry = passerLineStringArgs();
  62. }
  63. | <MULTILINESTRING> "Z"?
  64. {
  65. geometry = passerMultiLineStringArgs();
  66. }
  67. | <POLYGON> "Z"?
  68. {
  69. geometry = passerPolygonArgs();
  70. }
  71. | <MULTIPOLYGON> "Z"?
  72. {
  73. geometry = passerMultiPolygonArgs();
  74. }
  75. )
  76. {
  77. return geometry;
  78. }
  79. }
  80. /** 解析 Point 参数 */
  81. SGisPoint passerPointArgs():
  82. {
  83. SGisPoint point;
  84. SGisPosition pos;
  85. }
  86. {
  87. {
  88. point = new SGisPoint();
  89. }
  90. <LPAREN>
  91. (
  92. pos = passerPosition()
  93. {
  94. point.setCoordinates(pos);
  95. }
  96. )?
  97. <RPAREN>
  98. {
  99. return point;
  100. }
  101. }
  102. /** 解析 MultiPoint 参数 */
  103. SGisMultiPoint passerMultiPointArgs():
  104. {
  105. SGisMultiPoint multiPoint;
  106. ArrayList<SGisPosition> posArr;
  107. }
  108. {
  109. {
  110. multiPoint = new SGisMultiPoint();
  111. }
  112. <LPAREN>
  113. (
  114. posArr = passerPositionArray()
  115. {
  116. multiPoint.setCoordinates(posArr);
  117. }
  118. )?
  119. <RPAREN>
  120. {
  121. return multiPoint;
  122. }
  123. }
  124. /** 解析 LineString 参数 */
  125. SGisLineString passerLineStringArgs():
  126. {
  127. SGisLineString line;
  128. ArrayList<SGisPosition> posArr;
  129. }
  130. {
  131. {
  132. line = new SGisLineString();
  133. }
  134. <LPAREN>
  135. (
  136. posArr = passerPositionArray()
  137. {
  138. line.setCoordinates(posArr);
  139. }
  140. )?
  141. <RPAREN>
  142. {
  143. return line;
  144. }
  145. }
  146. /** 解析 MultiLineString 参数 */
  147. SGisMultiLineString passerMultiLineStringArgs():
  148. {
  149. SGisMultiLineString multiLine;
  150. ArrayList<ArrayList<SGisPosition>> posArr2;
  151. }
  152. {
  153. {
  154. multiLine = new SGisMultiLineString();
  155. }
  156. <LPAREN>
  157. (
  158. posArr2 = passerPositionArray2()
  159. {
  160. multiLine.setCoordinates(posArr2);
  161. }
  162. )?
  163. <RPAREN>
  164. {
  165. return multiLine;
  166. }
  167. }
  168. /** 解析 Polygon 参数 */
  169. SGisPolygon passerPolygonArgs():
  170. {
  171. SGisPolygon polygon;
  172. ArrayList<ArrayList<SGisPosition>> posArr2;
  173. }
  174. {
  175. {
  176. polygon = new SGisPolygon();
  177. }
  178. <LPAREN>
  179. (
  180. posArr2 = passerPositionArray2()
  181. {
  182. polygon.setCoordinates(posArr2);
  183. }
  184. )?
  185. <RPAREN>
  186. {
  187. return polygon;
  188. }
  189. }
  190. /** 解析 MultiPolygon 参数 */
  191. SGisMultiPolygon passerMultiPolygonArgs():
  192. {
  193. SGisMultiPolygon multiPolygon;
  194. ArrayList<ArrayList<ArrayList<SGisPosition>>> posArr3;
  195. }
  196. {
  197. {
  198. multiPolygon = new SGisMultiPolygon();
  199. }
  200. <LPAREN>
  201. (
  202. posArr3 = passerPositionArray3()
  203. {
  204. multiPolygon.setCoordinates(posArr3);
  205. }
  206. )?
  207. <RPAREN>
  208. {
  209. return multiPolygon;
  210. }
  211. }
  212. /** 解析二维 Position 对象数组 */
  213. ArrayList<ArrayList<ArrayList<SGisPosition>>> passerPositionArray3():
  214. {
  215. ArrayList<ArrayList<SGisPosition>> posArray;
  216. ArrayList<ArrayList<ArrayList<SGisPosition>>> positionList = new ArrayList<ArrayList<ArrayList<SGisPosition>>>();
  217. }
  218. {
  219. <LPAREN>posArray = passerPositionArray2()<RPAREN>
  220. {
  221. positionList.add(posArray);
  222. }
  223. (
  224. <COMMA>
  225. <LPAREN>posArray = passerPositionArray2()<RPAREN>
  226. {
  227. positionList.add(posArray);
  228. }
  229. )*
  230. {
  231. return positionList;
  232. }
  233. }
  234. /** 解析二维 Position 对象数组 */
  235. ArrayList<ArrayList<SGisPosition>> passerPositionArray2():
  236. {
  237. ArrayList<SGisPosition> posArray;
  238. ArrayList<ArrayList<SGisPosition>> positionList = new ArrayList<ArrayList<SGisPosition>>();
  239. }
  240. {
  241. <LPAREN>posArray = passerPositionArray()<RPAREN>
  242. {
  243. positionList.add(posArray);
  244. }
  245. (
  246. <COMMA>
  247. <LPAREN>posArray = passerPositionArray()<RPAREN>
  248. {
  249. positionList.add(posArray);
  250. }
  251. )*
  252. {
  253. return positionList;
  254. }
  255. }
  256. /** 解析 Position 对象数组 */
  257. ArrayList<SGisPosition> passerPositionArray():
  258. {
  259. SGisPosition pos;
  260. ArrayList<SGisPosition> positionList = new ArrayList<SGisPosition>();
  261. }
  262. {
  263. pos = passerPosition()
  264. {
  265. positionList.add(pos);
  266. }
  267. (
  268. <COMMA>
  269. pos = passerPosition()
  270. {
  271. positionList.add(pos);
  272. }
  273. )*
  274. {
  275. return positionList;
  276. }
  277. }
  278. /** 解析 Position 对象 */
  279. SGisPosition passerPosition():
  280. {
  281. Double pos;
  282. ArrayList<Double> valList = new ArrayList<Double>();
  283. }
  284. {
  285. pos = parserNum()
  286. {
  287. valList.add(pos);
  288. }
  289. (
  290. pos = parserNum()
  291. {
  292. valList.add(pos);
  293. }
  294. )*
  295. {
  296. if (valList.size() >= 3) {
  297. return new SGisPosition(valList.get(0), valList.get(1), valList.get(2));
  298. }
  299. if (valList.size() >= 2) {
  300. return new SGisPosition(valList.get(0), valList.get(1), 0.0);
  301. }
  302. if (valList.size() >= 1) {
  303. return new SGisPosition(valList.get(0), 0.0, 0.0);
  304. }
  305. return new SGisPosition();
  306. }
  307. }
  308. /** 解析数 */
  309. Double parserNum():
  310. {
  311. Token t;
  312. }
  313. {
  314. t = <NUM>
  315. {
  316. return Double.parseDouble(t.image);
  317. }
  318. }