{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# GMNS to AequilibraE example\n", "\n", "## Inputs\n", "Nodes as a .csv flat file in GMNS format\n", "omx skim files with numbers of trips\n", "omx skim file with distnace\n", "\n", "\n", "## Steps\n", "1. Read the GMNS nodes, place centroids in dataframe\n", "\n", "2. Read the trips\n", "\n", "4. Generate new dataframe of O-D pairs\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Scott Smith: Python code to extract selected zone pairs from a person trip table \n", "\n" ] } ], "source": [ "#!/usr/bin/env python\n", "# coding: utf-8\n", "print('Scott Smith: Python code to extract selected zone pairs from a person trip table \\n')\n", "import os\n", "from os.path import join \n", "import numpy as np\n", "import pandas as pd\n", "import sqlite3\n", "#import shutil # needed?\n", "import openmatrix as omx\n", "import math\n", "run_folder = 'C:/Users/Scott/Documents/Work/GMNS/ATL' \n", "highest_centroid_node_number = 6031" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [], "source": [ "def sl_dist(lat1, lon1, lat2, lon2):\n", " from math import radians, cos, sqrt, pow\n", " mile_per_lat = 69.0\n", " mile_per_lon = mile_per_lat * math.cos(math.radians((lat1+lat2)/2.0))\n", " latdiff = mile_per_lat * (lat1-lat2)\n", " londiff = mile_per_lon * (lon1-lon2)\n", " return sqrt(pow(latdiff,2) + pow(londiff,2))\n" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [], "source": [ "#print(sl_dist(40,-75,41,-76))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Read the nodes, and set up the dictionary of centroids\n", "The dictionary of centroids is used later in setting up the omx trip table" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " node_id name x_coord y_coord z_coord node_type ctrl_type \\\n", "0 1 NaN -84.416355 34.076861 NaN centroid no_control \n", "1 2 NaN -84.410110 34.067103 NaN centroid no_control \n", "2 3 NaN -84.398224 34.080752 NaN centroid no_control \n", "3 4 NaN -84.374950 34.077750 NaN centroid no_control \n", "4 5 NaN -84.364269 34.082443 NaN centroid no_control \n", "\n", " zone_id parent_node_id \n", "0 NaN NaN \n", "1 NaN NaN \n", "2 NaN NaN \n", "3 NaN NaN \n", "4 NaN NaN \n", "63827\n" ] } ], "source": [ "#Read the nodes\n", "node_csvfile = os.path.join(run_folder, 'GMNS_node.csv')\n", "df_taz = pd.read_csv(node_csvfile) #data already has headers\n", "print(df_taz.head()) #debugging\n", "df_size = df_taz.shape[0]\n", "print(df_size)\n", "#print(df_node.loc[700,\"node_type\"])" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " node_id name x_coord y_coord z_coord node_type ctrl_type \\\n", "0 1 NaN -84.416355 34.076861 NaN centroid no_control \n", "1 2 NaN -84.410110 34.067103 NaN centroid no_control \n", "2 3 NaN -84.398224 34.080752 NaN centroid no_control \n", "3 4 NaN -84.374950 34.077750 NaN centroid no_control \n", "4 5 NaN -84.364269 34.082443 NaN centroid no_control \n", "\n", " zone_id parent_node_id \n", "0 NaN NaN \n", "1 NaN NaN \n", "2 NaN NaN \n", "3 NaN NaN \n", "4 NaN NaN \n", "6031\n" ] } ], "source": [ "# drop the non centroids\n", "index = df_taz[df_taz['node_type'] != 'centroid'].index\n", "df_taz.drop(index, inplace=True)\n", "print(df_taz.head()) #debugging\n", "df_size = df_taz.shape[0]\n", "print(df_size)" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "6031\n", "6031\n" ] } ], "source": [ "# Set up the dictionary of centroids\n", "# Assumption: the node_type = 'centroid' for centroid nodes\n", "# The centroid nodes are the lowest numbered nodes, at the beginning of the list of nodes,\n", "# but node numbers need not be consecutive\n", "tazdictrow = {}\n", "for index in df_taz.index:\n", " if df_taz['node_type'][index]=='centroid':\n", " #DEBUG print(index, df_node['node_id'][index], df_node['node_type'][index])\n", " tazdictrow[df_taz['node_id'][index]]=index\n", "taz_list = list(tazdictrow.keys())\n", "matrix_size = len(tazdictrow) #Matches the number of nodes flagged as centroids\n", "print(matrix_size) #DEBUG\n", "highest_centroid_node_number = max(tazdictrow, key=tazdictrow.get) #for future use\n", "print(highest_centroid_node_number) #DEBUG" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "sum of trips 1827526.0\n", "SP BASE SKIM FILE Shape: (6031, 6031) Tables: ['distance', 'free_flow_time'] Mappings: ['main_index']\n" ] } ], "source": [ "# Read the trip table and skim\n", "dembf = omx.open_file(join(run_folder, '0_tntp_data' ,'demand.omx'),'r')\n", "input_demand = np.array(dembf['matrix'])\n", "print('sum of trips',np.sum(input_demand))\n", "\n", "spbf = omx.open_file(join(run_folder, '2_skim_results','sp_skim.omx'),'r')\n", "print('SP BASE SKIM FILE Shape:',spbf.shape(),' Tables:',spbf.list_matrices(),' Mappings:',spbf.list_mappings())\n", "spbt = spbf['free_flow_time']\n", "spbd = spbf['distance']\n", "sp_dist = np.array(spbd)\n", "\n", "outdebugfile = open(os.path.join(run_folder,'debug_demand2.txt'),\"w\")\n" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [], "source": [ "for i in range(100): #matrix_size)\n", " for j in range(matrix_size):\n", " if(input_demand[i][j]>0):\n", " lon1 = df_taz.loc[i,'x_coord']\n", " lat1 = df_taz.loc[i,'y_coord']\n", " lon2 = df_taz.loc[j,'x_coord']\n", " lat2 = df_taz.loc[j,'y_coord']\n", " sp_distance = sp_dist[i][j]\n", " sl_distance = sl_dist(lat1,lon1,lat2,lon2)\n", " print(i,j,lat1, lon1, lat2, lon2,sp_distance,sl_distance,file=outdebugfile)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [], "source": [ "outdebugfile.close()\n", "dembf.close()\n", "spbf.close()" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.5" } }, "nbformat": 4, "nbformat_minor": 4 }