Code owners
Assign users and groups as approvers for specific file changes. Learn more.
data.py 2.40 KiB
"""
Get OSM Data and merge with charging stops.
"""
import argparse
from typing import Tuple
import pandas as pd
long = float
lat = float
coordinate = Tuple[lat, long]
def parse_charging_stations_csv(file: str, nw_corner: coordinate = None, se_corner: coordinate = None):
def float_converter(s: str):
if not s:
return 0.0
return float(s.replace(',', '.'))
converters = {
'lon': lambda s: float(s.replace(',', '.')),
'lat': lambda s: float(s.replace(',', '.')),
'p1': float_converter,
'p2': float_converter,
'p3': float_converter,
'p4': float_converter
}
df: pd.DataFrame = pd.read_csv(
file,
sep='\t',
skiprows=6,
header=None,
names=converters.keys(),
converters=converters,
usecols=[4, 5, 11, 14, 17, 20]
)
# Store only information about maximum power
df['power'] = df[['p1', 'p2', 'p3', 'p4']].max(axis=1)
del df['p1']
del df['p2']
del df['p3']
del df['p4']
if nw_corner is not None and se_corner is not None:
lat_max, lon_min = nw_corner
lat_min, lon_max = se_corner
df = df[(df['lon'] <= lon_max)
& (df['lon'] >= lon_min)
& (df['lat'] <= lat_max)
& (df['lat'] >= lat_min)
]
return df
if __name__ == '__main__':
parser = argparse.ArgumentParser(description="Merge OSM map data with"
"charging station data.")
parser.add_argument(
'input_path',
metavar='source',
type=argparse.FileType('r'),
help='Path to the csv file.'
)
parser.add_argument(
'dest_path',
metavar='dest',
help='Path for destination of Charging Stations json.'
)
parser.add_argument(
'--cut',
type=float,
nargs=4,
metavar=('lat_nw', 'lon_nw', 'lat_se', 'lon_se'),
help='Use only those charging stations that are located with in a '
'rectangle defined by the north-west and south-east coordinates.'
)
args = parser.parse_args()
nw_corner = None
se_corner = None
if args.cut:
nw_corner = args.cut[:2]
se_corner = args.cut[2:]
parse_charging_stations_csv(
args.input_path,
nw_corner=nw_corner,
se_corner=se_corner
).to_json(args.dest_path, orient='records')