source: subversion/applications/utils/where_are_they/osm_io_helper.py @ 34613

Last change on this file since 34613 was 2189, checked in by nickburch, 12 years ago

Add "where are they" stuff (http://wiki.openstreetmap.org/index.php/Where_Are_They) to svn

  • Property svn:eol-style set to native
File size: 6.3 KB
Line 
1# Helpers for OSM python scripts such as "where am I" and "where is it"
2#
3# GPL
4#
5# Nick Burch
6#               v0.01  (06/08/2006)
7
8import os
9import sys
10import time
11
12global opts
13
14# Grab our options
15if os.environ.has_key("QUERY_STRING"):
16        if len(os.environ["QUERY_STRING"]):
17                opts = os.environ["QUERY_STRING"].split("&")
18        else:
19                opts = ()
20else:
21        opts = sys.argv[1:]
22
23def hasOpt(opt):
24        global opts
25        for thisopt in (opts):
26                if thisopt == opt:
27                        return True
28                if thisopt.startswith(opt + "="):
29                        return True
30        return False
31def getOpt(opt):
32        global opts
33        ret=""
34        for thisopt in (opts):
35                if thisopt.startswith(opt + "="):
36                        if len(ret):
37                                ret += ","
38                        ret += thisopt[(thisopt.find("=")+1):]
39        return ret
40
41def hasAnyOpts():
42        global opts
43        if len(opts):
44                return True
45        return False
46
47def printHTTPHeaders(format):
48        # Everything except HTML is XML
49        content_type = "text/xml"
50        if format == "html":
51                content_type = "text/html"
52
53        # Print out a content type for them
54        print "Content-Type: %s" % content_type
55        print ""
56
57# ##########################################################################
58
59def findMinMaxLatLong(objects):
60        global min_lat
61        global min_long
62        global max_lat
63        global max_long
64        (min_lat,min_long,max_lat,max_long) = (90,90,-90,-90)
65        if len(objects) == 0:
66                (min_lat,min_long,max_lat,max_long) = (0,0,0,0)
67
68        def do_node(node):
69                global min_lat
70                global min_long
71                global max_lat
72                global max_long
73                if node["lat"] < min_lat:       
74                        min_lat = node["lat"]
75                if node["lat"] > max_lat:       
76                        max_lat = node["lat"]
77                if node["long"] < min_long:     
78                        min_long = node["long"]
79                if node["long"] > max_long:     
80                        max_long = node["long"]
81        def do_seg(seg):
82                do_node(seg["node_a_node"])
83                do_node(seg["node_b_node"])
84
85        for obj in (objects):
86                if obj.has_key("lat"):
87                        do_node(obj)
88                else:
89                        do_seg(obj)
90
91        return (min_lat,min_long,max_lat,max_long)
92
93# ##########################################################################
94
95def renderResults(type,objects,format,title,renderType):
96        # If we got a hash, just get the values
97        if isinstance(objects,dict):
98                objects = objects.values()
99
100        if format == "xml":
101                print '<?xml version="1.0" encoding="UTF-8"?>'
102                print '<%s>' % type.lower()
103                tag = type.lower()[0:-1]
104                for obj in (objects):
105                        if not obj.has_key("ref"):
106                                obj["ref"] = None
107                        latlong = ""
108                        if obj.has_key("lat"):
109                                latlong = " latitude='%2.6f' longitude='%2.6f'" % (float(obj['lat']),float(obj['long']))
110                        print "  <%s ref='%s' type='%s' distance='%d' bearing='%d'%s>%s</%s>" % (tag,obj["ref"],obj["type"],int(obj["distance"]),int(obj["bearing"]),latlong,obj["name"],tag)
111                print '</%s>' % type.lower()
112        if format == "osm":
113                print '<?xml version="1.0" encoding="UTF-8"?>'
114                print '<osm version="0.3" generator="where_am_i.py">'
115
116                def osm_do_node(obj):
117                        print " <node id='%s' lat='%s' long='%s'>" % (obj["id"],obj["lat"],obj["long"])
118                        for tag in obj["tags"]:
119                                print "  <tag k='%s' v='%s' />" % (tag[0],tag[1])
120                        print " </node>"
121                def osm_do_seg(obj):
122                        osm_do_node(obj["node_a_node"])
123                        osm_do_node(obj["node_b_node"])
124                        print " <segment id='%s' from='%s' to='%s'>" % (obj["id"],obj["node_a"],obj["node_b"])
125                        for tag in obj["tags"]:
126                                print "  <tag k='%s' v='%s' />" % (tag[0],tag[1])
127                        print " </segment>"
128
129                for obj in (objects):
130                        if obj.has_key("lat"):
131                                osm_do_node(obj)
132                        else:
133                                osm_do_seg(obj)
134
135                print '</osm>'
136        if format == "gpx":
137                print '<?xml version="1.0" encoding="UTF-8"?>'
138                print '<gpx version="1.0"'
139                print ' creator="Where Am I? - http://gagravarr.org/code/"'
140                print ' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'
141                print ' xmlns="http://www.topografix.com/GPX/1/0"'
142                print ' xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">'
143
144                # Render
145                print '<time>' + time.strftime("%Y-%m-%dT%H:%M:%SZ") + '</time>'
146                print '<bounds minlat="%s" minlon="%s" maxlat="%s" maxlon="%s" />' % findMinMaxLatLong(objects)
147
148
149                def gpx_do_node(obj):
150                        print '<wpt lat="%s" lon="%s">' % (obj["lat"],obj["long"])
151                        if obj.has_key("name"):
152                                print ' <name>%s</name>' % obj["name"]
153                        if obj.has_key("ref"):
154                                print ' <cmt>%s</cmt>' % obj["ref"]
155                        if obj.has_key("type"):
156                                print ' <desc>%s</desc>' % obj["type"]
157                        print ' <sym>Waypoint</sym>'
158                        print '</wpt>'
159                def gpx_do_seg(obj):
160                        print '<trk>'
161                        print ' <name>%s</name>' % obj["name"]
162                        if obj.has_key("ref"):
163                                print ' <cmt>%s</cmt>' % obj["ref"]
164                        print ' <type>%s</type>' % obj["type"]
165                        print '</trk>'
166
167                # Do waypoints (nodes) first
168                for obj in (objects):
169                        if obj.has_key("lat"):
170                                gpx_do_node(obj)
171                        else:
172                                gpx_do_node(obj["node_a_node"])
173                                gpx_do_node(obj["node_b_node"])
174                # Now do segments
175                for obj in (objects):
176                        if obj.has_key("lat"):
177                                pass
178                        else:
179                                gpx_do_seg(obj)
180
181                print '</gpx>'
182        if format == "html":
183                print "<html><head><title>%s</title></head>" % (type)
184                print "<body><h1>%s</h1>" % type
185                if len(objects) > 1:
186                        print "<ul>"
187
188                for obj in (objects):
189                        bearing = int(obj["bearing"])
190                        if bearing < 0:
191                                bearing += 360.0
192                        distance = "%dm" % int(obj["distance"])
193                        if int(obj["distance"]) > 10000:
194                                distance = "%dkm" % int(obj["distance"]/1000)
195                        if not obj.has_key("ref"):
196                                obj["ref"] = None
197
198                        if renderType == "latlong":
199                                print "  <li><b>%s</b> - %s - <a href='http://www.openstreetmap.org/?lat=%s&lon=%s&zoom=12'>%s %s</a> - <a href='where_am_i.py?lat=%s&long=%s'>search around here</a></li>" % (obj["name"],obj["type"],obj["lat"],obj["long"],obj["lat"],obj["long"],obj["lat"],obj["long"])
200                        else:
201                                if obj["name"] == obj["ref"] or obj["ref"] == None:
202                                        print "  <li><b>%s</b> - %s - %s - heading %d<sup>o</sup></li>" % (obj["name"], obj["type"], distance, bearing)
203                                else:
204                                        print "  <li><b>%s</b> - %s - %s - %s - heading %d<sup>o</sup></li>" % (obj["name"], obj["ref"], obj["type"], distance, bearing)
205
206                if len(objects) > 1:
207                        print "</ul>"
208                        print "<p>Data from <a href='http://www.openstreetmap.org/'>OpenStreetMap</a></p>"
209                if len(objects) == 0:
210                        print "<p>No results found - either OpenStreetMap doesn't have any data on this area, or that data that it does have hasn't yet been correctly tagged. Sorry about that.</p>"
211                print "</body></html>"
212
213# ##########################################################################
214
215def sortByDistance(x,y):
216        if x["distance"] == y["distance"]:
217                return 0
218        if x["distance"] > y["distance"]:
219                return 1
220        return -1
221
222# ##########################################################################
Note: See TracBrowser for help on using the repository browser.