34
35:- module(wkt,
36 [ wkt_shape/2
37 ]).
44wkt_shape(WKT,Shape) :-
45 ( var(WKT)
46 -> phrase(geometry_tagged_text(Shape), WKTlist),
47 atomic_list_concat(WKTlist, WKT)
48 ; tokenize_atom(WKT, WKTlist),
49 phrase(geometry_tagged_text(Shape), WKTlist)
50 ).
51
52geometry_tagged_text(T) --> point_tagged_text(T) ;
53 linestring_tagged_text(T) ;
54 polygon_tagged_text(T) ;
55 multipoint_tagged_text(T) ;
56 multilinestring_tagged_text(T) ;
57 multipolygon_tagged_text(T) ;
58 geometrycollection_tagged_text(T).
59
60point_tagged_text(T) -->
61 ['POINT'], point_text(T).
62linestring_tagged_text(linestring(T)) -->
63 ['LINESTRING'], blank_star, linestring_text(T).
64polygon_tagged_text(polygon(T)) -->
65 ['POLYGON'], blank_star, polygon_text(T).
66multipoint_tagged_text(multipoint(T)) -->
67 ['MULTIPOINT'], blank_star, multipoint_text(T).
68multilinestring_tagged_text(multilinestring(T)) -->
69 ['MULTILINESTRING'], blank_star, multilinestring_text(T).
70multipolygon_tagged_text(multipolygon(T)) -->
71 ['MULTIPOLYGON'], blank_star, multipolygon_text(T).
72geometrycollection_tagged_text(geometrycollection(T)) -->
73 ['GEOMETRYCOLLECTION'], blank_star, geometrycollection_text(T).
74
75point_text(point(empty)) --> ['EMPTY'], !.
76point_text(point(X,Y,Z,M)) -->
77 {nonvar(X)}, blank_plus, ['ZM'], blank_plus, ['('], blank_star, point(zm_point(X,Y,Z,M)), blank_star, [')'], ! ;
78 blank_star, ['ZM'], blank_star, ['('], blank_star, point(zm_point(X,Y,Z,M)), blank_star, [')'].
79point_text(point(X,Y,Z)) -->
80 {nonvar(X)}, blank_plus, ['Z'], blank_plus, ['('], blank_star, point(z_point(X,Y,Z)), blank_star, [')'], ! ;
81 blank_star, ['Z'], blank_star, ['('], blank_star, point(z_point(X,Y,Z)), blank_star, [')'].
82point_text(point(X,Y)) --> blank_star, ['('], blank_star, point(xy_point(X,Y)), blank_star, [')'].
83linestring_text(empty) --> ['EMPTY'], !.
84linestring_text(T) --> ['('], blank_star, points(T), blank_star, [')'].
85polygon_text(empty) --> ['EMPTY'], !.
86polygon_text(T) --> ['('], blank_star, linestring_texts(T), blank_star, [')'].
87multipoint_text(empty) --> ['EMPTY'], !.
88multipoint_text(T) --> ['('], blank_star, point_texts(T), blank_star, [')'].
89multilinestring_text(empty) --> ['EMPTY'], !.
90multilinestring_text(T) --> ['('], blank_star, linestring_texts(T), blank_star, [')'].
91multipolygon_text(empty) --> ['EMPTY'], !.
92multipolygon_text(T) --> ['('], blank_star, polygon_texts(T), blank_star, [')'].
93geometrycollection_text(empty) --> ['EMPTY'], !.
94geometrycollection_text(T) --> ['('], blank_star, geometry_tagged_texts(T), blank_star, [')'].
95
96points([point(X,Y)|T]) --> point(xy_point(X,Y)), points_star(T).
97points([point(X,Y,Z)|T]) --> point(z_point(X,Y,Z)), points_star(T).
98points([point(X,Y,Z,M)|T]) --> point(zm_point(X,Y,Z,M)), points_star(T).
99points_star(T) --> [','], blank_star, points(T).
100points_star([]) --> [], !.
101point_texts([H|T]) --> point_text(H), point_texts_star(T).
102point_texts_star(T) --> [','], blank_star, point_texts(T).
103point_texts_star([]) --> [], !.
104linestring_texts([H|T]) --> linestring_text(H), linestring_texts_star(T).
105linestring_texts_star(T) --> [','], blank_star, linestring_texts(T).
106linestring_texts_star([]) --> [], !.
107polygon_texts([H|T]) --> polygon_text(H), polygon_texts_star(T).
108polygon_texts_star(T) --> [','], blank_star, polygon_texts(T).
109polygon_texts_star([]) --> [], !.
110geometry_tagged_texts([H|T]) --> geometry_tagged_text(H), geometry_tagged_texts_star(T).
111geometry_tagged_texts_star(T) --> [','], blank_star, geometry_tagged_texts(T).
112geometry_tagged_texts_star([]) --> [], !.
113
114point(zm_point(X,Y,Z,M)) -->
115 {nonvar(X)}, c(X), blank_plus, c(Y), blank_plus, c(Z), blank_plus, c(M), ! ;
116 c(X), blank_star, c(Y), blank_star, c(Z), blank_star, c(M).
117point(z_point(X,Y,Z)) -->
118 {nonvar(X)}, c(X), blank_plus, c(Y), blank_plus, c(Z), ! ;
119 c(X), blank_star, c(Y), blank_star, c(Z).
120point(xy_point(X,Y)) -->
121 {nonvar(X)}, c(X), blank_plus, c(Y), ! ;
122 c(X), blank_star, c(Y).
123c(X) --> {var(X)}, [ X ].
124c(X) --> {atom(X), atom_number(X,Xn)}, [ Xn ].
125c(X) --> {number(X)}, [ X ].
126
127blank_plus --> [' '], blank_star, !.
128blank_star --> [], !.
129blank_star --> blank_plus, !