mirror of
https://github.com/knejadshamsi/zele-utils.git
synced 2024-11-14 17:40:28 -05:00
296 lines
13 KiB
Python
296 lines
13 KiB
Python
import sys
|
|
from rich.table import Table
|
|
from rich.console import Console
|
|
from rich.console import Group
|
|
from rich.padding import Padding
|
|
from rich.panel import Panel
|
|
from rich.syntax import Syntax
|
|
|
|
|
|
def population_help():
|
|
line1 = (
|
|
"This CLI tool processes [yellow bold]MATSim population XML files[/yellow bold] and prepares "
|
|
"the data for storage in either [green bold].csv[/green bold] files or a [blue bold]PostgreSQL[/blue bold] "
|
|
"database with [blue bold]PostGIS[/blue bold] integration."
|
|
)
|
|
line2 = (
|
|
"It extracts key data such as coordinates, converting them into a format ready for geospatial analysis.\n"
|
|
"Use the available [underline bold]options[/underline bold] to modify the behavior, such as "
|
|
"[underline bold]cleaning[/underline bold] the data by removing rows with missing values, or choosing to "
|
|
"either [underline bold]replace[/underline bold] or [underline bold]append[/underline bold] data in the target table."
|
|
)
|
|
line3 = "The expected format of the input MATSim population XML file is as follows:"
|
|
|
|
code = '''<population>
|
|
<!-- ====================================================================== -->
|
|
<person id="1">
|
|
<attributes>
|
|
<attribute name="age" class="java.lang.Integer">30</attribute>
|
|
<!-- Additional attributes -->
|
|
</attributes>
|
|
<plan selected="yes">
|
|
<activity type="home" x="322952.87" y="5084462.54" end_time="07:00:00" />
|
|
<leg mode="pt" dep_time="07:00:00" trav_time="00:41:00" />
|
|
<!-- Additional activities and legs -->
|
|
</plan>
|
|
</person>
|
|
<!-- ====================================================================== -->
|
|
<!-- Additional persons -->
|
|
</population>'''
|
|
syntax = Padding(Syntax(code, "xml", theme="native", line_numbers=True),(1,0))
|
|
|
|
line4 = "[red bold]NOTE:[/red bold] Make sure the dividers (line [bold]2[/bold] and [bold]14[/bold]) are present in the file; One divider before the first person and one divider after every person there after.\n\nThe resulting table structure includes columns such as the following:"
|
|
line5 = (
|
|
"[red bold]NOTE:[/red bold] Ensure PostgreSQL connection details are provided via a "
|
|
"[underline bold bright_cyan].env[/underline bold bright_cyan] file.\n"
|
|
"[red bold]NOTE:[/red bold] By default, if a [underline].log[/underline] file exists with the same name "
|
|
"in the same directory as the input file, it will use that to process the file."
|
|
)
|
|
|
|
table = Table(
|
|
"id", "lon", "lat", "geom", "time", "age", "sex", "person_id", "economic_sector", "household_id", "household_income"
|
|
)
|
|
table.add_row(
|
|
"1",
|
|
"45.89977111012078",
|
|
"-73.26605847316777",
|
|
"0101000020E61000005CED21B32BF3464013451E1A075152C0",
|
|
"07:00:00",
|
|
"30",
|
|
"1",
|
|
"1",
|
|
"0",
|
|
"1",
|
|
"4",
|
|
)
|
|
|
|
lines = f"{line1}\n{line2}\n\n{line3}"
|
|
group_content = Group(lines, syntax, line4, Padding(table, (1, 0)), line5)
|
|
panel = Padding(Panel(Padding(group_content, (1, 1)), title="About", title_align="left"),(1,0,0,0))
|
|
return panel
|
|
|
|
|
|
def network_help():
|
|
line1 = (
|
|
"This CLI tool processes [yellow bold]MATSim network XML files[/yellow bold] and prepares "
|
|
"the data for storage in either [green bold].csv[/green bold] files or a [blue bold]PostgreSQL[/blue bold] "
|
|
"database with [blue bold]PostGIS[/blue bold] integration."
|
|
)
|
|
line2 = (
|
|
"It extracts key data such as nodes and links, converting them into a format ready for geospatial analysis.\n"
|
|
"Use the available [underline bold]options[/underline bold] to modify the behavior, such as "
|
|
"[underline bold]cleaning[/underline bold] the data by removing rows with missing values, or choosing to "
|
|
"either [underline bold]replace[/underline bold] or [underline bold]append[/underline bold] data in the target table."
|
|
)
|
|
line3 = "The expected format of the input MATSim network XML file is as follows:"
|
|
|
|
code = '''<network>
|
|
|
|
<!-- ====================================================================== -->
|
|
|
|
<nodes>
|
|
<node id="10001628045" x="346519.0360492079" y="5053098.2183645" ></node>
|
|
</node>
|
|
|
|
<!-- ====================================================================== -->
|
|
|
|
<links capperiod="01:00:00" effectivecellsize="7.5" effectivelanewidth="3.75">
|
|
<link id="pt_VAU8D_pt_VAU1D" from="pt_VAU8D" to="pt_VAU1D" length="3596.5327216680666" freespeed="15.0" capacity="9999.0" permlanes="1.0" oneway="1" modes="artificial,rail" ></link>
|
|
</links>
|
|
|
|
<!-- ====================================================================== -->
|
|
|
|
</network>'''
|
|
syntax = Padding(Syntax(code, "xml", theme="native", line_numbers=True), (1, 0))
|
|
|
|
line4 = (
|
|
"[red bold]NOTE:[/red bold] Make sure the dividers (lines [bold]3[/bold], [bold]9[/bold], and [bold]15[/bold]) are present in the file; "
|
|
"One divider before the nodes section and one divider after the nodes and links sections.\n\n"
|
|
"The resulting table structures include columns such as the following:"
|
|
)
|
|
line5 = (
|
|
"[red bold]NOTE:[/red bold] Ensure PostgreSQL connection details are provided via a "
|
|
"[underline bold bright_cyan].env[/underline bold bright_cyan] file.\n"
|
|
"[red bold]NOTE:[/red bold] By default, if a [underline].log[/underline] file exists with the same name "
|
|
"in the same directory as the input file, it will use that to process the file."
|
|
)
|
|
|
|
# Table for 'links'
|
|
table_links = Table(
|
|
"id", "from", "to", "length", "freespeed", "capacity", "permlanes", "oneway", "modes"
|
|
)
|
|
table_links.add_row(
|
|
"1",
|
|
"1761723297",
|
|
"4407523214",
|
|
"506.2083628326979",
|
|
"13.88888888888889",
|
|
"600.0",
|
|
"1.0",
|
|
"1",
|
|
"car,car_passenger",
|
|
)
|
|
table_links.add_row(
|
|
"10",
|
|
"6545227882",
|
|
"300061322",
|
|
"567.0835225729793",
|
|
"19.444444444444443",
|
|
"1000.0",
|
|
"1.0",
|
|
"1",
|
|
"car,car_passenger",
|
|
)
|
|
|
|
# Table for 'links_attr'
|
|
table_links_attr = Table(
|
|
"id", "osm_way_highway", "osm_way_id", "osm_way_lanes", "osm_way_name", "sidewalk", "osm_way_oneway"
|
|
)
|
|
table_links_attr.add_row(
|
|
"1",
|
|
"unclassified",
|
|
"164553215",
|
|
"2",
|
|
"Montée Cadot",
|
|
"0.0",
|
|
"yes",
|
|
)
|
|
|
|
lines = f"{line1}\n{line2}\n\n{line3}"
|
|
group_content = Group(
|
|
lines,
|
|
syntax,
|
|
line4,
|
|
"[bold]\nlinks:[/bold]",
|
|
Padding(table_links, (1, 0)),
|
|
"[bold]links_attr:[/bold]",
|
|
Padding(table_links_attr, (1, 0)),
|
|
line5,
|
|
)
|
|
panel = Padding(Panel(Padding(group_content, (1, 1)), title="About", title_align="left"), (1, 0, 0, 0))
|
|
return panel
|
|
|
|
def metro_help():
|
|
line1 = (
|
|
"This CLI tool processes [yellow bold]metro station and line shapefiles[/yellow bold] "
|
|
"for a specified city and prepares the data for storage in either [green bold].csv[/green bold] "
|
|
"files or a [blue bold]PostgreSQL[/blue bold] database with [blue bold]PostGIS[/blue bold] integration."
|
|
)
|
|
line2 = (
|
|
"It extracts key data such as station locations and metro lines, converting them into a format "
|
|
"ready for geospatial analysis.\n"
|
|
"Use the available [underline bold]options[/underline bold] to modify the behavior, such as "
|
|
"[underline bold]cleaning[/underline bold] the data by removing rows with missing values, or choosing to "
|
|
"either [underline bold]replace[/underline bold] or [underline bold]append[/underline bold] data in the target table."
|
|
)
|
|
line3 = (
|
|
"For [bold]Montréal[/bold], To obtain the required shapefiles, please visit the following link:\n"
|
|
"[bright_cyan bold link=https://www.stm.info/en/about/developers?utm_campaign=menubas&utm_source=developpeurs]"
|
|
"https://www.stm.info/en/about/developers[/bright_cyan bold link]\n"
|
|
"Scroll down and find [bold]\"Download the Shapefile\"[/bold] button and download it.\n"
|
|
"Extract the downloaded archive to obtain the [bold].shp[/bold] and other files.\n"
|
|
"Use the relative path to [bold].shp[/bold] as your [bold]files[/bold] argument."
|
|
)
|
|
line4 = "The resulting table structures include columns such as the following:\n"
|
|
|
|
# Example table for 'metro-stations'
|
|
table_stations = Table(
|
|
"stop_code","stop_id","stop_name","stop_url","wheelchair","route_id","loc_type","shelter","service_id","coordinates"
|
|
)
|
|
table_stations.add_row(
|
|
"10118","43","Station Angrignon","http://www.stm.info/fr/infos/reseaux/metro/angrignon","1","1","0","NaN","24S","POINT (296733.6694496935 5034064.601946615)"
|
|
)
|
|
|
|
# Example table for 'metro-lines'
|
|
table_lines = Table(
|
|
"route_id","route_name","headsign","shape_id","ct","service_id","geometry"
|
|
)
|
|
table_lines.add_row(
|
|
"1","Ligne 1 - Verte","Station Angrignon","11072","0","24S","LINESTRING (302040.086988879 5050741.446280612...)"
|
|
)
|
|
|
|
line5 = (
|
|
"[red bold]NOTE:[/red bold] Ensure PostgreSQL connection details are provided via a "
|
|
"[underline bold bright_cyan].env[/underline bold bright_cyan] file.\n"
|
|
|
|
)
|
|
|
|
lines = f"{line1}\n{line2}\n\n{line3}\n\n{line4}"
|
|
group_content = Group(
|
|
lines,
|
|
"\n[bold]metro-stations:[/bold]",
|
|
Padding(table_stations, (1, 0)),
|
|
"[bold]metro-lines:[/bold]",
|
|
Padding(table_lines, (1, 0)),
|
|
line5,
|
|
)
|
|
panel = Padding(Panel(Padding(group_content, (1, 1)), title="About", title_align="left"), (1, 0, 0, 0))
|
|
return panel
|
|
|
|
def bus_help():
|
|
line1 = (
|
|
"This CLI tool processes [yellow bold]bus station and line shapefiles[/yellow bold] "
|
|
"for a specified city and prepares the data for storage in either [green bold].csv[/green bold] "
|
|
"files or a [blue bold]PostgreSQL[/blue bold] database with [blue bold]PostGIS[/blue bold] integration."
|
|
)
|
|
line2 = (
|
|
"It extracts key data such as station locations and bus lines, converting them into a format "
|
|
"ready for geospatial analysis.\n"
|
|
"Use the available [underline bold]options[/underline bold] to modify the behavior, such as "
|
|
"[underline bold]cleaning[/underline bold] the data by removing rows with missing values, or choosing to "
|
|
"either [underline bold]replace[/underline bold] or [underline bold]append[/underline bold] data in the target table."
|
|
)
|
|
line3 = (
|
|
"For [bold]Montréal[/bold], To obtain the required shapefiles, please visit the following link:\n"
|
|
"[bright_cyan bold link=https://www.stm.info/en/about/developers?utm_campaign=menubas&utm_source=developpeurs]"
|
|
"https://www.stm.info/en/about/developers[/bright_cyan bold link]\n"
|
|
"Scroll down and find [bold]\"Download the Shapefile\"[/bold] button and download it.\n"
|
|
"Extract the downloaded archive to obtain the [bold].shp[/bold] and related files.\n"
|
|
"Use the relative path to [bold].shp[/bold] as your [bold]files[/bold] argument."
|
|
)
|
|
line4 = "The resulting table structures include columns such as the following:\n"
|
|
|
|
# Example table for 'bus-stations'
|
|
table_stations = Table(
|
|
"stop_code","stop_id","stop_name","stop_url","wheelchair","route_id","loc_type","shelter","service_id","coordinates"
|
|
)
|
|
table_stations.add_row(
|
|
"10282","66-01","Station Cartier - Terminus Cartier (A)","NaN","1","NaN","2","NaN","24S","POINT (290599.75509576086 5046736.8438161155)"
|
|
)
|
|
|
|
# Example table for 'bus-lines'
|
|
table_lines = Table(
|
|
"route_id","route_name","headsign","shape_id","ct","service_id","geometry"
|
|
)
|
|
table_lines.add_row(
|
|
"767","La Ronde / Station Jean-Drapeau","Est","7670032","59","24S","LINESTRING (302272.2175821533 5041335.954894771, 302272.06122515834..."
|
|
)
|
|
|
|
line5 = (
|
|
"[red bold]NOTE:[/red bold] Ensure PostgreSQL connection details are provided via a "
|
|
"[underline bold bright_cyan].env[/underline bold bright_cyan] file.\n"
|
|
)
|
|
|
|
lines = f"{line1}\n{line2}\n\n{line3}\n\n{line4}"
|
|
group_content = Group(
|
|
lines,
|
|
"\n[bold]bus-stations:[/bold]",
|
|
Padding(table_stations, (1, 0)),
|
|
"[bold]bus-lines:[/bold]",
|
|
Padding(table_lines, (1, 0)),
|
|
line5,
|
|
)
|
|
panel = Padding(Panel(Padding(group_content, (1, 1)), title="About", title_align="left"), (1, 0, 0, 0))
|
|
return panel
|
|
|
|
def print_help():
|
|
console = Console()
|
|
if "--help" in sys.argv or "-h" in sys.argv:
|
|
if (sys.argv[1] == "population"):
|
|
console.print(population_help())
|
|
elif (sys.argv[1] == "network"):
|
|
console.print(network_help())
|
|
elif (sys.argv[1] == "metro"):
|
|
console.print(metro_help())
|
|
elif (sys.argv[1] == "bus"):
|
|
console.print(bus_help()) |