init
This commit is contained in:
commit
966ee378a2
4 changed files with 152 additions and 0 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
*.gpx
|
||||||
|
*.pickle
|
64
create_polygon.py
Executable file
64
create_polygon.py
Executable file
|
@ -0,0 +1,64 @@
|
||||||
|
#!/bin/python3
|
||||||
|
|
||||||
|
import osmapi
|
||||||
|
import shapely
|
||||||
|
import pickle
|
||||||
|
from os.path import exists
|
||||||
|
|
||||||
|
|
||||||
|
OSM_KOGGENLAND_ID = 161930
|
||||||
|
PICKLE_FILE = 'polygon.pickle'
|
||||||
|
|
||||||
|
|
||||||
|
def chunks(lst, n):
|
||||||
|
"""Yield successive n-sized chunks from lst."""
|
||||||
|
for i in range(0, len(lst), n):
|
||||||
|
yield lst[i:i + n]
|
||||||
|
|
||||||
|
|
||||||
|
def dump_polygon():
|
||||||
|
osm_api = osmapi.OsmApi()
|
||||||
|
koggenland = osm_api.RelationGet(OSM_KOGGENLAND_ID)
|
||||||
|
ways = filter(lambda x: x['type'] == 'way', koggenland['member'])
|
||||||
|
shell_ids = []
|
||||||
|
|
||||||
|
for way in ways:
|
||||||
|
way = osm_api.WayGet(way['ref'])
|
||||||
|
node_ids = way['nd']
|
||||||
|
if not shell_ids:
|
||||||
|
shell_ids.append(node_ids[0])
|
||||||
|
for node_id in node_ids[1:]:
|
||||||
|
shell_ids.append(node_id)
|
||||||
|
|
||||||
|
node_data = dict()
|
||||||
|
for chunk in chunks(shell_ids, 100):
|
||||||
|
node_data |= osm_api.NodesGet(chunk)
|
||||||
|
|
||||||
|
shell = list()
|
||||||
|
for shell_id in shell_ids:
|
||||||
|
node = node_data[shell_id]
|
||||||
|
shell.append((node['lat'], node['lon']))
|
||||||
|
|
||||||
|
koggenland_polygon = shapely.Polygon(shell)
|
||||||
|
with open(PICKLE_FILE, 'wb') as f:
|
||||||
|
pickle.dump(koggenland_polygon, f)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
if not exists(PICKLE_FILE):
|
||||||
|
print('Using OSM API to create polygon...')
|
||||||
|
dump_polygon()
|
||||||
|
print('Dumped polygon to file.')
|
||||||
|
with open(PICKLE_FILE, 'rb') as f:
|
||||||
|
area = pickle.load(f)
|
||||||
|
print('Loaded polygon from file.')
|
||||||
|
|
||||||
|
point_out = shapely.Point(52.68811, 4.91267)
|
||||||
|
point_in = shapely.Point(52.69168, 4.91324)
|
||||||
|
|
||||||
|
print('out', area.contains(point_out))
|
||||||
|
print('in', area.contains(point_in))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
58
find_centre.py
Executable file
58
find_centre.py
Executable file
|
@ -0,0 +1,58 @@
|
||||||
|
#!/bin/python3
|
||||||
|
|
||||||
|
import osmapi
|
||||||
|
import itertools
|
||||||
|
import math
|
||||||
|
# import pickle
|
||||||
|
# import os
|
||||||
|
|
||||||
|
OSM_KOGGENLAND_ID = 161930
|
||||||
|
PICKLE_FILE = 'koggenland.pickle'
|
||||||
|
|
||||||
|
|
||||||
|
def chunks(lst, n):
|
||||||
|
"""Yield successive n-sized chunks from lst."""
|
||||||
|
for i in range(0, len(lst), n):
|
||||||
|
yield lst[i:i + n]
|
||||||
|
|
||||||
|
|
||||||
|
def flatten(lst):
|
||||||
|
return list(itertools.chain(*lst))
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
osm_api = osmapi.OsmApi()
|
||||||
|
koggenland = osm_api.RelationFullRecur(OSM_KOGGENLAND_ID)
|
||||||
|
node_ids = list(map(lambda a: a['data']['id'], filter(
|
||||||
|
lambda a: a['type'] == 'node', koggenland)))
|
||||||
|
|
||||||
|
coords = []
|
||||||
|
for chunk in chunks(node_ids, 100):
|
||||||
|
coords += map(lambda a: (a['lat'], a['lon']),
|
||||||
|
osm_api.NodesGet(chunk).values())
|
||||||
|
|
||||||
|
cx, cy = 0., 0.
|
||||||
|
for (x, y) in coords:
|
||||||
|
cx += x
|
||||||
|
cy += y
|
||||||
|
cx /= len(coords)
|
||||||
|
cy /= len(coords)
|
||||||
|
|
||||||
|
print('centre', (cx, cy))
|
||||||
|
|
||||||
|
# 7KM radius (eye-balled)
|
||||||
|
|
||||||
|
# max_coord = None
|
||||||
|
# max_dist = 0
|
||||||
|
|
||||||
|
# for (x, y) in coords:
|
||||||
|
# dist = math.sqrt((cx - x)**2 + (cy - y)**2)
|
||||||
|
# if dist > max_dist:
|
||||||
|
# max_dist = dist
|
||||||
|
# max_coord = (x, y)
|
||||||
|
|
||||||
|
# print('max', max_coord)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
28
parse_gpx.py
Executable file
28
parse_gpx.py
Executable file
|
@ -0,0 +1,28 @@
|
||||||
|
#!/bin/python3
|
||||||
|
|
||||||
|
import gpxpy
|
||||||
|
import gpxpy.gpx
|
||||||
|
import shapely
|
||||||
|
import pickle
|
||||||
|
|
||||||
|
GPX_IN_FILE = 'caches.gpx'
|
||||||
|
GPX_OUT_FILE = 'koggenland.gpx'
|
||||||
|
PICKLE_FILE = 'polygon.pickle'
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
with open(PICKLE_FILE, 'rb') as f:
|
||||||
|
area = pickle.load(f)
|
||||||
|
|
||||||
|
with open(GPX_IN_FILE, 'rb') as f:
|
||||||
|
gpx = gpxpy.parse(f)
|
||||||
|
|
||||||
|
gpx.waypoints = list(filter(lambda wp: area.contains(
|
||||||
|
shapely.Point(wp.latitude, wp.longitude)), gpx.waypoints))
|
||||||
|
|
||||||
|
with open(GPX_OUT_FILE, 'w') as f:
|
||||||
|
f.write(gpx.to_xml())
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
Loading…
Reference in a new issue