34
35:- module(wgs84,
36 [ wgs84_candidate/2,
37 wgs84_candidate/3,
38 coordinates/3,
39 coordinates/4,
40 lat/2,
41 long/2,
42 alt/2
43 ]). 44
45:- use_module(library(semweb/rdf_db)). 46:- rdf_register_ns(wgs84, 'http://www.w3.org/2003/01/geo/wgs84_pos#'). 47
48:- rdf_meta(wgs84_candidate(r,?)). 49:- rdf_meta(wgs84_candidate(r,?,?)).
57wgs84_candidate(URI,point(Lat,Long)) :-
58 wgs84_candidate(URI,point(Lat,Long),_).
59
60wgs84_candidate(URI,point(Lat,Long,Alt)) :-
61 wgs84_candidate(URI,point(Lat,Long,Alt),_).
69wgs84_candidate(URI,point(Lat,Long),Source) :-
70 nonvar(Source),
71 \+alt(URI,_,_),
72 lat(URI,Lat,Source),
73 long(URI,Long,Source).
74wgs84_candidate(URI,point(Lat,Long),Source) :-
75 var(Source),
76 \+alt(URI,_,_),
77 lat(URI,Lat,Source1),
78 ( Source1 = Source:_
79 -> true
80 ; Source = Source1
81 ),
82 long(URI,Long,Source).
83
84wgs84_candidate(URI,point(Lat,Long,Alt),Source) :-
85 lat(URI,Lat,Source),
86 long(URI,Long,Source),
87 alt(URI,Alt,Source).
94lat(URI,Lat) :-
95 lat(URI,Lat,_).
96lat(URI,Lat,Source) :-
97 rdf(URI,wgs84:lat,literal(LatAtom),Source),
98 ( LatAtom = type(_,LatVal)
99 -> ( atom(LatVal)
100 -> atom_number(LatVal,Lat)
101 ; Lat = LatVal
102 )
103 ; atom_number(LatAtom,Lat)
104 ).
111long(URI,Long) :-
112 long(URI,Long,_).
113long(URI,Long,Source) :-
114 rdf(URI,wgs84:long,literal(LongAtom),Source),
115 ( LongAtom = type(_,LongVal)
116 -> ( atom(LongVal)
117 -> atom_number(LongVal,Long)
118 ; Long = LongVal
119 )
120 ; atom_number(LongAtom,Long)
121 ).
128alt(URI,Alt) :-
129 alt(URI,Alt,_).
130alt(URI,Alt,Source) :-
131 rdf(URI,wgs84:alt,literal(AltAtom),Source),
132 ( AltAtom = type(_,AltVal)
133 -> ( atom(AltVal)
134 -> atom_number(AltVal,Alt)
135 ; Alt = AltVal
136 )
137 ; atom_number(AltAtom,Alt)
138 ).
147coordinates(URI,Lat,Long) :-
148 wgs84_candidate(URI,point(Lat,Long)).
149
150coordinates(URI,Lat,Long,Alt) :-
151 wgs84_candidate(URI,point(Lat,Long,Alt))