comments and shop types

This commit is contained in:
j.mei7
2022-03-22 20:02:33 +01:00
parent 4c647c8d73
commit 868f9eba0f
9 changed files with 101 additions and 62 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

58
main.py
View File

@@ -1,8 +1,17 @@
OFFLINE = True
from managers import ShopManager
from osm import OSM
from places import Shops
from publicTransport import PublicTransportAccessibility
import requests
# ADVANCED:
# Get external data of shops, like website
# Get General City/Region data: average age, peace index, democrazy index, average income
# IDEAS:
# Parks
# ATMs
# 52.9152386,,15.96z
# bhv 53.51500036203292, 8.603602165157444
@@ -23,28 +32,35 @@ maxLat = round(float(lat) + areaHeightRadius, 5)
requestUrl = "https://overpass-api.de/api/map"
requestsUrlParams = f"?bbox={minLon},{minLat},{maxLon},{maxLat}"
print(requestUrl + requestsUrlParams)
""" # ONLINE
print("Downloading OSM-File...")
# TODO Check if banned from overpass-api MAYBE get alternative API then
r = requests.get(requestUrl + requestsUrlParams, headers={'Content-Type': 'application/xml'})
print("Done: Downloading OSM-File")
osm = OSM(r.text)
"""
# Offline
print("Using offline file!")
file = open("mapHH", encoding="utf8")
osm = OSM(file.read())
if OFFLINE:
print("Using offline file!")
file = open("mapHH", encoding="utf8")
osm = OSM(file.read())
else:
print(requestUrl + requestsUrlParams)
print("Downloading OSM-File...")
# TODO Check if banned from overpass-api MAYBE get alternative API then
r = requests.get(requestUrl + requestsUrlParams, headers={'Content-Type': 'application/xml'})
print("Done: Downloading OSM-File")
osm = OSM(r.text)
pta = PublicTransportAccessibility(osm)
shops = Shops(osm)
shopManager = ShopManager(osm)
print("Bus:" + str(pta.isBusAccessible()))
print("Tram:" + str(pta.isTramAccessible()))
print("Light Rail:" + str(pta.isLightRailAccessible()))
print("Subway:" + str(pta.isSubwayAccessible()))
print("Train:" + str(pta.isTrainAccessible()))
print("Monorail:" + str(pta.isMonorailAccessible()))
print("\n--- Public Transport Accessibility ---")
print("Bus: " + str(pta.isBusAccessible()))
print("Tram: " + str(pta.isTramAccessible()))
print("Light Rail: " + str(pta.isLightRailAccessible()))
print("Subway: " + str(pta.isSubwayAccessible()))
print("Train: " + str(pta.isTrainAccessible()))
print("Monorail: " + str(pta.isMonorailAccessible()))
print("\n--- 10 Most present shop types ---")
counter = 0
for s in shopManager.getCountsOfTypes():
if counter <= 10:
print(s['type'] + " : " + str(s['count']) + " times")
counter = counter + 1
print(shops.countOfShopTypes())

21
managers.py Normal file
View File

@@ -0,0 +1,21 @@
from operator import itemgetter
class ShopManager:
def __init__(self, _osm):
self.osm = _osm
def getCountsOfTypes(self):
countDict = []
def isInDict(type):
for a in countDict:
if a['type'] == type:
return True
return False
if self.osm.shopList:
for shop in self.osm.shopList:
if not isInDict(shop.type):
countDict.append({'type': shop.type, 'count': sum(a.type == shop.type for a in self.osm.shopList)})
return sorted(countDict, key=itemgetter('count'), reverse=True)

View File

@@ -1,3 +1,10 @@
class Shop:
# TODO More optional details/attributes. Example: "website", "brand", "Telefone", "Owner"
def __init__(self, _nodeIds, _name, _type):
self.nodeIds = _nodeIds
self.name = _name
self.type = _type
class Node:
def __init__(self, _id, _lon, _lat, _version, _timestamp, _changeset, _uid, _user):
self.id = int(_id)

39
osm.py
View File

@@ -1,12 +1,14 @@
from objects import Node, NodeTag, Way, WayTag
from objects import Node, NodeTag, Way, WayTag, Shop
class OSM:
# TODO Average value of "last updated" to see how up to date the data is.
def __init__(self, _osmContent):
self.osmContent = str(_osmContent)
self.nodeList = []
self.nodeTagList = []
self.wayList = []
self.wayTagList = []
self.shopList = []
self.parseOsmContent()
def parseOsmContent(self):
@@ -42,8 +44,31 @@ class OSM:
wayLines = []
elif len(wayLines) > 0:
wayLines.append(line)
def createShop(self, lines):
# TODO Make sure shops are not duplicates.
# TODO e.g. REWE(shop) is big enough to have some "Ways" of it's own and multiple nodes, which can cause duplicates.
nodeIds = []
type = ""
name = ""
for line in lines:
if '<tag ' in line:
key = str(line.split('k="')[1].split('"')[0])
value = str(line.split('v="')[1].split('"')[0])
if key == "shop":
type = value
elif key == "name":
name = value
elif '<nd ' in line:
nodeIds.append(line.split('ref="')[1].split('"')[0])
s = Shop(nodeIds, name, type)
self.shopList.append(s)
def createWay(self, lines):
wayId = ""
@@ -65,6 +90,9 @@ class OSM:
wt = WayTag(len(self.wayTagList), wayId, key, value)
self.wayTagList.append(wt)
if key == "shop":
self.createShop(lines)
def createNode(self, lines):
nodeId = ""
@@ -86,4 +114,7 @@ class OSM:
key = str(line.split('k="')[1].split('"')[0])
value = str(line.split('v="')[1].split('"')[0])
nt = NodeTag(len(self.nodeTagList), nodeId, key, value)
self.nodeTagList.append(nt)
self.nodeTagList.append(nt)
if key == "shop":
self.createShop(lines)

View File

@@ -1,35 +0,0 @@
from operator import itemgetter
class Shops:
def __init__(self, _osm):
self.osm = _osm
def getAllShopTypes(self):
shopList = []
for tag in self.osm.nodeTagList:
if tag.key == "shop":
shopList.append(tag.value)
for tag in self.osm.wayTagList:
if tag.key == "shop":
shopList.append(tag.value)
return shopList
def countOfShopTypes(self):
shopList = self.getAllShopTypes()
countDict = []
if shopList:
def isInDict(name):
for a in countDict:
if a['type'] == name:
return True
return False
for shop in shopList:
print(shop)
if not isInDict(shop):
print("add" + str(shopList.count(shop)))
countDict.append({'type': shop, 'count': shopList.count(shop)})
return sorted(countDict, key=itemgetter('count'), reverse=True)

View File

@@ -1,7 +1,6 @@
from osm import OSM
from objects import Node, NodeTag
class PublicTransportAccessibility:
# TODO count of each Ttransport type
def __init__(self, _osm):
self.osm = _osm