diff --git a/docs/notebooks/open_street_maps_example.ipynb b/docs/notebooks/open_street_maps_example.ipynb index 02c62400..582413a9 100644 --- a/docs/notebooks/open_street_maps_example.ipynb +++ b/docs/notebooks/open_street_maps_example.ipynb @@ -20,14 +20,15 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 21, "id": "debe13e9-b483-496f-8e79-d99e93484fcf", "metadata": {}, "outputs": [], "source": [ "import osmnx as ox\n", "from nrel.routee.compass.io import generate_compass_dataset\n", - "from nrel.routee.compass import CompassApp" + "from nrel.routee.compass import CompassApp\n", + "import json" ] }, { @@ -72,7 +73,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "id": "2a99e267-0ba5-462f-83e4-e8428701597c", "metadata": {}, "outputs": [], @@ -98,7 +99,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "id": "edad6c15-c641-4010-b097-7d07aa86c1e7", "metadata": {}, "outputs": [ @@ -106,6 +107,9 @@ "name": "stdout", "output_type": "stream", "text": [ + "\n", + "\n", + "\n", "\n" ] }, @@ -113,16 +117,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "uuid file: 100%|██████████| 746/746 [00:00<00:00, 4943507.50it/s]it/s]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "\n", - "\n" + "uuid file: 100%|██████████| 746/746 [00:00<00:00, 2224495.00it/s]it/s]" ] } ], @@ -147,7 +142,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 13, "id": "f01086d0-231f-4013-bc24-97f9c56670bd", "metadata": {}, "outputs": [], @@ -164,7 +159,6 @@ " \"state_variable_coefficients\": {\n", " \"distance\": 0.0,\n", " \"time\": 1.0,\n", - " \"energy_electric\": 0.0,\n", " \"energy_liquid\": 0.0,\n", " },\n", " },\n", @@ -180,7 +174,6 @@ " \"distance\": 0.0,\n", " \"time\": 0.0,\n", " \"energy_liquid\": 1.0,\n", - " \"energy_electric\": 0.0,\n", " },\n", "\n", " }\n", @@ -202,7 +195,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 14, "id": "c6e9361b-5ffd-4ec5-a09a-d51e46752ebf", "metadata": {}, "outputs": [ @@ -217,7 +210,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "search: 100%|██████████| 2/2 [00:00<00:00, 446.86it/s]5.07it/s]" + "search: 100%|██████████| 2/2 [00:00<00:00, 448.75it/s]2.20it/s]" ] } ], @@ -238,23 +231,16 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "id": "2c51774c-acff-4569-a820-4be5ba5aa51b", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "len(results)" + "assert len(results), f\"expected 2 results, found {len(results)}\"\n", + "for r in results:\n", + " error = r.get(\"error\")\n", + " if error is not None:\n", + " print(f\"request {r['request']['name']} had error: {error}\")" ] }, { @@ -262,146 +248,194 @@ "id": "0b84c836-32b3-46d3-8a1f-a3f9511b1fd2", "metadata": {}, "source": [ - "### Summary\n", + "### Traversal and Cost Summaries\n", "\n", "Since we have the `traversal` output plugin activated by default, we can take a look at the summary for each result under the `traversal_summary` key." ] }, { "cell_type": "code", - "execution_count": 20, - "id": "d075cb16-b0ae-463a-a2ce-f94042bc13db", + "execution_count": 53, + "id": "1825ee52", "metadata": {}, "outputs": [], "source": [ - "shortest_time_result = results[0]" + "def pretty_print(dict):\n", + " print(json.dumps(dict, indent=4))\n", + "shortest_time_result = results[0]\n", + "least_energy_result = results[1]" + ] + }, + { + "cell_type": "markdown", + "id": "18b50d4e", + "metadata": {}, + "source": [ + "Summary of route result for distance, time, and energy:" ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 76, "id": "961c910c-63ec-4c79-9522-19f24f151215", "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "{'distance': 4.23738036063421,\n", - " 'distance_unit': 'miles',\n", - " 'time': 8.785261059653152,\n", - " 'time_unit': 'minutes',\n", - " 'vehicle': {'energy_liquid': 0.17380614026267308},\n", - " 'vehicle_info': {'energy_unit': 'gallons_gasoline'}}" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " \"distance\": 4.23738036063421,\n", + " \"distance_unit\": \"miles\",\n", + " \"energy_liquid\": 1.7531906338670376,\n", + " \"time\": 8.486183959367098,\n", + " \"time_unit\": \"minutes\",\n", + " \"vehicle_info\": {\n", + " \"energy_unit\": \"gallons_gasoline\"\n", + " }\n", + "}\n" + ] } ], "source": [ - "shortest_time_result[\"traversal_summary\"]" + "\n", + "pretty_print(shortest_time_result[\"traversal_summary\"])" + ] + }, + { + "cell_type": "markdown", + "id": "22141c5e", + "metadata": {}, + "source": [ + "The cost summary shows the costs per unit assigned to the trip, in dollars.\n", + "\n", + "This is based on the user assumptions assigned in the configuration which can be overriden in the route request query." ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 78, "id": "d4501094", "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "{'cost': {'distance': 4.23738036063421,\n", - " 'energy_liquid': 0.17380614026267308,\n", - " 'time': 8.785261059653152,\n", - " 'total_cost': 13.196447560550036},\n", - " 'info': {'cost_aggregation': 'sum',\n", - " 'network_state_variable_rates': {},\n", - " 'state_variable_coefficients': {'distance': 0.0,\n", - " 'energy_electric': 0.0,\n", - " 'energy_liquid': 0.0,\n", - " 'time': 1.0},\n", - " 'state_variable_indices': [['distance', 0],\n", - " ['time', 1],\n", - " ['energy_liquid', 2]],\n", - " 'vehicle_state_variable_rates': {'distance': {'type': 'raw'},\n", - " 'energy_electric': {'type': 'raw'},\n", - " 'energy_liquid': {'type': 'raw'},\n", - " 'time': {'type': 'raw'}}}}" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " \"distance\": 2.775484136215408,\n", + " \"energy_liquid\": 5.469954777665158,\n", + " \"time\": 2.8287506162795912,\n", + " \"total_cost\": 11.074189530160158\n", + "}\n" + ] } ], "source": [ - "shortest_time_result[\"cost_summary\"]" + "pretty_print(shortest_time_result[\"cost_summary\"][\"cost\"])" + ] + }, + { + "cell_type": "markdown", + "id": "ee8ad015", + "metadata": {}, + "source": [ + "The info section includes details for how these costs were calculated. \n", + "\n", + "The user can set different state variable coefficients in the query that are weighted against the vehicle state variable rates.\n", + "\n", + "The algorithm will rely on the weighted costs while the cost summary will show the final costs without weight coefficients applied." ] }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, + "id": "788183c8", + "metadata": {}, + "outputs": [], + "source": [ + "shortest_time_result[\"cost_summary\"][\"info\"]" + ] + }, + { + "cell_type": "markdown", + "id": "a6a7fc0e", + "metadata": {}, + "source": [ + "Each response object contains this information. The least energy traversal and cost summary are below." + ] + }, + { + "cell_type": "code", + "execution_count": 79, "id": "e2c6cb39-49aa-4697-9785-fa839dc16a86", "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "{'distance': 4.030024238811498,\n", - " 'distance_unit': 'miles',\n", - " 'time': 8.91354619252557,\n", - " 'time_unit': 'minutes',\n", - " 'vehicle': {'energy_liquid': 0.16346916092866665},\n", - " 'vehicle_info': {'energy_unit': 'gallons_gasoline'}}" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "{\n", + " \"distance\": 4.020870727313324,\n", + " \"distance_unit\": \"miles\",\n", + " \"energy_liquid\": 1.7423185323233328,\n", + " \"time\": 8.587012115596758,\n", + " \"time_unit\": \"minutes\",\n", + " \"vehicle_info\": {\n", + " \"energy_unit\": \"gallons_gasoline\"\n", + " }\n", + "}\n", + "{\n", + " \"distance\": 2.6336703263902272,\n", + " \"energy_liquid\": 5.436033820848799,\n", + " \"time\": 2.862360270564561,\n", + " \"total_cost\": 10.932064417803588\n", + "}\n" + ] } ], "source": [ - "least_energy_result = results[1]\n", - "least_energy_result[\"traversal_summary\"]" + "pretty_print(least_energy_result[\"traversal_summary\"])\n", + "pretty_print(least_energy_result[\"cost_summary\"][\"cost\"])" + ] + }, + { + "cell_type": "markdown", + "id": "73127486", + "metadata": {}, + "source": [ + "What becomes interesting is if we can compare our choices. Here's a quick comparison of the two:" ] }, { "cell_type": "code", - "execution_count": 24, - "id": "4e9640e5", + "execution_count": 82, + "id": "6283c273", "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "{'cost': {'distance': 4.030024238811498,\n", - " 'energy_liquid': 0.16346916092866665,\n", - " 'time': 8.91354619252557,\n", - " 'total_cost': 13.107039592265735},\n", - " 'info': {'cost_aggregation': 'sum',\n", - " 'network_state_variable_rates': {},\n", - " 'state_variable_coefficients': {'distance': 0.0,\n", - " 'energy_electric': 0.0,\n", - " 'energy_liquid': 1.0,\n", - " 'time': 0.0},\n", - " 'state_variable_indices': [['distance', 0],\n", - " ['time', 1],\n", - " ['energy_liquid', 2]],\n", - " 'vehicle_state_variable_rates': {'distance': {'type': 'raw'},\n", - " 'energy_electric': {'type': 'raw'},\n", - " 'energy_liquid': {'type': 'raw'},\n", - " 'time': {'type': 'raw'}}}}" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + " - distance: 0.22 miles further with energy-optimal\n", + " - time: 0.22 minutes longer with energy-optimal\n", + " - energy: 0.01 gallons_gasoline more with time-optimal\n", + " - cost: $0.14 more with energy-optimal\n" + ] } ], "source": [ - "least_energy_result[\"cost_summary\"]" + "dist_diff = shortest_time_result[\"traversal_summary\"][\"distance\"] - least_energy_result[\"traversal_summary\"][\"distance\"]\n", + "time_diff = shortest_time_result[\"traversal_summary\"][\"time\"] - least_energy_result[\"traversal_summary\"][\"time\"]\n", + "enrg_diff = shortest_time_result[\"traversal_summary\"][\"energy_liquid\"] - least_energy_result[\"traversal_summary\"][\"energy_liquid\"]\n", + "cost_diff = shortest_time_result[\"cost_summary\"][\"cost\"][\"total_cost\"] - least_energy_result[\"cost_summary\"][\"cost\"][\"total_cost\"]\n", + "dist_unit = shortest_time_result[\"traversal_summary\"][\"distance_unit\"]\n", + "time_unit = shortest_time_result[\"traversal_summary\"][\"time_unit\"]\n", + "enrg_unit = shortest_time_result[\"traversal_summary\"][\"vehicle_info\"][\"energy_unit\"]\n", + "print(f\" - distance: {dist_diff:.2f} {dist_unit} further with energy-optimal\")\n", + "print(f\" - time: {dist_diff:.2f} {time_unit} longer with energy-optimal\")\n", + "print(f\" - energy: {enrg_diff:.2f} {enrg_unit} more with time-optimal\")\n", + "print(f\" - cost: ${cost_diff:.2f} more with energy-optimal\")" ] }, { @@ -415,23 +449,73 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 71, "id": "791e814f-333c-43f4-ae84-36b9be517548", "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "dict_keys(['cost', 'cost_summary', 'request', 'route', 'route_edge_count', 'search_executed_time', 'search_runtime', 'total_runtime', 'traversal_summary', 'tree_edge_count'])" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + " - algorithm_runtime\n", + " - basic_summary_runtime\n", + " - cost_summary\n", + " - cost\n", + " - distance\n", + " - energy_liquid\n", + " - time\n", + " - total_cost\n", + " - info\n", + " - cost_aggregation\n", + " - network_state_variable_rates\n", + " - state_variable_coefficients\n", + " - state_variable_indices\n", + " - vehicle_state_variable_rates\n", + " - destination_vertex_uuid\n", + " - iterations\n", + " - origin_vertex_uuid\n", + " - output_plugin_executed_time\n", + " - request\n", + " - destination_name\n", + " - destination_vertex\n", + " - destination_x\n", + " - destination_y\n", + " - model_name\n", + " - origin_name\n", + " - origin_vertex\n", + " - origin_x\n", + " - origin_y\n", + " - query_weight_estimate\n", + " - state_variable_coefficients\n", + " - distance\n", + " - energy_liquid\n", + " - time\n", + " - result_memory_usage_bytes\n", + " - route\n", + " - features\n", + " - type\n", + " - route_edge_count\n", + " - search_app_runtime\n", + " - search_executed_time\n", + " - traversal_summary\n", + " - distance\n", + " - distance_unit\n", + " - energy_liquid\n", + " - time\n", + " - time_unit\n", + " - vehicle_info\n", + " - energy_unit\n", + " - tree_edge_count\n" + ] } ], "source": [ - "least_energy_result.keys()" + "def print_keys(d, indent=0):\n", + " for k in sorted(d.keys()):\n", + " print(f\"{' '*indent} - {k}\")\n", + " if isinstance(d[k], dict):\n", + " print_keys(d[k], indent+2)\n", + "print_keys(least_energy_result)" ] }, { @@ -446,7 +530,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 72, "id": "30257102-07ee-4338-9c8c-41676e1995ed", "metadata": {}, "outputs": [], @@ -464,7 +548,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 73, "id": "1ac13aae-32fc-4c10-b888-6373b175655a", "metadata": {}, "outputs": [ @@ -498,7 +582,7 @@ " <meta name="viewport" content="width=device-width,\n", " initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />\n", " <style>\n", - " #map_2e1ee1c86769660429380c2223d90df1 {\n", + " #map_0acdbf3d52f2feea8da8d9c090017b46 {\n", " position: relative;\n", " width: 100.0%;\n", " height: 100.0%;\n", @@ -512,16 +596,16 @@ "<body>\n", " \n", " \n", - " <div class="folium-map" id="map_2e1ee1c86769660429380c2223d90df1" ></div>\n", + " <div class="folium-map" id="map_0acdbf3d52f2feea8da8d9c090017b46" ></div>\n", " \n", "</body>\n", "<script>\n", " \n", " \n", - " var map_2e1ee1c86769660429380c2223d90df1 = L.map(\n", - " "map_2e1ee1c86769660429380c2223d90df1",\n", + " var map_0acdbf3d52f2feea8da8d9c090017b46 = L.map(\n", + " "map_0acdbf3d52f2feea8da8d9c090017b46",\n", " {\n", - " center: [39.7465774, -105.2216276],\n", + " center: [39.746578216552734, -105.22162628173828],\n", " crs: L.CRS.EPSG3857,\n", " zoom: 12,\n", " zoomControl: true,\n", @@ -533,19 +617,19 @@ "\n", " \n", " \n", - " var tile_layer_58e92c7da83cf630ef011a57a1913c24 = L.tileLayer(\n", + " var tile_layer_84981b8aca063435dd126133ffa6ddaf = L.tileLayer(\n", " "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",\n", " {"attribution": "Data by \\u0026copy; \\u003ca target=\\"_blank\\" href=\\"http://openstreetmap.org\\"\\u003eOpenStreetMap\\u003c/a\\u003e, under \\u003ca target=\\"_blank\\" href=\\"http://www.openstreetmap.org/copyright\\"\\u003eODbL\\u003c/a\\u003e.", "detectRetina": false, "maxNativeZoom": 18, "maxZoom": 18, "minZoom": 0, "noWrap": false, "opacity": 1, "subdomains": "abc", "tms": false}\n", - " ).addTo(map_2e1ee1c86769660429380c2223d90df1);\n", + " ).addTo(map_0acdbf3d52f2feea8da8d9c090017b46);\n", " \n", " \n", - " var poly_line_857a0fd77a781a4a9685f8bed4291ac5 = L.polyline(\n", - " [[39.7273069, -105.1994169], [39.7272989, -105.1994535], [39.7272848, -105.1994868], [39.7272593, -105.1995218], [39.7272272, -105.1995461], [39.7271912, -105.1995576], [39.7271688, -105.199558], [39.7271461, -105.1995532], [39.7271142, -105.1995365], [39.7270868, -105.1995096], [39.7270657, -105.1994741], [39.7270519, -105.1994296], [39.7270483, -105.1993816], [39.727052, -105.1993539], [39.7270571, -105.1993247], [39.7270719, -105.1992916], [39.7270973, -105.1992566], [39.7271293, -105.1992323], [39.7271651, -105.1992207], [39.7271854, -105.1992226], [39.7272113, -105.199227], [39.7273496, -105.1991687], [39.7274185, -105.1991465], [39.7275326, -105.1990928], [39.7276828, -105.1990602], [39.7277455, -105.1990518], [39.7279702, -105.1990232], [39.7281558, -105.1990357], [39.7284384, -105.1990893], [39.7286639, -105.199177], [39.7288222, -105.1992773], [39.7289214, -105.199385], [39.7290292, -105.1995543], [39.7290506, -105.1995879], [39.7292157, -105.1998155], [39.7293094, -105.1998945], [39.7294079, -105.1999604], [39.7295437, -105.200014], [39.7296299, -105.2000721], [39.7297292, -105.2000757], [39.7297135, -105.2007081], [39.7297192, -105.2013106], [39.7298153, -105.2032041], [39.7298256, -105.2033784], [39.7298664, -105.2035708], [39.7298795, -105.203649], [39.7299267, -105.2038558], [39.7301082, -105.2042608], [39.7304911, -105.2048068], [39.7308741, -105.2053111], [39.7310676, -105.2055985], [39.7311933, -105.205824], [39.7312069, -105.2058543], [39.7313075, -105.2061158], [39.731348, -105.206248], [39.731386, -105.2064213], [39.7314237, -105.2067336], [39.731429, -105.2070565], [39.7314226, -105.207224], [39.7314076, -105.2074036], [39.7313611, -105.2077675], [39.7313265, -105.2079124], [39.7312831, -105.20806], [39.7312292, -105.2082086], [39.7311706, -105.208344], [39.7310965, -105.2084777], [39.7310049, -105.208616], [39.7309234, -105.2087235], [39.7308212, -105.2088303], [39.7306227, -105.2089819], [39.7304801, -105.2090736], [39.7303681, -105.2091988], [39.7303327, -105.2092597], [39.7303114, -105.2093181], [39.730299, -105.20939], [39.7302939, -105.2095126], [39.7303105, -105.2096804], [39.7304414, -105.2099267], [39.7305001, -105.2100344], [39.7305871, -105.2101842], [39.7307404, -105.2104481], [39.7309234, -105.2107229], [39.7310934, -105.2109639], [39.731238, -105.211145], [39.7314101, -105.2113464], [39.7315783, -105.2115336], [39.7317541, -105.2117064], [39.7319796, -105.2119089], [39.732359, -105.2122393], [39.7329187, -105.2127184], [39.7334557, -105.213188], [39.7338968, -105.2135676], [39.7342777, -105.2138968], [39.7347139, -105.2142786], [39.7354652, -105.2149301], [39.7356319, -105.2150733], [39.7358844, -105.2152902], [39.7363901, -105.2157275], [39.7369129, -105.2161859], [39.7377243, -105.2168831], [39.7390882, -105.2180682], [39.7397882, -105.2186718], [39.7403043, -105.2191078], [39.7405645, -105.2193336], [39.7406767, -105.2194225], [39.7415803, -105.2202142], [39.7416486, -105.2202727], [39.7417047, -105.2203151], [39.7421502, -105.2206932], [39.7425816, -105.221062], [39.7432687, -105.2215398], [39.7435797, -105.2217631], [39.7436721, -105.2218299], [39.7437366, -105.2218764], [39.7438794, -105.2219759], [39.7439546, -105.2220253], [39.7440082, -105.2220586], [39.7440819, -105.2221021], [39.7441377, -105.2221322], [39.7441808, -105.2221541], [39.7442796, -105.2222043], [39.7443357, -105.2222286], [39.7444062, -105.222259], [39.7444657, -105.2222871], [39.7444962, -105.2223029], [39.7445695, -105.2223431], [39.7446343, -105.2223808], [39.744683, -105.2224104], [39.7447215, -105.2224349], [39.7447658, -105.2224654], [39.744813, -105.222499], [39.7448547, -105.2225315], [39.7448881, -105.2225586], [39.7449328, -105.2225965], [39.7449815, -105.2226391], [39.7451542, -105.2227925], [39.7454784, -105.2230438], [39.7455034, -105.2230623], [39.7455159, -105.2230713], [39.7455403, -105.2230861], [39.7455548, -105.2230941], [39.7455766, -105.2231014], [39.7456018, -105.223106], [39.7456176, -105.2231071], [39.7456337, -105.223107], [39.7456638, -105.2231045], [39.7456814, -105.2231011], [39.7456983, -105.2230945], [39.7457224, -105.2230821], [39.7457338, -105.2230745], [39.7457588, -105.2230543], [39.7457709, -105.223043], [39.7457834, -105.2230284], [39.7458035, -105.2230027], [39.7458905, -105.2228787], [39.7460068, -105.2226624], [39.7461589, -105.2223894], [39.7463617, -105.2220126], [39.7464427, -105.2218672], [39.746482, -105.2217968], [39.7465202, -105.2217322], [39.7465523, -105.2216771], [39.7465774, -105.2216276], [39.7465928, -105.2215823], [39.7466004, -105.2215466], [39.7466042, -105.2215101], [39.7466044, -105.2214695], [39.746601, -105.2214368], [39.7465881, -105.2213862], [39.7465804, -105.2213567], [39.7465774, -105.2213321], [39.7465774, -105.2213048], [39.746581, -105.2212762], [39.7465874, -105.2212518], [39.7465978, -105.2212266], [39.7466125, -105.2212024], [39.7466266, -105.2211858], [39.7466485, -105.2211678], [39.7466708, -105.2211566], [39.746693, -105.2211511], [39.746715, -105.2211506], [39.7467203, -105.2211517], [39.7467798, -105.2211327], [39.7468101, -105.2211204], [39.7468347, -105.2211032], [39.7468673, -105.2210676], [39.7468863, -105.2210389], [39.7469079, -105.2209995], [39.7469752, -105.2208699], [39.7471073, -105.220655], [39.7471371, -105.2206129], [39.7471594, -105.2205845], [39.7472061, -105.2205376], [39.7473376, -105.2202962], [39.747357, -105.2202177], [39.7473682, -105.2201868], [39.7473848, -105.2201519], [39.7475089, -105.2199249], [39.7475861, -105.2197973], [39.7476254, -105.2197401], [39.7476917, -105.2196525], [39.7477724, -105.2195069], [39.7478875, -105.219299], [39.7479219, -105.2192372], [39.7479518, -105.219179], [39.7480957, -105.2189201], [39.7481337, -105.2188515], [39.7482567, -105.2186294], [39.7484851, -105.2182271], [39.7485167, -105.218164], [39.7485605, -105.2180881], [39.7490516, -105.217166], [39.7490955, -105.2170866], [39.7491263, -105.2170387], [39.7493736, -105.2165801], [39.7496841, -105.2160128], [39.7497482, -105.2160733], [39.7504593, -105.216753], [39.7505084, -105.2168007], [39.7505733, -105.2168567], [39.7509525, -105.2172063], [39.7512593, -105.2174884], [39.7513304, -105.2175506], [39.7513869, -105.217604], [39.7517458, -105.2179367], [39.7520945, -105.21826], [39.7521462, -105.2183047], [39.7522126, -105.218369], [39.7523012, -105.2184523], [39.7525052, -105.218642], [39.7527145, -105.2188366], [39.7528959, -105.2189993], [39.7529601, -105.2190649], [39.7530308, -105.219128], [39.7537033, -105.2197718], [39.753764, -105.2198302], [39.7538299, -105.2198915], [39.7542346, -105.2202638], [39.7545279, -105.2205433], [39.7545847, -105.2206031], [39.7546623, -105.2206728], [39.7553326, -105.2212752], [39.755407, -105.221342], [39.7554908, -105.2214211], [39.7561483, -105.2220415], [39.7562254, -105.2221143], [39.7563006, -105.2221853], [39.7566193, -105.222483], [39.7566315, -105.2224957], [39.7569475, -105.2227913], [39.7570561, -105.222895], [39.7574792, -105.2232693], [39.7575579, -105.2233409], [39.7576236, -105.2234019], [39.7578565, -105.2236199], [39.7579703, -105.2237258], [39.7580027, -105.2237561], [39.7583001, -105.2240544], [39.7583591, -105.2241084], [39.7587249, -105.2244446], [39.7588057, -105.22452], [39.7591609, -105.2248516], [39.7595089, -105.2251741], [39.7596887, -105.2253408], [39.7597554, -105.2254024], [39.7598802, -105.2255173], [39.7598939, -105.2255305], [39.7599658, -105.2255988], [39.7600186, -105.2256498], [39.7604008, -105.2259941], [39.7605066, -105.2260931], [39.7605924, -105.226174], [39.760667, -105.2262427], [39.7607946, -105.2263631], [39.7608753, -105.2264373], [39.7615829, -105.2271044], [39.7616266, -105.2271481], [39.7616788, -105.2272008], [39.762203, -105.2276943], [39.7623411, -105.2278299], [39.7630405, -105.2284565], [39.7632824, -105.2286685], [39.7637358, -105.2290679], [39.7640137, -105.229309], [39.7640954, -105.229381], [39.7641743, -105.229462], [39.76436, -105.2296495], [39.7645376, -105.2298658], [39.764824, -105.2301918], [39.7652051, -105.2307044], [39.7654711, -105.2310802], [39.7654801, -105.2310934], [39.7655308, -105.231168], [39.7655792, -105.231232], [39.7655918, -105.2312486], [39.7657719, -105.2315035], [39.7658973, -105.2316751], [39.7659962, -105.2318039], [39.7661018, -105.231924], [39.7662469, -105.2320614], [39.7664515, -105.2322588], [39.7671442, -105.2329283], [39.7673559, -105.2331244], [39.7674414, -105.2332053], [39.7675186, -105.2332845], [39.7675756, -105.2333522], [39.7676291, -105.2334243], [39.7676969, -105.2335369], [39.7677304, -105.233602], [39.767761, -105.2336649], [39.7677908, -105.233739], [39.7678172, -105.233812], [39.7678551, -105.2339422], [39.7678736, -105.2340294], [39.7678904, -105.2341257], [39.7679032, -105.2342329], [39.7679095, -105.2343359], [39.7679068, -105.2344027], [39.7679029, -105.234499], [39.7678875, -105.2346626], [39.7678651, -105.2347791], [39.7678384, -105.2348898], [39.7678006, -105.2350283], [39.7677517, -105.2352031], [39.7677119, -105.2353468]],\n", + " var poly_line_56444389304f678040510dd57ea563ed = L.polyline(\n", + " [[39.7273063659668, -105.19941711425781], [39.727298736572266, -105.19945526123047], [39.7272834777832, -105.1994857788086], [39.72726058959961, -105.19952392578125], [39.72722625732422, -105.19954681396484], [39.72719192504883, -105.19955444335938], [39.727169036865234, -105.19955444335938], [39.72714614868164, -105.19955444335938], [39.727115631103516, -105.19953918457031], [39.72708511352539, -105.19950866699219], [39.72706604003906, -105.19947052001953], [39.72705078125, -105.19943237304688], [39.727046966552734, -105.19937896728516], [39.72705078125, -105.19935607910156], [39.72705841064453, -105.19932556152344], [39.727073669433594, -105.19929504394531], [39.72709655761719, -105.19925689697266], [39.72713088989258, -105.19923400878906], [39.72716522216797, -105.19921875], [39.7271842956543, -105.19922637939453], [39.727210998535156, -105.19922637939453], [39.72734832763672, -105.19916534423828], [39.7274169921875, -105.19915008544922], [39.72753143310547, -105.19908905029297], [39.727684020996094, -105.19905853271484], [39.727745056152344, -105.19905090332031], [39.727970123291016, -105.19902038574219], [39.72815704345703, -105.19903564453125], [39.72843933105469, -105.19908905029297], [39.72866439819336, -105.19918060302734], [39.72882080078125, -105.19927978515625], [39.728919982910156, -105.19938659667969], [39.72903060913086, -105.19955444335938], [39.72904968261719, -105.1995849609375], [39.729217529296875, -105.19981384277344], [39.72930908203125, -105.19989776611328], [39.729408264160156, -105.19995880126953], [39.72954559326172, -105.20001220703125], [39.72962951660156, -105.2000732421875], [39.72972869873047, -105.2000732421875], [39.729713439941406, -105.2007064819336], [39.72972106933594, -105.20130920410156], [39.72981643676758, -105.20320129394531], [39.72982406616211, -105.20337677001953], [39.72986602783203, -105.20356750488281], [39.729881286621094, -105.20365142822266], [39.72992706298828, -105.203857421875], [39.730106353759766, -105.20426177978516], [39.730491638183594, -105.20480346679688], [39.730873107910156, -105.20531463623047], [39.7310676574707, -105.20559692382812], [39.73119354248047, -105.20582580566406], [39.73120880126953, -105.20585632324219], [39.73130798339844, -105.20611572265625], [39.731346130371094, -105.20624542236328], [39.73138427734375, -105.2064208984375], [39.731422424316406, -105.20673370361328], [39.73143005371094, -105.2070541381836], [39.731422424316406, -105.20722198486328], [39.731407165527344, -105.20740509033203], [39.731361389160156, -105.20777130126953], [39.731327056884766, -105.2079086303711], [39.73128128051758, -105.20806121826172], [39.73122787475586, -105.20820617675781], [39.731170654296875, -105.20834350585938], [39.73109817504883, -105.20848083496094], [39.73100662231445, -105.2086181640625], [39.73092269897461, -105.20872497558594], [39.73081970214844, -105.20883178710938], [39.730621337890625, -105.208984375], [39.7304801940918, -105.20907592773438], [39.730369567871094, -105.20919799804688], [39.73033142089844, -105.20925903320312], [39.73031234741211, -105.20932006835938], [39.73030090332031, -105.20938873291016], [39.73029327392578, -105.20951080322266], [39.73031234741211, -105.20967864990234], [39.73044204711914, -105.20993041992188], [39.730499267578125, -105.21003723144531], [39.730587005615234, -105.2101821899414], [39.73073959350586, -105.21044921875], [39.73092269897461, -105.21072387695312], [39.73109436035156, -105.2109603881836], [39.731239318847656, -105.21114349365234], [39.73141098022461, -105.21134948730469], [39.7315788269043, -105.21153259277344], [39.731754302978516, -105.21170806884766], [39.73197937011719, -105.21190643310547], [39.73236083984375, -105.21224212646484], [39.73291778564453, -105.21271514892578], [39.733455657958984, -105.21318817138672], [39.7338981628418, -105.21356964111328], [39.734275817871094, -105.21389770507812], [39.73471450805664, -105.21427917480469], [39.73546600341797, -105.21492767333984], [39.73563003540039, -105.21507263183594], [39.73588562011719, -105.21529388427734], [39.73638916015625, -105.21572875976562], [39.73691177368164, -105.2161865234375], [39.73772430419922, -105.21688079833984], [39.73908996582031, -105.21807098388672], [39.73978805541992, -105.21867370605469], [39.74030303955078, -105.21910858154297], [39.74056625366211, -105.21932983398438], [39.74067687988281, -105.21942138671875], [39.741580963134766, -105.22021484375], [39.74164962768555, -105.22027587890625], [39.741703033447266, -105.2203140258789], [39.742149353027344, -105.22069549560547], [39.74258041381836, -105.22106170654297], [39.74326705932617, -105.22154235839844], [39.74357986450195, -105.22176361083984], [39.74367141723633, -105.22183227539062], [39.743736267089844, -105.22187805175781], [39.74388122558594, -105.22197723388672], [39.743953704833984, -105.2220230102539], [39.7440071105957, -105.22206115722656], [39.744083404541016, -105.22209930419922], [39.744136810302734, -105.22212982177734], [39.74418258666992, -105.22215270996094], [39.74427795410156, -105.22220611572266], [39.74433517456055, -105.22222900390625], [39.744407653808594, -105.22225952148438], [39.74446487426758, -105.2222900390625], [39.7444953918457, -105.22230529785156], [39.74456787109375, -105.22234344482422], [39.744632720947266, -105.22238159179688], [39.74468231201172, -105.222412109375], [39.744720458984375, -105.2224349975586], [39.74476623535156, -105.22246551513672], [39.74481201171875, -105.22249603271484], [39.74485397338867, -105.2225341796875], [39.74488830566406, -105.2225570678711], [39.74493408203125, -105.22259521484375], [39.74497985839844, -105.22264099121094], [39.745155334472656, -105.22279357910156], [39.745479583740234, -105.2230453491211], [39.74550247192383, -105.22306060791016], [39.74551773071289, -105.22306823730469], [39.745540618896484, -105.22308349609375], [39.74555587768555, -105.22309112548828], [39.745574951171875, -105.22309875488281], [39.745601654052734, -105.22310638427734], [39.7456169128418, -105.22310638427734], [39.74563217163086, -105.22310638427734], [39.745662689208984, -105.22310638427734], [39.74568176269531, -105.22309875488281], [39.745697021484375, -105.22309112548828], [39.745723724365234, -105.22308349609375], [39.74573516845703, -105.22307586669922], [39.745758056640625, -105.22305297851562], [39.74576950073242, -105.2230453491211], [39.745784759521484, -105.22303009033203], [39.74580383300781, -105.2229995727539], [39.74589157104492, -105.2228775024414], [39.74600601196289, -105.22266387939453], [39.746158599853516, -105.2223892211914], [39.746360778808594, -105.22201538085938], [39.74644088745117, -105.22187042236328], [39.746482849121094, -105.22179412841797], [39.74652099609375, -105.22173309326172], [39.746551513671875, -105.2216796875], [39.746578216552734, -105.22162628173828], [39.7465934753418, -105.2215805053711], [39.74660110473633, -105.22154998779297], [39.746604919433594, -105.22151184082031], [39.746604919433594, -105.22146606445312], [39.74660110473633, -105.221435546875], [39.74658966064453, -105.22138977050781], [39.74658203125, -105.22135925292969], [39.746578216552734, -105.22132873535156], [39.746578216552734, -105.22130584716797], [39.74658203125, -105.22127532958984], [39.746585845947266, -105.22125244140625], [39.74659729003906, -105.22122955322266], [39.746612548828125, -105.22119903564453], [39.74662780761719, -105.22118377685547], [39.746646881103516, -105.2211685180664], [39.74666976928711, -105.22115325927734], [39.7466926574707, -105.22115325927734], [39.7467155456543, -105.22115325927734], [39.74671936035156, -105.22115325927734], [39.74678039550781, -105.22113037109375], [39.74681091308594, -105.22112274169922], [39.74683380126953, -105.22109985351562], [39.74686813354492, -105.2210693359375], [39.74688720703125, -105.22103881835938], [39.74690628051758, -105.22100067138672], [39.74697494506836, -105.22087097167969], [39.747108459472656, -105.22065734863281], [39.74713897705078, -105.22061157226562], [39.74715805053711, -105.2205810546875], [39.74720764160156, -105.22053527832031], [39.747337341308594, -105.22029876708984], [39.74735641479492, -105.22021484375], [39.74736785888672, -105.22018432617188], [39.74738311767578, -105.22015380859375], [39.74750900268555, -105.21992492675781], [39.74758529663086, -105.21979522705078], [39.74762725830078, -105.21974182128906], [39.7476921081543, -105.21965026855469], [39.747772216796875, -105.2195053100586], [39.747886657714844, -105.21929931640625], [39.747920989990234, -105.21923828125], [39.74795150756836, -105.21917724609375], [39.74809646606445, -105.21891784667969], [39.74813461303711, -105.2188491821289], [39.74825668334961, -105.2186279296875], [39.74848556518555, -105.21822357177734], [39.74851608276367, -105.2181625366211], [39.74856185913086, -105.21808624267578], [39.74905014038086, -105.2171630859375], [39.74909591674805, -105.21708679199219], [39.74912643432617, -105.217041015625], [39.74937438964844, -105.21658325195312], [39.74968338012695, -105.21601104736328], [39.74974822998047, -105.21607208251953], [39.750457763671875, -105.21675109863281], [39.75050735473633, -105.21680450439453], [39.750572204589844, -105.21685791015625], [39.750953674316406, -105.21720886230469], [39.751258850097656, -105.21749114990234], [39.7513313293457, -105.2175521850586], [39.75138854980469, -105.21760559082031], [39.751747131347656, -105.21793365478516], [39.75209426879883, -105.21826171875], [39.75214767456055, -105.21830749511719], [39.75221252441406, -105.21836853027344], [39.75230026245117, -105.21845245361328], [39.752506256103516, -105.21864318847656], [39.752716064453125, -105.21883392333984], [39.75289535522461, -105.21900177001953], [39.752960205078125, -105.21906280517578], [39.75303268432617, -105.21913146972656], [39.75370407104492, -105.21977233886719], [39.75376510620117, -105.21983337402344], [39.75382995605469, -105.21989440917969], [39.754234313964844, -105.22026062011719], [39.7545280456543, -105.22054290771484], [39.75458526611328, -105.2206039428711], [39.754661560058594, -105.22067260742188], [39.755332946777344, -105.22127532958984], [39.75540542602539, -105.22134399414062], [39.755489349365234, -105.22142028808594], [39.75614929199219, -105.22203826904297], [39.7562255859375, -105.22211456298828], [39.75630187988281, -105.22218322753906], [39.75661849975586, -105.22248077392578], [39.756629943847656, -105.22249603271484], [39.7569465637207, -105.22279357910156], [39.757057189941406, -105.22289276123047], [39.75748062133789, -105.2232666015625], [39.7575569152832, -105.22334289550781], [39.75762176513672, -105.22340393066406], [39.75785827636719, -105.22361755371094], [39.75796890258789, -105.22372436523438], [39.75800323486328, -105.2237548828125], [39.75830078125, -105.22405242919922], [39.758358001708984, -105.22410583496094], [39.758724212646484, -105.22444152832031], [39.75880432128906, -105.22451782226562], [39.759159088134766, -105.224853515625], [39.7595100402832, -105.22517395019531], [39.75968933105469, -105.225341796875], [39.7597541809082, -105.22540283203125], [39.75988006591797, -105.22551727294922], [39.75989532470703, -105.22553253173828], [39.75996398925781, -105.22560119628906], [39.76001739501953, -105.22564697265625], [39.76040267944336, -105.22599029541016], [39.76050567626953, -105.22608947753906], [39.76059341430664, -105.2261734008789], [39.76066589355469, -105.22624206542969], [39.76079559326172, -105.22636413574219], [39.7608757019043, -105.2264404296875], [39.76158142089844, -105.22710418701172], [39.761627197265625, -105.2271499633789], [39.761680603027344, -105.22720336914062], [39.762203216552734, -105.22769165039062], [39.7623405456543, -105.22782897949219], [39.763038635253906, -105.22845458984375], [39.763282775878906, -105.22866821289062], [39.763736724853516, -105.22906494140625], [39.764015197753906, -105.22930908203125], [39.764095306396484, -105.22937774658203], [39.76417541503906, -105.22946166992188], [39.76435852050781, -105.22965240478516], [39.7645378112793, -105.22986602783203], [39.76482391357422, -105.23019409179688], [39.76520538330078, -105.23070526123047], [39.765472412109375, -105.2310791015625], [39.765480041503906, -105.23109436035156], [39.76552963256836, -105.23117065429688], [39.76557922363281, -105.23123168945312], [39.76559066772461, -105.23124694824219], [39.76577377319336, -105.23150634765625], [39.76589584350586, -105.23167419433594], [39.765995025634766, -105.23180389404297], [39.7661018371582, -105.23192596435547], [39.7662467956543, -105.23206329345703], [39.76645278930664, -105.23226165771484], [39.76714324951172, -105.23292541503906], [39.767356872558594, -105.23312377929688], [39.76744079589844, -105.23320770263672], [39.76751708984375, -105.23328399658203], [39.767574310302734, -105.23335266113281], [39.76762771606445, -105.2334213256836], [39.767696380615234, -105.23353576660156], [39.767730712890625, -105.23360443115234], [39.76776123046875, -105.2336654663086], [39.767791748046875, -105.2337417602539], [39.767818450927734, -105.23381042480469], [39.76785659790039, -105.23394012451172], [39.76787185668945, -105.2340316772461], [39.76789093017578, -105.23412322998047], [39.76790237426758, -105.2342300415039], [39.76791000366211, -105.23433685302734], [39.767906188964844, -105.23440551757812], [39.76790237426758, -105.2344970703125], [39.767887115478516, -105.23466491699219], [39.76786422729492, -105.23477935791016], [39.76783752441406, -105.2348861694336], [39.767799377441406, -105.23503112792969], [39.76775360107422, -105.2352066040039], [39.7677116394043, -105.23534393310547]],\n", " {"bubblingMouseEvents": true, "color": "blue", "dashArray": null, "dashOffset": null, "fill": false, "fillColor": "blue", "fillOpacity": 0.2, "fillRule": "evenodd", "lineCap": "round", "lineJoin": "round", "noClip": false, "opacity": 0.8, "smoothFactor": 1.0, "stroke": true, "weight": 10}\n", - " ).addTo(map_2e1ee1c86769660429380c2223d90df1);\n", + " ).addTo(map_0acdbf3d52f2feea8da8d9c090017b46);\n", " \n", " \n", - " poly_line_857a0fd77a781a4a9685f8bed4291ac5.bindTooltip(\n", + " poly_line_56444389304f678040510dd57ea563ed.bindTooltip(\n", " `<div>\n", " Shortest Time\n", " </div>`,\n", @@ -553,19 +637,19 @@ " );\n", " \n", " \n", - " var marker_eca779d68bd6fbf762d0c3da0f34a76a = L.marker(\n", - " [39.7273069, -105.1994169],\n", + " var marker_761a978a80e6a0a4058d8df9b8526637 = L.marker(\n", + " [39.7273063659668, -105.19941711425781],\n", " {}\n", - " ).addTo(map_2e1ee1c86769660429380c2223d90df1);\n", + " ).addTo(map_0acdbf3d52f2feea8da8d9c090017b46);\n", " \n", " \n", - " var icon_e21672aff784068b0005d6f3a7662b8d = L.AwesomeMarkers.icon(\n", + " var icon_f176f41455eaad741c8ad25a04c70d28 = L.AwesomeMarkers.icon(\n", " {"extraClasses": "fa-rotate-0", "icon": "circle", "iconColor": "white", "markerColor": "green", "prefix": "fa"}\n", " );\n", - " marker_eca779d68bd6fbf762d0c3da0f34a76a.setIcon(icon_e21672aff784068b0005d6f3a7662b8d);\n", + " marker_761a978a80e6a0a4058d8df9b8526637.setIcon(icon_f176f41455eaad741c8ad25a04c70d28);\n", " \n", " \n", - " marker_eca779d68bd6fbf762d0c3da0f34a76a.bindTooltip(\n", + " marker_761a978a80e6a0a4058d8df9b8526637.bindTooltip(\n", " `<div>\n", " Origin\n", " </div>`,\n", @@ -573,19 +657,19 @@ " );\n", " \n", " \n", - " var marker_7cc91cacc317ba4133824152c7d2020d = L.marker(\n", - " [39.7677119, -105.2353468],\n", + " var marker_af43c65a243bca6780f4af8ab5f9fa4e = L.marker(\n", + " [39.7677116394043, -105.23534393310547],\n", " {}\n", - " ).addTo(map_2e1ee1c86769660429380c2223d90df1);\n", + " ).addTo(map_0acdbf3d52f2feea8da8d9c090017b46);\n", " \n", " \n", - " var icon_ff7c602391d23b656d26c31689aa10aa = L.AwesomeMarkers.icon(\n", + " var icon_0bf1f6f14bc80a4a36b29f2ba0414a1e = L.AwesomeMarkers.icon(\n", " {"extraClasses": "fa-rotate-0", "icon": "circle", "iconColor": "white", "markerColor": "red", "prefix": "fa"}\n", " );\n", - " marker_7cc91cacc317ba4133824152c7d2020d.setIcon(icon_ff7c602391d23b656d26c31689aa10aa);\n", + " marker_af43c65a243bca6780f4af8ab5f9fa4e.setIcon(icon_0bf1f6f14bc80a4a36b29f2ba0414a1e);\n", " \n", " \n", - " marker_7cc91cacc317ba4133824152c7d2020d.bindTooltip(\n", + " marker_af43c65a243bca6780f4af8ab5f9fa4e.bindTooltip(\n", " `<div>\n", " Destination\n", " </div>`,\n", @@ -593,13 +677,13 @@ " );\n", " \n", " \n", - " var poly_line_63495725ebc8fd6e58b677af041496fe = L.polyline(\n", - " [[39.7273069, -105.1994169], [39.7272989, -105.1994535], [39.7272848, -105.1994868], [39.7272593, -105.1995218], [39.7272272, -105.1995461], [39.7271912, -105.1995576], [39.7271688, -105.199558], [39.7271461, -105.1995532], [39.7271142, -105.1995365], [39.7270868, -105.1995096], [39.7270657, -105.1994741], [39.7270519, -105.1994296], [39.7270483, -105.1993816], [39.727052, -105.1993539], [39.7270571, -105.1993247], [39.7270719, -105.1992916], [39.7270973, -105.1992566], [39.7271293, -105.1992323], [39.7271651, -105.1992207], [39.7271854, -105.1992226], [39.7272113, -105.199227], [39.7273496, -105.1991687], [39.7274185, -105.1991465], [39.7275326, -105.1990928], [39.7276828, -105.1990602], [39.7277455, -105.1990518], [39.7279702, -105.1990232], [39.7281558, -105.1990357], [39.7284384, -105.1990893], [39.7286639, -105.199177], [39.7288222, -105.1992773], [39.7289214, -105.199385], [39.7290292, -105.1995543], [39.7290506, -105.1995879], [39.7292157, -105.1998155], [39.7293094, -105.1998945], [39.7294079, -105.1999604], [39.7295437, -105.200014], [39.7296299, -105.2000721], [39.7296469, -105.1996789], [39.7296738, -105.1987284], [39.7296906, -105.1986794], [39.7297244, -105.1985856], [39.7297272, -105.1984193], [39.7299723, -105.1984198], [39.7302117, -105.1984227], [39.7303235, -105.1984285], [39.7304434, -105.198443], [39.7305651, -105.1984732], [39.7307182, -105.1985167], [39.7308487, -105.1985623], [39.7309909, -105.1986311], [39.731127, -105.1987144], [39.7312292, -105.1987897], [39.7313292, -105.1988731], [39.7314292, -105.1989611], [39.731524, -105.1990554], [39.7316089, -105.1991466], [39.7317085, -105.1992639], [39.7318575, -105.1994488], [39.7319522, -105.1995697], [39.7320423, -105.1996716], [39.7321372, -105.1997578], [39.7322615, -105.1998506], [39.7323697, -105.1999163], [39.7324712, -105.1999637], [39.7325898, -105.2000081], [39.732689, -105.2000309], [39.7327987, -105.2000627], [39.732945, -105.2001049], [39.7330635, -105.2001374], [39.7331838, -105.2001914], [39.7332899, -105.2002528], [39.7334312, -105.200363], [39.7335257, -105.2004544], [39.7335523, -105.2004835], [39.7336132, -105.2005503], [39.7336902, -105.2006555], [39.733767, -105.2007557], [39.7338411, -105.2008491], [39.7339359, -105.2009412], [39.7340357, -105.2010154], [39.7340742, -105.201042], [39.7341117, -105.2010678], [39.7341542, -105.2010901], [39.734211, -105.2011198], [39.7343173, -105.2011712], [39.7344056, -105.2012021], [39.7345704, -105.2012376], [39.7347726, -105.2012753], [39.7351329, -105.2013311], [39.7352203, -105.2013441], [39.7353243, -105.201352], [39.7354415, -105.2013441], [39.7355491, -105.2013268], [39.7357022, -105.2012901], [39.7358395, -105.201259], [39.7362429, -105.2011675], [39.7367157, -105.2010639], [39.7367857, -105.2010539], [39.7368531, -105.2010442], [39.7369645, -105.2010356], [39.7370755, -105.201044], [39.7371895, -105.2010632], [39.7373179, -105.201099], [39.737714, -105.2012295], [39.7379567, -105.2013009], [39.7384451, -105.2014404], [39.7386872, -105.2015167], [39.7395717, -105.2017905], [39.7397153, -105.2018369], [39.7398269, -105.2018673], [39.7399356, -105.2018843], [39.7400618, -105.2018961], [39.740184, -105.2018932], [39.7403133, -105.2018823], [39.7404288, -105.2018645], [39.7405518, -105.2018387], [39.740665, -105.2018073], [39.7407597, -105.2017713], [39.7408728, -105.2017196], [39.740992, -105.2016551], [39.7411268, -105.2015625], [39.7412599, -105.2014489], [39.7413718, -105.2013453], [39.7414758, -105.2012326], [39.741608, -105.2010691], [39.7416901, -105.200964], [39.7417903, -105.2008396], [39.7417994, -105.200826], [39.7419078, -105.2006985], [39.7419027, -105.2006189], [39.7419122, -105.200549], [39.7419496, -105.2004812], [39.7419894, -105.20044], [39.742047, -105.2004033], [39.7420816, -105.2004], [39.7421282, -105.2004131], [39.7421839, -105.200448], [39.7422234, -105.2004924], [39.7422448, -105.2005578], [39.7422566, -105.2006096], [39.7422556, -105.2006625], [39.7422421, -105.2007231], [39.7422712, -105.2008198], [39.7423227, -105.200901], [39.7428069, -105.2016549], [39.7429048, -105.2018114], [39.7429131, -105.2018245], [39.7431503, -105.2022035], [39.7434374, -105.2026477], [39.7435807, -105.2028659], [39.7437705, -105.2031843], [39.7441255, -105.2037193], [39.7444536, -105.2042289], [39.7445369, -105.204369], [39.7448087, -105.2048085], [39.7450389, -105.205197], [39.745164, -105.2054397], [39.7452617, -105.205642], [39.745359, -105.2058753], [39.7454413, -105.2060693], [39.7454698, -105.2061365], [39.7455586, -105.2063498], [39.7456394, -105.2066197], [39.7457343, -105.2068984], [39.7458096, -105.2071619], [39.7458432, -105.2072893], [39.7459057, -105.2075162], [39.7459547, -105.2077463], [39.7460104, -105.2080066], [39.7460312, -105.2081149], [39.7460508, -105.2082709], [39.7460836, -105.2084787], [39.7461092, -105.2086125], [39.7461165, -105.2087078], [39.7461128, -105.2088019], [39.7461078, -105.2089177], [39.7461163, -105.208995], [39.7461377, -105.2090672], [39.7461588, -105.2091147], [39.7462509, -105.2092159], [39.746281, -105.2092382], [39.7462978, -105.209256], [39.7463242, -105.209292], [39.7463458, -105.2093473], [39.746361, -105.2094251], [39.7463921, -105.2095768], [39.7464353, -105.2097133], [39.7465001, -105.2098285], [39.7467097, -105.21004], [39.7467814, -105.2101094], [39.7473357, -105.2106047], [39.7474554, -105.2107116], [39.7475615, -105.2108064], [39.7475958, -105.2108371], [39.747653, -105.2108907], [39.7481502, -105.2113567], [39.7483361, -105.2115309], [39.7483726, -105.2115651], [39.7484183, -105.2116079], [39.7484718, -105.2116584], [39.7487212, -105.2118951], [39.749238, -105.2123721], [39.7492814, -105.2124135], [39.7500059, -105.2130759], [39.7500454, -105.2131129], [39.7503812, -105.2134256], [39.7504627, -105.2135015], [39.7508219, -105.2138362], [39.7508792, -105.2138895], [39.7509348, -105.2139426], [39.7511093, -105.2141093], [39.7516271, -105.2146038], [39.7516716, -105.2146463], [39.751739, -105.2147085], [39.7524829, -105.2153953], [39.7525012, -105.2154123], [39.7532517, -105.2161101], [39.7533052, -105.2161598], [39.7540716, -105.2168674], [39.7541308, -105.2169221], [39.7544795, -105.2172508], [39.7546281, -105.2174522], [39.7546745, -105.2175037], [39.7548394, -105.2176869], [39.7549112, -105.2177871], [39.7549657, -105.2176737], [39.7550709, -105.2178284], [39.7553123, -105.2180206], [39.7553432, -105.2180501], [39.7557021, -105.2183929], [39.7557747, -105.2184622], [39.7558345, -105.2185175], [39.7559026, -105.2185806], [39.7560369, -105.2187048], [39.7561658, -105.2188241], [39.7562789, -105.2189285], [39.7565141, -105.2191465], [39.7565805, -105.219207], [39.7566573, -105.2192765], [39.7570081, -105.2195986], [39.7571449, -105.2197242], [39.757496, -105.220046], [39.7575245, -105.2200708], [39.7578281, -105.2203541], [39.7578855, -105.2204071], [39.758256, -105.220758], [39.7583864, -105.2208904], [39.7585999, -105.2210954], [39.7586557, -105.2211495], [39.758721, -105.2212176], [39.7586739, -105.2213004], [39.7585841, -105.2214602], [39.7584619, -105.2216925], [39.758142, -105.2222691], [39.7576121, -105.2232368], [39.7575579, -105.2233409], [39.7576236, -105.2234019], [39.7578565, -105.2236199], [39.7579703, -105.2237258], [39.7580027, -105.2237561], [39.7583001, -105.2240544], [39.7583591, -105.2241084], [39.7587249, -105.2244446], [39.7588057, -105.22452], [39.7591609, -105.2248516], [39.7595089, -105.2251741], [39.7596887, -105.2253408], [39.7597554, -105.2254024], [39.7598802, -105.2255173], [39.7598939, -105.2255305], [39.7599658, -105.2255988], [39.7600186, -105.2256498], [39.7604008, -105.2259941], [39.7605066, -105.2260931], [39.7605924, -105.226174], [39.760667, -105.2262427], [39.7607946, -105.2263631], [39.7608753, -105.2264373], [39.7615829, -105.2271044], [39.7616266, -105.2271481], [39.7616788, -105.2272008], [39.762203, -105.2276943], [39.7623411, -105.2278299], [39.7630405, -105.2284565], [39.7632824, -105.2286685], [39.7637358, -105.2290679], [39.7640137, -105.229309], [39.7640954, -105.229381], [39.7641743, -105.229462], [39.76436, -105.2296495], [39.7645376, -105.2298658], [39.764824, -105.2301918], [39.7652051, -105.2307044], [39.7654711, -105.2310802], [39.7654801, -105.2310934], [39.7655308, -105.231168], [39.7655792, -105.231232], [39.7655918, -105.2312486], [39.7657719, -105.2315035], [39.7658973, -105.2316751], [39.7659962, -105.2318039], [39.7661018, -105.231924], [39.7662469, -105.2320614], [39.7664515, -105.2322588], [39.7671442, -105.2329283], [39.7673559, -105.2331244], [39.7674414, -105.2332053], [39.7675186, -105.2332845], [39.7675756, -105.2333522], [39.7676291, -105.2334243], [39.7676969, -105.2335369], [39.7677304, -105.233602], [39.767761, -105.2336649], [39.7677908, -105.233739], [39.7678172, -105.233812], [39.7678551, -105.2339422], [39.7678736, -105.2340294], [39.7678904, -105.2341257], [39.7679032, -105.2342329], [39.7679095, -105.2343359], [39.7679068, -105.2344027], [39.7679029, -105.234499], [39.7678875, -105.2346626], [39.7678651, -105.2347791], [39.7678384, -105.2348898], [39.7678006, -105.2350283], [39.7677517, -105.2352031], [39.7677119, -105.2353468]],\n", + " var poly_line_0a0966e9cedae2f14fbf5d357f2c0320 = L.polyline(\n", + " [[39.7273063659668, -105.19941711425781], [39.727298736572266, -105.19945526123047], [39.7272834777832, -105.1994857788086], [39.72726058959961, -105.19952392578125], [39.72722625732422, -105.19954681396484], [39.72719192504883, -105.19955444335938], [39.727169036865234, -105.19955444335938], [39.72714614868164, -105.19955444335938], [39.727115631103516, -105.19953918457031], [39.72708511352539, -105.19950866699219], [39.72706604003906, -105.19947052001953], [39.72705078125, -105.19943237304688], [39.727046966552734, -105.19937896728516], [39.72705078125, -105.19935607910156], [39.72705841064453, -105.19932556152344], [39.727073669433594, -105.19929504394531], [39.72709655761719, -105.19925689697266], [39.72713088989258, -105.19923400878906], [39.72716522216797, -105.19921875], [39.7271842956543, -105.19922637939453], [39.727210998535156, -105.19922637939453], [39.72734832763672, -105.19916534423828], [39.7274169921875, -105.19915008544922], [39.72753143310547, -105.19908905029297], [39.727684020996094, -105.19905853271484], [39.727745056152344, -105.19905090332031], [39.727970123291016, -105.19902038574219], [39.72815704345703, -105.19903564453125], [39.72843933105469, -105.19908905029297], [39.72866439819336, -105.19918060302734], [39.72882080078125, -105.19927978515625], [39.728919982910156, -105.19938659667969], [39.72903060913086, -105.19955444335938], [39.72904968261719, -105.1995849609375], [39.729217529296875, -105.19981384277344], [39.72930908203125, -105.19989776611328], [39.729408264160156, -105.19995880126953], [39.72954559326172, -105.20001220703125], [39.72962951660156, -105.2000732421875], [39.72964859008789, -105.19967651367188], [39.72967529296875, -105.19873046875], [39.72969055175781, -105.19867706298828], [39.7297248840332, -105.1985855102539], [39.72972869873047, -105.19841766357422], [39.72997283935547, -105.19841766357422], [39.7302131652832, -105.19842529296875], [39.730323791503906, -105.19842529296875], [39.73044204711914, -105.19844055175781], [39.73056411743164, -105.19847106933594], [39.730716705322266, -105.19851684570312], [39.73085021972656, -105.19856262207031], [39.73099136352539, -105.1986312866211], [39.73112869262695, -105.19871520996094], [39.73122787475586, -105.19879150390625], [39.73133087158203, -105.1988754272461], [39.73143005371094, -105.19895935058594], [39.73152542114258, -105.19905853271484], [39.73160934448242, -105.19915008544922], [39.73170852661133, -105.19926452636719], [39.73185729980469, -105.19944763183594], [39.73195266723633, -105.19956970214844], [39.73204040527344, -105.19966888427734], [39.73213577270508, -105.19976043701172], [39.732261657714844, -105.1998519897461], [39.73236846923828, -105.19991302490234], [39.73247146606445, -105.19996643066406], [39.73258972167969, -105.20000457763672], [39.732688903808594, -105.20002746582031], [39.7327995300293, -105.20006561279297], [39.73294448852539, -105.20010375976562], [39.733062744140625, -105.20013427734375], [39.733184814453125, -105.20018768310547], [39.73329162597656, -105.20025634765625], [39.73343276977539, -105.20036315917969], [39.733524322509766, -105.20045471191406], [39.733551025390625, -105.20048522949219], [39.733612060546875, -105.20055389404297], [39.73368835449219, -105.20065307617188], [39.733768463134766, -105.20075225830078], [39.73384094238281, -105.20085144042969], [39.73393630981445, -105.20094299316406], [39.73403549194336, -105.20101165771484], [39.734073638916016, -105.20104217529297], [39.73411178588867, -105.20106506347656], [39.734153747558594, -105.20108795166016], [39.73421096801758, -105.20111846923828], [39.734317779541016, -105.201171875], [39.734405517578125, -105.20120239257812], [39.73456954956055, -105.20124053955078], [39.734771728515625, -105.20127868652344], [39.73513412475586, -105.20133209228516], [39.73522186279297, -105.20134735107422], [39.73532485961914, -105.20135498046875], [39.735443115234375, -105.20134735107422], [39.73554992675781, -105.20132446289062], [39.73570251464844, -105.20128631591797], [39.73583984375, -105.20125579833984], [39.736244201660156, -105.20116424560547], [39.736717224121094, -105.20106506347656], [39.736785888671875, -105.20105743408203], [39.736854553222656, -105.20104217529297], [39.73696517944336, -105.20103454589844], [39.73707580566406, -105.20104217529297], [39.73719024658203, -105.20106506347656], [39.7373161315918, -105.20109558105469], [39.73771286010742, -105.20123291015625], [39.73795700073242, -105.20130157470703], [39.73844528198242, -105.2014389038086], [39.738685607910156, -105.2015151977539], [39.73957061767578, -105.20178985595703], [39.739715576171875, -105.20183563232422], [39.73982620239258, -105.20186614990234], [39.73993682861328, -105.2018814086914], [39.74006271362305, -105.20189666748047], [39.74018478393555, -105.20189666748047], [39.74031448364258, -105.2018814086914], [39.74042892456055, -105.20186614990234], [39.74055099487305, -105.20183563232422], [39.740665435791016, -105.2018051147461], [39.740760803222656, -105.20177459716797], [39.74087142944336, -105.20172119140625], [39.74099349975586, -105.20165252685547], [39.741127014160156, -105.2015609741211], [39.74126052856445, -105.20144653320312], [39.741371154785156, -105.20134735107422], [39.74147415161133, -105.20123291015625], [39.741607666015625, -105.2010726928711], [39.74169158935547, -105.20096588134766], [39.741790771484375, -105.20083618164062], [39.741798400878906, -105.2008285522461], [39.74189758300781, -105.20068359375], [39.741886138916016, -105.20062255859375], [39.74188995361328, -105.2005615234375], [39.74190902709961, -105.20050048828125], [39.741939544677734, -105.200439453125], [39.741981506347656, -105.20040130615234], [39.74203109741211, -105.20037078857422], [39.74208450317383, -105.20036315917969], [39.74214172363281, -105.20037841796875], [39.7421875, -105.2004165649414], [39.742225646972656, -105.2004623413086], [39.742252349853516, -105.20052337646484], [39.74226379394531, -105.20059204101562], [39.74225997924805, -105.2006607055664], [39.74224090576172, -105.20072174072266], [39.742271423339844, -105.20082092285156], [39.7423210144043, -105.20089721679688], [39.74280548095703, -105.20165252685547], [39.74290466308594, -105.20181274414062], [39.74291229248047, -105.20182800292969], [39.74314880371094, -105.20220184326172], [39.743438720703125, -105.20264434814453], [39.74357986450195, -105.20286560058594], [39.743770599365234, -105.20318603515625], [39.74412536621094, -105.20372009277344], [39.74445343017578, -105.20423126220703], [39.744537353515625, -105.2043685913086], [39.744808197021484, -105.2048110961914], [39.74503707885742, -105.2052001953125], [39.74516296386719, -105.20543670654297], [39.745262145996094, -105.20564270019531], [39.745357513427734, -105.20587158203125], [39.74544143676758, -105.20606994628906], [39.74546813964844, -105.20613861083984], [39.74555969238281, -105.20635223388672], [39.74563980102539, -105.20661926269531], [39.74573516845703, -105.20690155029297], [39.745811462402344, -105.20716094970703], [39.74584197998047, -105.20729064941406], [39.745906829833984, -105.20751953125], [39.74595642089844, -105.20774841308594], [39.746009826660156, -105.2080078125], [39.74603271484375, -105.20811462402344], [39.74605178833008, -105.20826721191406], [39.7460823059082, -105.20848083496094], [39.74610900878906, -105.20861053466797], [39.746116638183594, -105.20870971679688], [39.74611282348633, -105.20880126953125], [39.74610900878906, -105.20891571044922], [39.746116638183594, -105.20899200439453], [39.74613952636719, -105.20906829833984], [39.746158599853516, -105.20911407470703], [39.74625015258789, -105.20921325683594], [39.746280670166016, -105.20923614501953], [39.74629592895508, -105.20925903320312], [39.74632263183594, -105.20928955078125], [39.74634552001953, -105.2093505859375], [39.746360778808594, -105.20942687988281], [39.74639129638672, -105.20957946777344], [39.746437072753906, -105.209716796875], [39.74650192260742, -105.20983123779297], [39.746707916259766, -105.21003723144531], [39.74678039550781, -105.2101058959961], [39.747337341308594, -105.21060180664062], [39.74745559692383, -105.21070861816406], [39.747562408447266, -105.21080780029297], [39.747596740722656, -105.2108383178711], [39.74765396118164, -105.21089172363281], [39.74814987182617, -105.21135711669922], [39.74833679199219, -105.21153259277344], [39.74837112426758, -105.21156311035156], [39.748416900634766, -105.21160888671875], [39.748470306396484, -105.21165466308594], [39.748722076416016, -105.21189880371094], [39.749237060546875, -105.21237182617188], [39.74928283691406, -105.21240997314453], [39.75000762939453, -105.21307373046875], [39.75004577636719, -105.2131118774414], [39.75038146972656, -105.21342468261719], [39.75046157836914, -105.2135009765625], [39.75082015991211, -105.21383666992188], [39.750877380371094, -105.2138900756836], [39.75093460083008, -105.21394348144531], [39.7511100769043, -105.214111328125], [39.75162887573242, -105.21460723876953], [39.751670837402344, -105.21464538574219], [39.751739501953125, -105.21470642089844], [39.75248336791992, -105.21539306640625], [39.75250244140625, -105.21541595458984], [39.75325012207031, -105.21611022949219], [39.75330352783203, -105.21615600585938], [39.75407028198242, -105.21686553955078], [39.75413131713867, -105.2169189453125], [39.754478454589844, -105.21724700927734], [39.75456237792969, -105.21731567382812], [39.754966735839844, -105.2176742553711], [39.755069732666016, -105.21782684326172], [39.755313873291016, -105.218017578125], [39.75534439086914, -105.21804809570312], [39.75570297241211, -105.21839141845703], [39.755775451660156, -105.21846008300781], [39.75583267211914, -105.21852111816406], [39.75590133666992, -105.21858215332031], [39.756038665771484, -105.21870422363281], [39.75616455078125, -105.21882629394531], [39.75627899169922, -105.21892547607422], [39.75651550292969, -105.21914672851562], [39.7565803527832, -105.21920776367188], [39.756526947021484, -105.21929931640625], [39.756473541259766, -105.21939849853516], [39.756324768066406, -105.21967315673828], [39.75604248046875, -105.2201919555664], [39.756011962890625, -105.22024536132812], [39.75606918334961, -105.22032165527344], [39.756256103515625, -105.22053527832031], [39.756282806396484, -105.2205581665039], [39.756404876708984, -105.2206802368164], [39.75654602050781, -105.2208023071289], [39.75674057006836, -105.220947265625], [39.75669860839844, -105.22109985351562], [39.75663757324219, -105.2213134765625], [39.75657272338867, -105.22146606445312], [39.75651931762695, -105.22156524658203], [39.7564582824707, -105.2216796875], [39.756290435791016, -105.22199249267578], [39.7562255859375, -105.22211456298828], [39.75630187988281, -105.22218322753906], [39.75661849975586, -105.22248077392578], [39.756629943847656, -105.22249603271484], [39.7569465637207, -105.22279357910156], [39.757057189941406, -105.22289276123047], [39.75748062133789, -105.2232666015625], [39.7575569152832, -105.22334289550781], [39.75762176513672, -105.22340393066406], [39.75785827636719, -105.22361755371094], [39.75796890258789, -105.22372436523438], [39.75800323486328, -105.2237548828125], [39.75830078125, -105.22405242919922], [39.758358001708984, -105.22410583496094], [39.758724212646484, -105.22444152832031], [39.75880432128906, -105.22451782226562], [39.759159088134766, -105.224853515625], [39.7595100402832, -105.22517395019531], [39.75968933105469, -105.225341796875], [39.7597541809082, -105.22540283203125], [39.75988006591797, -105.22551727294922], [39.75989532470703, -105.22553253173828], [39.75996398925781, -105.22560119628906], [39.76001739501953, -105.22564697265625], [39.76040267944336, -105.22599029541016], [39.76050567626953, -105.22608947753906], [39.76059341430664, -105.2261734008789], [39.76066589355469, -105.22624206542969], [39.76079559326172, -105.22636413574219], [39.7608757019043, -105.2264404296875], [39.76158142089844, -105.22710418701172], [39.761627197265625, -105.2271499633789], [39.761680603027344, -105.22720336914062], [39.762203216552734, -105.22769165039062], [39.7623405456543, -105.22782897949219], [39.763038635253906, -105.22845458984375], [39.763282775878906, -105.22866821289062], [39.763736724853516, -105.22906494140625], [39.764015197753906, -105.22930908203125], [39.764095306396484, -105.22937774658203], [39.76417541503906, -105.22946166992188], [39.76435852050781, -105.22965240478516], [39.7645378112793, -105.22986602783203], [39.76482391357422, -105.23019409179688], [39.76520538330078, -105.23070526123047], [39.765472412109375, -105.2310791015625], [39.765480041503906, -105.23109436035156], [39.76552963256836, -105.23117065429688], [39.76557922363281, -105.23123168945312], [39.76559066772461, -105.23124694824219], [39.76577377319336, -105.23150634765625], [39.76589584350586, -105.23167419433594], [39.765995025634766, -105.23180389404297], [39.7661018371582, -105.23192596435547], [39.7662467956543, -105.23206329345703], [39.76645278930664, -105.23226165771484], [39.76714324951172, -105.23292541503906], [39.767356872558594, -105.23312377929688], [39.76744079589844, -105.23320770263672], [39.76751708984375, -105.23328399658203], [39.767574310302734, -105.23335266113281], [39.76762771606445, -105.2334213256836], [39.767696380615234, -105.23353576660156], [39.767730712890625, -105.23360443115234], [39.76776123046875, -105.2336654663086], [39.767791748046875, -105.2337417602539], [39.767818450927734, -105.23381042480469], [39.76785659790039, -105.23394012451172], [39.76787185668945, -105.2340316772461], [39.76789093017578, -105.23412322998047], [39.76790237426758, -105.2342300415039], [39.76791000366211, -105.23433685302734], [39.767906188964844, -105.23440551757812], [39.76790237426758, -105.2344970703125], [39.767887115478516, -105.23466491699219], [39.76786422729492, -105.23477935791016], [39.76783752441406, -105.2348861694336], [39.767799377441406, -105.23503112792969], [39.76775360107422, -105.2352066040039], [39.7677116394043, -105.23534393310547]],\n", " {"bubblingMouseEvents": true, "color": "green", "dashArray": null, "dashOffset": null, "fill": false, "fillColor": "green", "fillOpacity": 0.2, "fillRule": "evenodd", "lineCap": "round", "lineJoin": "round", "noClip": false, "opacity": 0.8, "smoothFactor": 1.0, "stroke": true, "weight": 10}\n", - " ).addTo(map_2e1ee1c86769660429380c2223d90df1);\n", + " ).addTo(map_0acdbf3d52f2feea8da8d9c090017b46);\n", " \n", " \n", - " poly_line_63495725ebc8fd6e58b677af041496fe.bindTooltip(\n", + " poly_line_0a0966e9cedae2f14fbf5d357f2c0320.bindTooltip(\n", " `<div>\n", " Least Energy\n", " </div>`,\n", @@ -607,19 +691,19 @@ " );\n", " \n", " \n", - " var marker_5bcd376e0fcff4d9f0b6de6c1b99dd22 = L.marker(\n", - " [39.7273069, -105.1994169],\n", + " var marker_c708bcd59a46c1985221e961040c7ba8 = L.marker(\n", + " [39.7273063659668, -105.19941711425781],\n", " {}\n", - " ).addTo(map_2e1ee1c86769660429380c2223d90df1);\n", + " ).addTo(map_0acdbf3d52f2feea8da8d9c090017b46);\n", " \n", " \n", - " var icon_e779a0c537295ef7f1babca8995fc884 = L.AwesomeMarkers.icon(\n", + " var icon_338e7868b6567853b17bec5f5884e0ff = L.AwesomeMarkers.icon(\n", " {"extraClasses": "fa-rotate-0", "icon": "circle", "iconColor": "white", "markerColor": "green", "prefix": "fa"}\n", " );\n", - " marker_5bcd376e0fcff4d9f0b6de6c1b99dd22.setIcon(icon_e779a0c537295ef7f1babca8995fc884);\n", + " marker_c708bcd59a46c1985221e961040c7ba8.setIcon(icon_338e7868b6567853b17bec5f5884e0ff);\n", " \n", " \n", - " marker_5bcd376e0fcff4d9f0b6de6c1b99dd22.bindTooltip(\n", + " marker_c708bcd59a46c1985221e961040c7ba8.bindTooltip(\n", " `<div>\n", " Origin\n", " </div>`,\n", @@ -627,19 +711,19 @@ " );\n", " \n", " \n", - " var marker_2cad01ff744a8c8f6b425f11a04e4fe5 = L.marker(\n", - " [39.7677119, -105.2353468],\n", + " var marker_6d59165a65aa53a7542686258e710b49 = L.marker(\n", + " [39.7677116394043, -105.23534393310547],\n", " {}\n", - " ).addTo(map_2e1ee1c86769660429380c2223d90df1);\n", + " ).addTo(map_0acdbf3d52f2feea8da8d9c090017b46);\n", " \n", " \n", - " var icon_69e8fcba4574ad6538f4b3e4592eea86 = L.AwesomeMarkers.icon(\n", + " var icon_acf98e8275156aa649655581c3f5e077 = L.AwesomeMarkers.icon(\n", " {"extraClasses": "fa-rotate-0", "icon": "circle", "iconColor": "white", "markerColor": "red", "prefix": "fa"}\n", " );\n", - " marker_2cad01ff744a8c8f6b425f11a04e4fe5.setIcon(icon_69e8fcba4574ad6538f4b3e4592eea86);\n", + " marker_6d59165a65aa53a7542686258e710b49.setIcon(icon_acf98e8275156aa649655581c3f5e077);\n", " \n", " \n", - " marker_2cad01ff744a8c8f6b425f11a04e4fe5.bindTooltip(\n", + " marker_6d59165a65aa53a7542686258e710b49.bindTooltip(\n", " `<div>\n", " Destination\n", " </div>`,\n", @@ -650,10 +734,10 @@ "</html>\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen>" ], "text/plain": [ - "" + "" ] }, - "execution_count": 27, + "execution_count": 73, "metadata": {}, "output_type": "execute_result" } @@ -674,7 +758,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 75, "id": "aa1e6b11", "metadata": {}, "outputs": [ @@ -708,7 +792,7 @@ " <meta name="viewport" content="width=device-width,\n", " initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />\n", " <style>\n", - " #map_a500a5662e07171781edbd5859e8c1b4 {\n", + " #map_75c2c9742d22aa678c2dac182a4fdbb3 {\n", " position: relative;\n", " width: 100.0%;\n", " height: 100.0%;\n", @@ -722,16 +806,16 @@ "<body>\n", " \n", " \n", - " <div class="folium-map" id="map_a500a5662e07171781edbd5859e8c1b4" ></div>\n", + " <div class="folium-map" id="map_75c2c9742d22aa678c2dac182a4fdbb3" ></div>\n", " \n", "</body>\n", "<script>\n", " \n", " \n", - " var map_a500a5662e07171781edbd5859e8c1b4 = L.map(\n", - " "map_a500a5662e07171781edbd5859e8c1b4",\n", + " var map_75c2c9742d22aa678c2dac182a4fdbb3 = L.map(\n", + " "map_75c2c9742d22aa678c2dac182a4fdbb3",\n", " {\n", - " center: [39.7465774, -105.2216276],\n", + " center: [39.746578216552734, -105.22162628173828],\n", " crs: L.CRS.EPSG3857,\n", " zoom: 12,\n", " zoomControl: true,\n", @@ -743,39 +827,39 @@ "\n", " \n", " \n", - " var tile_layer_02ce3a93506e75adc4250dcb50154292 = L.tileLayer(\n", + " var tile_layer_7b2b41d3713e54dcf5de0592e570d8a4 = L.tileLayer(\n", " "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",\n", " {"attribution": "Data by \\u0026copy; \\u003ca target=\\"_blank\\" href=\\"http://openstreetmap.org\\"\\u003eOpenStreetMap\\u003c/a\\u003e, under \\u003ca target=\\"_blank\\" href=\\"http://www.openstreetmap.org/copyright\\"\\u003eODbL\\u003c/a\\u003e.", "detectRetina": false, "maxNativeZoom": 18, "maxZoom": 18, "minZoom": 0, "noWrap": false, "opacity": 1, "subdomains": "abc", "tms": false}\n", - " ).addTo(map_a500a5662e07171781edbd5859e8c1b4);\n", + " ).addTo(map_75c2c9742d22aa678c2dac182a4fdbb3);\n", " \n", " \n", - " var poly_line_65238bc693e1ad88cf59f0194d5d9746 = L.polyline(\n", - " [[39.7273069, -105.1994169], [39.7272989, -105.1994535], [39.7272848, -105.1994868], [39.7272593, -105.1995218], [39.7272272, -105.1995461], [39.7271912, -105.1995576], [39.7271688, -105.199558], [39.7271461, -105.1995532], [39.7271142, -105.1995365], [39.7270868, -105.1995096], [39.7270657, -105.1994741], [39.7270519, -105.1994296], [39.7270483, -105.1993816], [39.727052, -105.1993539], [39.7270571, -105.1993247], [39.7270719, -105.1992916], [39.7270973, -105.1992566], [39.7271293, -105.1992323], [39.7271651, -105.1992207], [39.7271854, -105.1992226], [39.7272113, -105.199227], [39.7273496, -105.1991687], [39.7274185, -105.1991465], [39.7275326, -105.1990928], [39.7276828, -105.1990602], [39.7277455, -105.1990518], [39.7279702, -105.1990232], [39.7281558, -105.1990357], [39.7284384, -105.1990893], [39.7286639, -105.199177], [39.7288222, -105.1992773], [39.7289214, -105.199385], [39.7290292, -105.1995543], [39.7290506, -105.1995879], [39.7292157, -105.1998155], [39.7293094, -105.1998945], [39.7294079, -105.1999604], [39.7295437, -105.200014], [39.7296299, -105.2000721], [39.7297292, -105.2000757], [39.7297135, -105.2007081], [39.7297192, -105.2013106], [39.7298153, -105.2032041], [39.7298256, -105.2033784], [39.7298664, -105.2035708], [39.7298795, -105.203649], [39.7299267, -105.2038558], [39.7301082, -105.2042608], [39.7304911, -105.2048068], [39.7308741, -105.2053111], [39.7310676, -105.2055985], [39.7311933, -105.205824], [39.7312069, -105.2058543], [39.7313075, -105.2061158], [39.731348, -105.206248], [39.731386, -105.2064213], [39.7314237, -105.2067336], [39.731429, -105.2070565], [39.7314226, -105.207224], [39.7314076, -105.2074036], [39.7313611, -105.2077675], [39.7313265, -105.2079124], [39.7312831, -105.20806], [39.7312292, -105.2082086], [39.7311706, -105.208344], [39.7310965, -105.2084777], [39.7310049, -105.208616], [39.7309234, -105.2087235], [39.7308212, -105.2088303], [39.7306227, -105.2089819], [39.7304801, -105.2090736], [39.7303681, -105.2091988], [39.7303327, -105.2092597], [39.7303114, -105.2093181], [39.730299, -105.20939], [39.7302939, -105.2095126], [39.7303105, -105.2096804], [39.7304414, -105.2099267], [39.7305001, -105.2100344], [39.7305871, -105.2101842], [39.7307404, -105.2104481], [39.7309234, -105.2107229], [39.7310934, -105.2109639], [39.731238, -105.211145], [39.7314101, -105.2113464], [39.7315783, -105.2115336], [39.7317541, -105.2117064], [39.7319796, -105.2119089], [39.732359, -105.2122393], [39.7329187, -105.2127184], [39.7334557, -105.213188], [39.7338968, -105.2135676], [39.7342777, -105.2138968], [39.7347139, -105.2142786], [39.7354652, -105.2149301], [39.7356319, -105.2150733], [39.7358844, -105.2152902], [39.7363901, -105.2157275], [39.7369129, -105.2161859], [39.7377243, -105.2168831], [39.7390882, -105.2180682], [39.7397882, -105.2186718], [39.7403043, -105.2191078], [39.7405645, -105.2193336], [39.7406767, -105.2194225], [39.7415803, -105.2202142], [39.7416486, -105.2202727], [39.7417047, -105.2203151], [39.7421502, -105.2206932], [39.7425816, -105.221062], [39.7432687, -105.2215398], [39.7435797, -105.2217631], [39.7436721, -105.2218299], [39.7437366, -105.2218764], [39.7438794, -105.2219759], [39.7439546, -105.2220253], [39.7440082, -105.2220586], [39.7440819, -105.2221021], [39.7441377, -105.2221322], [39.7441808, -105.2221541], [39.7442796, -105.2222043], [39.7443357, -105.2222286], [39.7444062, -105.222259], [39.7444657, -105.2222871], [39.7444962, -105.2223029], [39.7445695, -105.2223431], [39.7446343, -105.2223808], [39.744683, -105.2224104], [39.7447215, -105.2224349], [39.7447658, -105.2224654], [39.744813, -105.222499], [39.7448547, -105.2225315], [39.7448881, -105.2225586], [39.7449328, -105.2225965], [39.7449815, -105.2226391], [39.7451542, -105.2227925], [39.7454784, -105.2230438], [39.7455034, -105.2230623], [39.7455159, -105.2230713], [39.7455403, -105.2230861], [39.7455548, -105.2230941], [39.7455766, -105.2231014], [39.7456018, -105.223106], [39.7456176, -105.2231071], [39.7456337, -105.223107], [39.7456638, -105.2231045], [39.7456814, -105.2231011], [39.7456983, -105.2230945], [39.7457224, -105.2230821], [39.7457338, -105.2230745], [39.7457588, -105.2230543], [39.7457709, -105.223043], [39.7457834, -105.2230284], [39.7458035, -105.2230027], [39.7458905, -105.2228787], [39.7460068, -105.2226624], [39.7461589, -105.2223894], [39.7463617, -105.2220126], [39.7464427, -105.2218672], [39.746482, -105.2217968], [39.7465202, -105.2217322], [39.7465523, -105.2216771], [39.7465774, -105.2216276], [39.7465928, -105.2215823], [39.7466004, -105.2215466], [39.7466042, -105.2215101], [39.7466044, -105.2214695], [39.746601, -105.2214368], [39.7465881, -105.2213862], [39.7465804, -105.2213567], [39.7465774, -105.2213321], [39.7465774, -105.2213048], [39.746581, -105.2212762], [39.7465874, -105.2212518], [39.7465978, -105.2212266], [39.7466125, -105.2212024], [39.7466266, -105.2211858], [39.7466485, -105.2211678], [39.7466708, -105.2211566], [39.746693, -105.2211511], [39.746715, -105.2211506], [39.7467203, -105.2211517], [39.7467798, -105.2211327], [39.7468101, -105.2211204], [39.7468347, -105.2211032], [39.7468673, -105.2210676], [39.7468863, -105.2210389], [39.7469079, -105.2209995], [39.7469752, -105.2208699], [39.7471073, -105.220655], [39.7471371, -105.2206129], [39.7471594, -105.2205845], [39.7472061, -105.2205376], [39.7473376, -105.2202962], [39.747357, -105.2202177], [39.7473682, -105.2201868], [39.7473848, -105.2201519], [39.7475089, -105.2199249], [39.7475861, -105.2197973], [39.7476254, -105.2197401], [39.7476917, -105.2196525], [39.7477724, -105.2195069], [39.7478875, -105.219299], [39.7479219, -105.2192372], [39.7479518, -105.219179], [39.7480957, -105.2189201], [39.7481337, -105.2188515], [39.7482567, -105.2186294], [39.7484851, -105.2182271], [39.7485167, -105.218164], [39.7485605, -105.2180881], [39.7490516, -105.217166], [39.7490955, -105.2170866], [39.7491263, -105.2170387], [39.7493736, -105.2165801], [39.7496841, -105.2160128], [39.7497482, -105.2160733], [39.7504593, -105.216753], [39.7505084, -105.2168007], [39.7505733, -105.2168567], [39.7509525, -105.2172063], [39.7512593, -105.2174884], [39.7513304, -105.2175506], [39.7513869, -105.217604], [39.7517458, -105.2179367], [39.7520945, -105.21826], [39.7521462, -105.2183047], [39.7522126, -105.218369], [39.7523012, -105.2184523], [39.7525052, -105.218642], [39.7527145, -105.2188366], [39.7528959, -105.2189993], [39.7529601, -105.2190649], [39.7530308, -105.219128], [39.7537033, -105.2197718], [39.753764, -105.2198302], [39.7538299, -105.2198915], [39.7542346, -105.2202638], [39.7545279, -105.2205433], [39.7545847, -105.2206031], [39.7546623, -105.2206728], [39.7553326, -105.2212752], [39.755407, -105.221342], [39.7554908, -105.2214211], [39.7561483, -105.2220415], [39.7562254, -105.2221143], [39.7563006, -105.2221853], [39.7566193, -105.222483], [39.7566315, -105.2224957], [39.7569475, -105.2227913], [39.7570561, -105.222895], [39.7574792, -105.2232693], [39.7575579, -105.2233409], [39.7576236, -105.2234019], [39.7578565, -105.2236199], [39.7579703, -105.2237258], [39.7580027, -105.2237561], [39.7583001, -105.2240544], [39.7583591, -105.2241084], [39.7587249, -105.2244446], [39.7588057, -105.22452], [39.7591609, -105.2248516], [39.7595089, -105.2251741], [39.7596887, -105.2253408], [39.7597554, -105.2254024], [39.7598802, -105.2255173], [39.7598939, -105.2255305], [39.7599658, -105.2255988], [39.7600186, -105.2256498], [39.7604008, -105.2259941], [39.7605066, -105.2260931], [39.7605924, -105.226174], [39.760667, -105.2262427], [39.7607946, -105.2263631], [39.7608753, -105.2264373], [39.7615829, -105.2271044], [39.7616266, -105.2271481], [39.7616788, -105.2272008], [39.762203, -105.2276943], [39.7623411, -105.2278299], [39.7630405, -105.2284565], [39.7632824, -105.2286685], [39.7637358, -105.2290679], [39.7640137, -105.229309], [39.7640954, -105.229381], [39.7641743, -105.229462], [39.76436, -105.2296495], [39.7645376, -105.2298658], [39.764824, -105.2301918], [39.7652051, -105.2307044], [39.7654711, -105.2310802], [39.7654801, -105.2310934], [39.7655308, -105.231168], [39.7655792, -105.231232], [39.7655918, -105.2312486], [39.7657719, -105.2315035], [39.7658973, -105.2316751], [39.7659962, -105.2318039], [39.7661018, -105.231924], [39.7662469, -105.2320614], [39.7664515, -105.2322588], [39.7671442, -105.2329283], [39.7673559, -105.2331244], [39.7674414, -105.2332053], [39.7675186, -105.2332845], [39.7675756, -105.2333522], [39.7676291, -105.2334243], [39.7676969, -105.2335369], [39.7677304, -105.233602], [39.767761, -105.2336649], [39.7677908, -105.233739], [39.7678172, -105.233812], [39.7678551, -105.2339422], [39.7678736, -105.2340294], [39.7678904, -105.2341257], [39.7679032, -105.2342329], [39.7679095, -105.2343359], [39.7679068, -105.2344027], [39.7679029, -105.234499], [39.7678875, -105.2346626], [39.7678651, -105.2347791], [39.7678384, -105.2348898], [39.7678006, -105.2350283], [39.7677517, -105.2352031], [39.7677119, -105.2353468]],\n", - " {"bubblingMouseEvents": true, "color": "#0c0786", "dashArray": null, "dashOffset": null, "fill": false, "fillColor": "#0c0786", "fillOpacity": 0.2, "fillRule": "evenodd", "lineCap": "round", "lineJoin": "round", "noClip": false, "opacity": 0.8, "smoothFactor": 1.0, "stroke": true, "weight": 10}\n", - " ).addTo(map_a500a5662e07171781edbd5859e8c1b4);\n", + " var poly_line_c29dfba3ce607b0930502e207d845303 = L.polyline(\n", + " [[39.7273063659668, -105.19941711425781], [39.727298736572266, -105.19945526123047], [39.7272834777832, -105.1994857788086], [39.72726058959961, -105.19952392578125], [39.72722625732422, -105.19954681396484], [39.72719192504883, -105.19955444335938], [39.727169036865234, -105.19955444335938], [39.72714614868164, -105.19955444335938], [39.727115631103516, -105.19953918457031], [39.72708511352539, -105.19950866699219], [39.72706604003906, -105.19947052001953], [39.72705078125, -105.19943237304688], [39.727046966552734, -105.19937896728516], [39.72705078125, -105.19935607910156], [39.72705841064453, -105.19932556152344], [39.727073669433594, -105.19929504394531], [39.72709655761719, -105.19925689697266], [39.72713088989258, -105.19923400878906], [39.72716522216797, -105.19921875], [39.7271842956543, -105.19922637939453], [39.727210998535156, -105.19922637939453], [39.72734832763672, -105.19916534423828], [39.7274169921875, -105.19915008544922], [39.72753143310547, -105.19908905029297], [39.727684020996094, -105.19905853271484], [39.727745056152344, -105.19905090332031], [39.727970123291016, -105.19902038574219], [39.72815704345703, -105.19903564453125], [39.72843933105469, -105.19908905029297], [39.72866439819336, -105.19918060302734], [39.72882080078125, -105.19927978515625], [39.728919982910156, -105.19938659667969], [39.72903060913086, -105.19955444335938], [39.72904968261719, -105.1995849609375], [39.729217529296875, -105.19981384277344], [39.72930908203125, -105.19989776611328], [39.729408264160156, -105.19995880126953], [39.72954559326172, -105.20001220703125], [39.72962951660156, -105.2000732421875], [39.72972869873047, -105.2000732421875], [39.729713439941406, -105.2007064819336], [39.72972106933594, -105.20130920410156], [39.72981643676758, -105.20320129394531], [39.72982406616211, -105.20337677001953], [39.72986602783203, -105.20356750488281], [39.729881286621094, -105.20365142822266], [39.72992706298828, -105.203857421875], [39.730106353759766, -105.20426177978516], [39.730491638183594, -105.20480346679688], [39.730873107910156, -105.20531463623047], [39.7310676574707, -105.20559692382812], [39.73119354248047, -105.20582580566406], [39.73120880126953, -105.20585632324219], [39.73130798339844, -105.20611572265625], [39.731346130371094, -105.20624542236328], [39.73138427734375, -105.2064208984375], [39.731422424316406, -105.20673370361328], [39.73143005371094, -105.2070541381836], [39.731422424316406, -105.20722198486328], [39.731407165527344, -105.20740509033203], [39.731361389160156, -105.20777130126953], [39.731327056884766, -105.2079086303711], [39.73128128051758, -105.20806121826172], [39.73122787475586, -105.20820617675781], [39.731170654296875, -105.20834350585938], [39.73109817504883, -105.20848083496094], [39.73100662231445, -105.2086181640625], [39.73092269897461, -105.20872497558594], [39.73081970214844, -105.20883178710938], [39.730621337890625, -105.208984375], [39.7304801940918, -105.20907592773438], [39.730369567871094, -105.20919799804688], [39.73033142089844, -105.20925903320312], [39.73031234741211, -105.20932006835938], [39.73030090332031, -105.20938873291016], [39.73029327392578, -105.20951080322266], [39.73031234741211, -105.20967864990234], [39.73044204711914, -105.20993041992188], [39.730499267578125, -105.21003723144531], [39.730587005615234, -105.2101821899414], [39.73073959350586, -105.21044921875], [39.73092269897461, -105.21072387695312], [39.73109436035156, -105.2109603881836], [39.731239318847656, -105.21114349365234], [39.73141098022461, -105.21134948730469], [39.7315788269043, -105.21153259277344], [39.731754302978516, -105.21170806884766], [39.73197937011719, -105.21190643310547], [39.73236083984375, -105.21224212646484], [39.73291778564453, -105.21271514892578], [39.733455657958984, -105.21318817138672], [39.7338981628418, -105.21356964111328], [39.734275817871094, -105.21389770507812], [39.73471450805664, -105.21427917480469], [39.73546600341797, -105.21492767333984], [39.73563003540039, -105.21507263183594], [39.73588562011719, -105.21529388427734], [39.73638916015625, -105.21572875976562], [39.73691177368164, -105.2161865234375], [39.73772430419922, -105.21688079833984], [39.73908996582031, -105.21807098388672], [39.73978805541992, -105.21867370605469], [39.74030303955078, -105.21910858154297], [39.74056625366211, -105.21932983398438], [39.74067687988281, -105.21942138671875], [39.741580963134766, -105.22021484375], [39.74164962768555, -105.22027587890625], [39.741703033447266, -105.2203140258789], [39.742149353027344, -105.22069549560547], [39.74258041381836, -105.22106170654297], [39.74326705932617, -105.22154235839844], [39.74357986450195, -105.22176361083984], [39.74367141723633, -105.22183227539062], [39.743736267089844, -105.22187805175781], [39.74388122558594, -105.22197723388672], [39.743953704833984, -105.2220230102539], [39.7440071105957, -105.22206115722656], [39.744083404541016, -105.22209930419922], [39.744136810302734, -105.22212982177734], [39.74418258666992, -105.22215270996094], [39.74427795410156, -105.22220611572266], [39.74433517456055, -105.22222900390625], [39.744407653808594, -105.22225952148438], [39.74446487426758, -105.2222900390625], [39.7444953918457, -105.22230529785156], [39.74456787109375, -105.22234344482422], [39.744632720947266, -105.22238159179688], [39.74468231201172, -105.222412109375], [39.744720458984375, -105.2224349975586], [39.74476623535156, -105.22246551513672], [39.74481201171875, -105.22249603271484], [39.74485397338867, -105.2225341796875], [39.74488830566406, -105.2225570678711], [39.74493408203125, -105.22259521484375], [39.74497985839844, -105.22264099121094], [39.745155334472656, -105.22279357910156], [39.745479583740234, -105.2230453491211], [39.74550247192383, -105.22306060791016], [39.74551773071289, -105.22306823730469], [39.745540618896484, -105.22308349609375], [39.74555587768555, -105.22309112548828], [39.745574951171875, -105.22309875488281], [39.745601654052734, -105.22310638427734], [39.7456169128418, -105.22310638427734], [39.74563217163086, -105.22310638427734], [39.745662689208984, -105.22310638427734], [39.74568176269531, -105.22309875488281], [39.745697021484375, -105.22309112548828], [39.745723724365234, -105.22308349609375], [39.74573516845703, -105.22307586669922], [39.745758056640625, -105.22305297851562], [39.74576950073242, -105.2230453491211], [39.745784759521484, -105.22303009033203], [39.74580383300781, -105.2229995727539], [39.74589157104492, -105.2228775024414], [39.74600601196289, -105.22266387939453], [39.746158599853516, -105.2223892211914], [39.746360778808594, -105.22201538085938], [39.74644088745117, -105.22187042236328], [39.746482849121094, -105.22179412841797], [39.74652099609375, -105.22173309326172], [39.746551513671875, -105.2216796875], [39.746578216552734, -105.22162628173828], [39.7465934753418, -105.2215805053711], [39.74660110473633, -105.22154998779297], [39.746604919433594, -105.22151184082031], [39.746604919433594, -105.22146606445312], [39.74660110473633, -105.221435546875], [39.74658966064453, -105.22138977050781], [39.74658203125, -105.22135925292969], [39.746578216552734, -105.22132873535156], [39.746578216552734, -105.22130584716797], [39.74658203125, -105.22127532958984], [39.746585845947266, -105.22125244140625], [39.74659729003906, -105.22122955322266], [39.746612548828125, -105.22119903564453], [39.74662780761719, -105.22118377685547], [39.746646881103516, -105.2211685180664], [39.74666976928711, -105.22115325927734], [39.7466926574707, -105.22115325927734], [39.7467155456543, -105.22115325927734], [39.74671936035156, -105.22115325927734], [39.74678039550781, -105.22113037109375], [39.74681091308594, -105.22112274169922], [39.74683380126953, -105.22109985351562], [39.74686813354492, -105.2210693359375], [39.74688720703125, -105.22103881835938], [39.74690628051758, -105.22100067138672], [39.74697494506836, -105.22087097167969], [39.747108459472656, -105.22065734863281], [39.74713897705078, -105.22061157226562], [39.74715805053711, -105.2205810546875], [39.74720764160156, -105.22053527832031], [39.747337341308594, -105.22029876708984], [39.74735641479492, -105.22021484375], [39.74736785888672, -105.22018432617188], [39.74738311767578, -105.22015380859375], [39.74750900268555, -105.21992492675781], [39.74758529663086, -105.21979522705078], [39.74762725830078, -105.21974182128906], [39.7476921081543, -105.21965026855469], [39.747772216796875, -105.2195053100586], [39.747886657714844, -105.21929931640625], [39.747920989990234, -105.21923828125], [39.74795150756836, -105.21917724609375], [39.74809646606445, -105.21891784667969], [39.74813461303711, -105.2188491821289], [39.74825668334961, -105.2186279296875], [39.74848556518555, -105.21822357177734], [39.74851608276367, -105.2181625366211], [39.74856185913086, -105.21808624267578], [39.74905014038086, -105.2171630859375], [39.74909591674805, -105.21708679199219], [39.74912643432617, -105.217041015625], [39.74937438964844, -105.21658325195312], [39.74968338012695, -105.21601104736328], [39.74974822998047, -105.21607208251953], [39.750457763671875, -105.21675109863281], [39.75050735473633, -105.21680450439453], [39.750572204589844, -105.21685791015625], [39.750953674316406, -105.21720886230469], [39.751258850097656, -105.21749114990234], [39.7513313293457, -105.2175521850586], [39.75138854980469, -105.21760559082031], [39.751747131347656, -105.21793365478516], [39.75209426879883, -105.21826171875], [39.75214767456055, -105.21830749511719], [39.75221252441406, -105.21836853027344], [39.75230026245117, -105.21845245361328], [39.752506256103516, -105.21864318847656], [39.752716064453125, -105.21883392333984], [39.75289535522461, -105.21900177001953], [39.752960205078125, -105.21906280517578], [39.75303268432617, -105.21913146972656], [39.75370407104492, -105.21977233886719], [39.75376510620117, -105.21983337402344], [39.75382995605469, -105.21989440917969], [39.754234313964844, -105.22026062011719], [39.7545280456543, -105.22054290771484], [39.75458526611328, -105.2206039428711], [39.754661560058594, -105.22067260742188], [39.755332946777344, -105.22127532958984], [39.75540542602539, -105.22134399414062], [39.755489349365234, -105.22142028808594], [39.75614929199219, -105.22203826904297], [39.7562255859375, -105.22211456298828], [39.75630187988281, -105.22218322753906], [39.75661849975586, -105.22248077392578], [39.756629943847656, -105.22249603271484], [39.7569465637207, -105.22279357910156], [39.757057189941406, -105.22289276123047], [39.75748062133789, -105.2232666015625], [39.7575569152832, -105.22334289550781], [39.75762176513672, -105.22340393066406], [39.75785827636719, -105.22361755371094], [39.75796890258789, -105.22372436523438], [39.75800323486328, -105.2237548828125], [39.75830078125, -105.22405242919922], [39.758358001708984, -105.22410583496094], [39.758724212646484, -105.22444152832031], [39.75880432128906, -105.22451782226562], [39.759159088134766, -105.224853515625], [39.7595100402832, -105.22517395019531], [39.75968933105469, -105.225341796875], [39.7597541809082, -105.22540283203125], [39.75988006591797, -105.22551727294922], [39.75989532470703, -105.22553253173828], [39.75996398925781, -105.22560119628906], [39.76001739501953, -105.22564697265625], [39.76040267944336, -105.22599029541016], [39.76050567626953, -105.22608947753906], [39.76059341430664, -105.2261734008789], [39.76066589355469, -105.22624206542969], [39.76079559326172, -105.22636413574219], [39.7608757019043, -105.2264404296875], [39.76158142089844, -105.22710418701172], [39.761627197265625, -105.2271499633789], [39.761680603027344, -105.22720336914062], [39.762203216552734, -105.22769165039062], [39.7623405456543, -105.22782897949219], [39.763038635253906, -105.22845458984375], [39.763282775878906, -105.22866821289062], [39.763736724853516, -105.22906494140625], [39.764015197753906, -105.22930908203125], [39.764095306396484, -105.22937774658203], [39.76417541503906, -105.22946166992188], [39.76435852050781, -105.22965240478516], [39.7645378112793, -105.22986602783203], [39.76482391357422, -105.23019409179688], [39.76520538330078, -105.23070526123047], [39.765472412109375, -105.2310791015625], [39.765480041503906, -105.23109436035156], [39.76552963256836, -105.23117065429688], [39.76557922363281, -105.23123168945312], [39.76559066772461, -105.23124694824219], [39.76577377319336, -105.23150634765625], [39.76589584350586, -105.23167419433594], [39.765995025634766, -105.23180389404297], [39.7661018371582, -105.23192596435547], [39.7662467956543, -105.23206329345703], [39.76645278930664, -105.23226165771484], [39.76714324951172, -105.23292541503906], [39.767356872558594, -105.23312377929688], [39.76744079589844, -105.23320770263672], [39.76751708984375, -105.23328399658203], [39.767574310302734, -105.23335266113281], [39.76762771606445, -105.2334213256836], [39.767696380615234, -105.23353576660156], [39.767730712890625, -105.23360443115234], [39.76776123046875, -105.2336654663086], [39.767791748046875, -105.2337417602539], [39.767818450927734, -105.23381042480469], [39.76785659790039, -105.23394012451172], [39.76787185668945, -105.2340316772461], [39.76789093017578, -105.23412322998047], [39.76790237426758, -105.2342300415039], [39.76791000366211, -105.23433685302734], [39.767906188964844, -105.23440551757812], [39.76790237426758, -105.2344970703125], [39.767887115478516, -105.23466491699219], [39.76786422729492, -105.23477935791016], [39.76783752441406, -105.2348861694336], [39.767799377441406, -105.23503112792969], [39.76775360107422, -105.2352066040039], [39.7677116394043, -105.23534393310547]],\n", + " {"bubblingMouseEvents": true, "color": "#eff821", "dashArray": null, "dashOffset": null, "fill": false, "fillColor": "#eff821", "fillOpacity": 0.2, "fillRule": "evenodd", "lineCap": "round", "lineJoin": "round", "noClip": false, "opacity": 0.8, "smoothFactor": 1.0, "stroke": true, "weight": 10}\n", + " ).addTo(map_75c2c9742d22aa678c2dac182a4fdbb3);\n", " \n", " \n", - " poly_line_65238bc693e1ad88cf59f0194d5d9746.bindTooltip(\n", + " poly_line_c29dfba3ce607b0930502e207d845303.bindTooltip(\n", " `<div>\n", - " 0.17380614026267308\n", + " 1.7531906338670376\n", " </div>`,\n", " {"sticky": true}\n", " );\n", " \n", " \n", - " var marker_2ccc5454b28a68f8ca7305306277126b = L.marker(\n", - " [39.7273069, -105.1994169],\n", + " var marker_abae1fa0119b004cea180e155fc27528 = L.marker(\n", + " [39.7273063659668, -105.19941711425781],\n", " {}\n", - " ).addTo(map_a500a5662e07171781edbd5859e8c1b4);\n", + " ).addTo(map_75c2c9742d22aa678c2dac182a4fdbb3);\n", " \n", " \n", - " var icon_444e8d442d34e65fa6cfbe15deeeb968 = L.AwesomeMarkers.icon(\n", + " var icon_2dea6fce008c1dd5731c1de2cd9a02fd = L.AwesomeMarkers.icon(\n", " {"extraClasses": "fa-rotate-0", "icon": "circle", "iconColor": "white", "markerColor": "green", "prefix": "fa"}\n", " );\n", - " marker_2ccc5454b28a68f8ca7305306277126b.setIcon(icon_444e8d442d34e65fa6cfbe15deeeb968);\n", + " marker_abae1fa0119b004cea180e155fc27528.setIcon(icon_2dea6fce008c1dd5731c1de2cd9a02fd);\n", " \n", " \n", - " marker_2ccc5454b28a68f8ca7305306277126b.bindTooltip(\n", + " marker_abae1fa0119b004cea180e155fc27528.bindTooltip(\n", " `<div>\n", " Origin\n", " </div>`,\n", @@ -783,19 +867,19 @@ " );\n", " \n", " \n", - " var marker_7ec73eff54710ad9dbaaf7e1e6cbd763 = L.marker(\n", - " [39.7677119, -105.2353468],\n", + " var marker_578b2fd11a16779ab274945dea09cf6b = L.marker(\n", + " [39.7677116394043, -105.23534393310547],\n", " {}\n", - " ).addTo(map_a500a5662e07171781edbd5859e8c1b4);\n", + " ).addTo(map_75c2c9742d22aa678c2dac182a4fdbb3);\n", " \n", " \n", - " var icon_cb1e2db8619694a51bdb328e463a2178 = L.AwesomeMarkers.icon(\n", + " var icon_437eb59ef0018f80d8843428b0195aba = L.AwesomeMarkers.icon(\n", " {"extraClasses": "fa-rotate-0", "icon": "circle", "iconColor": "white", "markerColor": "red", "prefix": "fa"}\n", " );\n", - " marker_7ec73eff54710ad9dbaaf7e1e6cbd763.setIcon(icon_cb1e2db8619694a51bdb328e463a2178);\n", + " marker_578b2fd11a16779ab274945dea09cf6b.setIcon(icon_437eb59ef0018f80d8843428b0195aba);\n", " \n", " \n", - " marker_7ec73eff54710ad9dbaaf7e1e6cbd763.bindTooltip(\n", + " marker_578b2fd11a16779ab274945dea09cf6b.bindTooltip(\n", " `<div>\n", " Destination\n", " </div>`,\n", @@ -803,33 +887,33 @@ " );\n", " \n", " \n", - " var poly_line_ff15152996e3006e6a40c57671d6c306 = L.polyline(\n", - " [[39.7273069, -105.1994169], [39.7272989, -105.1994535], [39.7272848, -105.1994868], [39.7272593, -105.1995218], [39.7272272, -105.1995461], [39.7271912, -105.1995576], [39.7271688, -105.199558], [39.7271461, -105.1995532], [39.7271142, -105.1995365], [39.7270868, -105.1995096], [39.7270657, -105.1994741], [39.7270519, -105.1994296], [39.7270483, -105.1993816], [39.727052, -105.1993539], [39.7270571, -105.1993247], [39.7270719, -105.1992916], [39.7270973, -105.1992566], [39.7271293, -105.1992323], [39.7271651, -105.1992207], [39.7271854, -105.1992226], [39.7272113, -105.199227], [39.7273496, -105.1991687], [39.7274185, -105.1991465], [39.7275326, -105.1990928], [39.7276828, -105.1990602], [39.7277455, -105.1990518], [39.7279702, -105.1990232], [39.7281558, -105.1990357], [39.7284384, -105.1990893], [39.7286639, -105.199177], [39.7288222, -105.1992773], [39.7289214, -105.199385], [39.7290292, -105.1995543], [39.7290506, -105.1995879], [39.7292157, -105.1998155], [39.7293094, -105.1998945], [39.7294079, -105.1999604], [39.7295437, -105.200014], [39.7296299, -105.2000721], [39.7297292, -105.2000757], [39.7297135, -105.2007081], [39.7297192, -105.2013106], [39.7298153, -105.2032041], [39.7298256, -105.2033784], [39.7298664, -105.2035708], [39.7298795, -105.203649], [39.7299267, -105.2038558], [39.7301082, -105.2042608], [39.7304911, -105.2048068], [39.7308741, -105.2053111], [39.7310676, -105.2055985], [39.7311933, -105.205824], [39.7312069, -105.2058543], [39.7313075, -105.2061158], [39.731348, -105.206248], [39.731386, -105.2064213], [39.7314237, -105.2067336], [39.731429, -105.2070565], [39.7314226, -105.207224], [39.7314076, -105.2074036], [39.7313611, -105.2077675], [39.7313265, -105.2079124], [39.7312831, -105.20806], [39.7312292, -105.2082086], [39.7311706, -105.208344], [39.7310965, -105.2084777], [39.7310049, -105.208616], [39.7309234, -105.2087235], [39.7308212, -105.2088303], [39.7306227, -105.2089819], [39.7304801, -105.2090736], [39.7303681, -105.2091988], [39.7303327, -105.2092597], [39.7303114, -105.2093181], [39.730299, -105.20939], [39.7302939, -105.2095126], [39.7303105, -105.2096804], [39.7304414, -105.2099267], [39.7305001, -105.2100344], [39.7305871, -105.2101842], [39.7307404, -105.2104481], [39.7309234, -105.2107229], [39.7310934, -105.2109639], [39.731238, -105.211145], [39.7314101, -105.2113464], [39.7315783, -105.2115336], [39.7317541, -105.2117064], [39.7319796, -105.2119089], [39.732359, -105.2122393], [39.7329187, -105.2127184], [39.7334557, -105.213188], [39.7338968, -105.2135676], [39.7342777, -105.2138968], [39.7347139, -105.2142786], [39.7354652, -105.2149301], [39.7356319, -105.2150733], [39.7358844, -105.2152902], [39.7363901, -105.2157275], [39.7369129, -105.2161859], [39.7377243, -105.2168831], [39.7390882, -105.2180682], [39.7397882, -105.2186718], [39.7403043, -105.2191078], [39.7405645, -105.2193336], [39.7406767, -105.2194225], [39.7415803, -105.2202142], [39.7416486, -105.2202727], [39.7417047, -105.2203151], [39.7421502, -105.2206932], [39.7425816, -105.221062], [39.7432687, -105.2215398], [39.7435797, -105.2217631], [39.7436721, -105.2218299], [39.7437366, -105.2218764], [39.7438794, -105.2219759], [39.7439546, -105.2220253], [39.7440082, -105.2220586], [39.7440819, -105.2221021], [39.7441377, -105.2221322], [39.7441808, -105.2221541], [39.7442796, -105.2222043], [39.7443357, -105.2222286], [39.7444062, -105.222259], [39.7444657, -105.2222871], [39.7444962, -105.2223029], [39.7445695, -105.2223431], [39.7446343, -105.2223808], [39.744683, -105.2224104], [39.7447215, -105.2224349], [39.7447658, -105.2224654], [39.744813, -105.222499], [39.7448547, -105.2225315], [39.7448881, -105.2225586], [39.7449328, -105.2225965], [39.7449815, -105.2226391], [39.7451542, -105.2227925], [39.7454784, -105.2230438], [39.7455034, -105.2230623], [39.7455159, -105.2230713], [39.7455403, -105.2230861], [39.7455548, -105.2230941], [39.7455766, -105.2231014], [39.7456018, -105.223106], [39.7456176, -105.2231071], [39.7456337, -105.223107], [39.7456638, -105.2231045], [39.7456814, -105.2231011], [39.7456983, -105.2230945], [39.7457224, -105.2230821], [39.7457338, -105.2230745], [39.7457588, -105.2230543], [39.7457709, -105.223043], [39.7457834, -105.2230284], [39.7458035, -105.2230027], [39.7458905, -105.2228787], [39.7460068, -105.2226624], [39.7461589, -105.2223894], [39.7463617, -105.2220126], [39.7464427, -105.2218672], [39.746482, -105.2217968], [39.7465202, -105.2217322], [39.7465523, -105.2216771], [39.7465774, -105.2216276], [39.7465928, -105.2215823], [39.7466004, -105.2215466], [39.7466042, -105.2215101], [39.7466044, -105.2214695], [39.746601, -105.2214368], [39.7465881, -105.2213862], [39.7465804, -105.2213567], [39.7465774, -105.2213321], [39.7465774, -105.2213048], [39.746581, -105.2212762], [39.7465874, -105.2212518], [39.7465978, -105.2212266], [39.7466125, -105.2212024], [39.7466266, -105.2211858], [39.7466485, -105.2211678], [39.7466708, -105.2211566], [39.746693, -105.2211511], [39.746715, -105.2211506], [39.7467203, -105.2211517], [39.7467368, -105.2211551], [39.746758, -105.2211644], [39.7467794, -105.22118], [39.7468005, -105.2212036], [39.7468158, -105.2212297], [39.7468274, -105.2212608], [39.7468335, -105.2212915], [39.7468351, -105.2213231], [39.7468329, -105.221342], [39.7468424, -105.2213774], [39.7468525, -105.2214063], [39.7468707, -105.2214355], [39.7468968, -105.2214704], [39.7469659, -105.221539], [39.7469796, -105.2215513], [39.7470109, -105.2215854], [39.747091, -105.221673], [39.7475229, -105.2220864], [39.7475611, -105.2221229], [39.7475275, -105.2221851], [39.7475168, -105.2222049], [39.7474637, -105.2222843], [39.7474237, -105.2223246], [39.7473813, -105.2223662], [39.7472878, -105.2224252], [39.7471231, -105.2225292], [39.7471061, -105.2225399], [39.7469519, -105.2226243], [39.7469006, -105.2226617], [39.7468528, -105.2226966], [39.7468137, -105.2227287], [39.7467833, -105.2227708], [39.7467557, -105.2228147], [39.7467092, -105.2229215], [39.7466701, -105.2230644], [39.7466613, -105.2231401], [39.7466585, -105.2232929], [39.7466661, -105.2233761], [39.7467105, -105.2235352], [39.7467554, -105.2236486], [39.7468039, -105.2237398], [39.7468721, -105.2238447], [39.746992, -105.2240038], [39.7470769, -105.2240953], [39.7471363, -105.2241593], [39.7473549, -105.2243632], [39.7474108, -105.2244089], [39.7474935, -105.2244409], [39.747554, -105.2244452], [39.7476642, -105.2244234], [39.7477633, -105.2243894], [39.7478459, -105.2243611], [39.7479198, -105.2243464], [39.7479582, -105.2243442], [39.7480258, -105.2243477], [39.7480437, -105.2243486], [39.7481411, -105.2243699], [39.748221, -105.2243954], [39.7482621, -105.2244117], [39.7482717, -105.2244169], [39.7483463, -105.2244572], [39.7483953, -105.2244905], [39.7486772, -105.2247127], [39.748752, -105.2247832], [39.7487871, -105.2248199], [39.748826, -105.2248714], [39.7488526, -105.2249139], [39.7489016, -105.224992], [39.7489727, -105.2251312], [39.7490204, -105.2252729], [39.7490728, -105.2254666], [39.7490911, -105.2255223], [39.7491244, -105.2256047], [39.7491408, -105.2256259], [39.7491772, -105.225673], [39.7493008, -105.225766], [39.7493912, -105.2258152], [39.7494764, -105.2258429], [39.7495797, -105.2258532], [39.749646, -105.2258446], [39.7497554, -105.2258136], [39.7498579, -105.2257727], [39.7499519, -105.2257104], [39.7500308, -105.2256347], [39.7501101, -105.2255404], [39.7501431, -105.2254882], [39.7502132, -105.2253771], [39.7503968, -105.225073], [39.7504416, -105.2249951], [39.7504554, -105.2249667], [39.7505036, -105.224859], [39.7507062, -105.2243593], [39.7507478, -105.2242667], [39.7507776, -105.2242029], [39.7508241, -105.2241077], [39.7509036, -105.2239592], [39.7509367, -105.2239024], [39.7509527, -105.2238763], [39.7509871, -105.2238288], [39.7510406, -105.2237666], [39.751402, -105.2241138], [39.7514412, -105.2241437], [39.7517023, -105.2243791], [39.7518429, -105.2245058], [39.7521882, -105.224817], [39.7522382, -105.2248621], [39.7522849, -105.2249036], [39.7526503, -105.2252286], [39.7529794, -105.2255347], [39.752993, -105.2255475], [39.7530598, -105.2256106], [39.7531217, -105.2256699], [39.7531443, -105.2256914], [39.7534655, -105.225998], [39.7538055, -105.226311], [39.7538795, -105.2263799], [39.7539122, -105.226324], [39.7539434, -105.2262712], [39.7543231, -105.2255883], [39.7544155, -105.2254073], [39.7544655, -105.2253188], [39.7550579, -105.2242634], [39.7551094, -105.2241682], [39.7555015, -105.2234469], [39.7555455, -105.2233658], [39.7555511, -105.2233555], [39.7556057, -105.2232549], [39.7556344, -105.223202], [39.7556433, -105.2231856], [39.7559106, -105.2226938], [39.7559242, -105.2226686], [39.7561548, -105.2222441], [39.7562254, -105.2221143], [39.7563006, -105.2221853], [39.7566193, -105.222483], [39.7566315, -105.2224957], [39.7569475, -105.2227913], [39.7570561, -105.222895], [39.7574792, -105.2232693], [39.7575579, -105.2233409], [39.7576236, -105.2234019], [39.7578565, -105.2236199], [39.7579703, -105.2237258], [39.7580027, -105.2237561], [39.7583001, -105.2240544], [39.7583591, -105.2241084], [39.7587249, -105.2244446], [39.7588057, -105.22452], [39.7591609, -105.2248516], [39.7595089, -105.2251741], [39.7596887, -105.2253408], [39.7597554, -105.2254024], [39.7598802, -105.2255173], [39.7598939, -105.2255305], [39.7599658, -105.2255988], [39.7600186, -105.2256498], [39.7604008, -105.2259941], [39.7605066, -105.2260931], [39.7604158, -105.226234], [39.7593945, -105.2275079], [39.7589547, -105.2282335], [39.7585644, -105.2289396], [39.7583847, -105.2292646], [39.758008, -105.2299492], [39.757566, -105.2307486], [39.7570891, -105.2316082], [39.7565974, -105.2325011], [39.7563495, -105.232953], [39.7559547, -105.2336566], [39.7557955, -105.2339443], [39.7555976, -105.2342974], [39.7553912, -105.2346774], [39.7551878, -105.2350809], [39.7550759, -105.235333], [39.7549265, -105.2358607], [39.7549209, -105.2359533], [39.7549265, -105.2360192], [39.7549471, -105.2360777], [39.7549647, -105.236107], [39.7549846, -105.2361411], [39.7550315, -105.2361947], [39.7550821, -105.2362337], [39.7554495, -105.2363817], [39.755489, -105.2363769], [39.7555341, -105.2363696], [39.7555919, -105.2363589], [39.755646, -105.2363469], [39.7557268, -105.2363248], [39.7557557, -105.236315], [39.7558062, -105.2362953], [39.7558589, -105.2362727], [39.7559651, -105.236216], [39.7560638, -105.2361564], [39.7561451, -105.2361007], [39.7562524, -105.2360161], [39.7563484, -105.2359317], [39.7564304, -105.2358483], [39.7565371, -105.2357392], [39.7567285, -105.235533], [39.7568678, -105.2353926], [39.7569901, -105.23528], [39.7571418, -105.235177], [39.7574454, -105.2350139], [39.7582042, -105.2346535], [39.7586462, -105.2344732], [39.7591675, -105.2342329], [39.7603288, -105.2337265], [39.7605663, -105.2336321], [39.7608566, -105.2335291], [39.7611667, -105.2334518], [39.7615692, -105.2333746], [39.7620508, -105.2333317], [39.7624137, -105.2333131], [39.7629188, -105.2333641], [39.7632549, -105.2334204], [39.7635435, -105.2334901], [39.7637953, -105.2335499], [39.7638755, -105.2335847], [39.7639662, -105.2336121], [39.7646239, -105.2338896], [39.7649, -105.2340198], [39.7675897, -105.2352879], [39.7677119, -105.2353468]],\n", - " {"bubblingMouseEvents": true, "color": "#eff821", "dashArray": null, "dashOffset": null, "fill": false, "fillColor": "#eff821", "fillOpacity": 0.2, "fillRule": "evenodd", "lineCap": "round", "lineJoin": "round", "noClip": false, "opacity": 0.8, "smoothFactor": 1.0, "stroke": true, "weight": 10}\n", - " ).addTo(map_a500a5662e07171781edbd5859e8c1b4);\n", + " var poly_line_72c81ca9e1fa1fd1f2e995f2835bd738 = L.polyline(\n", + " [[39.7273063659668, -105.19941711425781], [39.727298736572266, -105.19945526123047], [39.7272834777832, -105.1994857788086], [39.72726058959961, -105.19952392578125], [39.72722625732422, -105.19954681396484], [39.72719192504883, -105.19955444335938], [39.727169036865234, -105.19955444335938], [39.72714614868164, -105.19955444335938], [39.727115631103516, -105.19953918457031], [39.72708511352539, -105.19950866699219], [39.72706604003906, -105.19947052001953], [39.72705078125, -105.19943237304688], [39.727046966552734, -105.19937896728516], [39.72705078125, -105.19935607910156], [39.72705841064453, -105.19932556152344], [39.727073669433594, -105.19929504394531], [39.72709655761719, -105.19925689697266], [39.72713088989258, -105.19923400878906], [39.72716522216797, -105.19921875], [39.7271842956543, -105.19922637939453], [39.727210998535156, -105.19922637939453], [39.72734832763672, -105.19916534423828], [39.7274169921875, -105.19915008544922], [39.72753143310547, -105.19908905029297], [39.727684020996094, -105.19905853271484], [39.727745056152344, -105.19905090332031], [39.727970123291016, -105.19902038574219], [39.72815704345703, -105.19903564453125], [39.72843933105469, -105.19908905029297], [39.72866439819336, -105.19918060302734], [39.72882080078125, -105.19927978515625], [39.728919982910156, -105.19938659667969], [39.72903060913086, -105.19955444335938], [39.72904968261719, -105.1995849609375], [39.729217529296875, -105.19981384277344], [39.72930908203125, -105.19989776611328], [39.729408264160156, -105.19995880126953], [39.72954559326172, -105.20001220703125], [39.72962951660156, -105.2000732421875], [39.72964859008789, -105.19967651367188], [39.72967529296875, -105.19873046875], [39.72969055175781, -105.19867706298828], [39.7297248840332, -105.1985855102539], [39.72972869873047, -105.19841766357422], [39.72997283935547, -105.19841766357422], [39.7302131652832, -105.19842529296875], [39.730323791503906, -105.19842529296875], [39.73044204711914, -105.19844055175781], [39.73056411743164, -105.19847106933594], [39.730716705322266, -105.19851684570312], [39.73085021972656, -105.19856262207031], [39.73099136352539, -105.1986312866211], [39.73112869262695, -105.19871520996094], [39.73122787475586, -105.19879150390625], [39.73133087158203, -105.1988754272461], [39.73143005371094, -105.19895935058594], [39.73152542114258, -105.19905853271484], [39.73160934448242, -105.19915008544922], [39.73170852661133, -105.19926452636719], [39.73185729980469, -105.19944763183594], [39.73195266723633, -105.19956970214844], [39.73204040527344, -105.19966888427734], [39.73213577270508, -105.19976043701172], [39.732261657714844, -105.1998519897461], [39.73236846923828, -105.19991302490234], [39.73247146606445, -105.19996643066406], [39.73258972167969, -105.20000457763672], [39.732688903808594, -105.20002746582031], [39.7327995300293, -105.20006561279297], [39.73294448852539, -105.20010375976562], [39.733062744140625, -105.20013427734375], [39.733184814453125, -105.20018768310547], [39.73329162597656, -105.20025634765625], [39.73343276977539, -105.20036315917969], [39.733524322509766, -105.20045471191406], [39.733551025390625, -105.20048522949219], [39.733612060546875, -105.20055389404297], [39.73368835449219, -105.20065307617188], [39.733768463134766, -105.20075225830078], [39.73384094238281, -105.20085144042969], [39.73393630981445, -105.20094299316406], [39.73403549194336, -105.20101165771484], [39.734073638916016, -105.20104217529297], [39.73411178588867, -105.20106506347656], [39.734153747558594, -105.20108795166016], [39.73421096801758, -105.20111846923828], [39.734317779541016, -105.201171875], [39.734405517578125, -105.20120239257812], [39.73456954956055, -105.20124053955078], [39.734771728515625, -105.20127868652344], [39.73513412475586, -105.20133209228516], [39.73522186279297, -105.20134735107422], [39.73532485961914, -105.20135498046875], [39.735443115234375, -105.20134735107422], [39.73554992675781, -105.20132446289062], [39.73570251464844, -105.20128631591797], [39.73583984375, -105.20125579833984], [39.736244201660156, -105.20116424560547], [39.736717224121094, -105.20106506347656], [39.736785888671875, -105.20105743408203], [39.736854553222656, -105.20104217529297], [39.73696517944336, -105.20103454589844], [39.73707580566406, -105.20104217529297], [39.73719024658203, -105.20106506347656], [39.7373161315918, -105.20109558105469], [39.73771286010742, -105.20123291015625], [39.73795700073242, -105.20130157470703], [39.73844528198242, -105.2014389038086], [39.738685607910156, -105.2015151977539], [39.73957061767578, -105.20178985595703], [39.739715576171875, -105.20183563232422], [39.73982620239258, -105.20186614990234], [39.73993682861328, -105.2018814086914], [39.74006271362305, -105.20189666748047], [39.74018478393555, -105.20189666748047], [39.74031448364258, -105.2018814086914], [39.74042892456055, -105.20186614990234], [39.74055099487305, -105.20183563232422], [39.740665435791016, -105.2018051147461], [39.740760803222656, -105.20177459716797], [39.74087142944336, -105.20172119140625], [39.74099349975586, -105.20165252685547], [39.741127014160156, -105.2015609741211], [39.74126052856445, -105.20144653320312], [39.741371154785156, -105.20134735107422], [39.74147415161133, -105.20123291015625], [39.741607666015625, -105.2010726928711], [39.74169158935547, -105.20096588134766], [39.741790771484375, -105.20083618164062], [39.741798400878906, -105.2008285522461], [39.74189758300781, -105.20068359375], [39.741886138916016, -105.20062255859375], [39.74188995361328, -105.2005615234375], [39.74190902709961, -105.20050048828125], [39.741939544677734, -105.200439453125], [39.741981506347656, -105.20040130615234], [39.74203109741211, -105.20037078857422], [39.74208450317383, -105.20036315917969], [39.74214172363281, -105.20037841796875], [39.7421875, -105.2004165649414], [39.742225646972656, -105.2004623413086], [39.742252349853516, -105.20052337646484], [39.74226379394531, -105.20059204101562], [39.74225997924805, -105.2006607055664], [39.74224090576172, -105.20072174072266], [39.742271423339844, -105.20082092285156], [39.7423210144043, -105.20089721679688], [39.74280548095703, -105.20165252685547], [39.74290466308594, -105.20181274414062], [39.74291229248047, -105.20182800292969], [39.74314880371094, -105.20220184326172], [39.743438720703125, -105.20264434814453], [39.74357986450195, -105.20286560058594], [39.743770599365234, -105.20318603515625], [39.74412536621094, -105.20372009277344], [39.74445343017578, -105.20423126220703], [39.744537353515625, -105.2043685913086], [39.744808197021484, -105.2048110961914], [39.74503707885742, -105.2052001953125], [39.74516296386719, -105.20543670654297], [39.745262145996094, -105.20564270019531], [39.745357513427734, -105.20587158203125], [39.74544143676758, -105.20606994628906], [39.74546813964844, -105.20613861083984], [39.74555969238281, -105.20635223388672], [39.74563980102539, -105.20661926269531], [39.74573516845703, -105.20690155029297], [39.745811462402344, -105.20716094970703], [39.74584197998047, -105.20729064941406], [39.745906829833984, -105.20751953125], [39.74595642089844, -105.20774841308594], [39.746009826660156, -105.2080078125], [39.74603271484375, -105.20811462402344], [39.74605178833008, -105.20826721191406], [39.7460823059082, -105.20848083496094], [39.74610900878906, -105.20861053466797], [39.746116638183594, -105.20870971679688], [39.74611282348633, -105.20880126953125], [39.74610900878906, -105.20891571044922], [39.746116638183594, -105.20899200439453], [39.74613952636719, -105.20906829833984], [39.746158599853516, -105.20911407470703], [39.74625015258789, -105.20921325683594], [39.746280670166016, -105.20923614501953], [39.74629592895508, -105.20925903320312], [39.74632263183594, -105.20928955078125], [39.74634552001953, -105.2093505859375], [39.746360778808594, -105.20942687988281], [39.74639129638672, -105.20957946777344], [39.746437072753906, -105.209716796875], [39.74650192260742, -105.20983123779297], [39.746707916259766, -105.21003723144531], [39.74678039550781, -105.2101058959961], [39.747337341308594, -105.21060180664062], [39.74745559692383, -105.21070861816406], [39.747562408447266, -105.21080780029297], [39.747596740722656, -105.2108383178711], [39.74765396118164, -105.21089172363281], [39.74814987182617, -105.21135711669922], [39.74833679199219, -105.21153259277344], [39.74837112426758, -105.21156311035156], [39.748416900634766, -105.21160888671875], [39.748470306396484, -105.21165466308594], [39.748722076416016, -105.21189880371094], [39.749237060546875, -105.21237182617188], [39.74928283691406, -105.21240997314453], [39.75000762939453, -105.21307373046875], [39.75004577636719, -105.2131118774414], [39.75038146972656, -105.21342468261719], [39.75046157836914, -105.2135009765625], [39.75082015991211, -105.21383666992188], [39.750877380371094, -105.2138900756836], [39.75093460083008, -105.21394348144531], [39.7511100769043, -105.214111328125], [39.75162887573242, -105.21460723876953], [39.751670837402344, -105.21464538574219], [39.751739501953125, -105.21470642089844], [39.75248336791992, -105.21539306640625], [39.75250244140625, -105.21541595458984], [39.75325012207031, -105.21611022949219], [39.75330352783203, -105.21615600585938], [39.75407028198242, -105.21686553955078], [39.75413131713867, -105.2169189453125], [39.754478454589844, -105.21724700927734], [39.75456237792969, -105.21731567382812], [39.754966735839844, -105.2176742553711], [39.755069732666016, -105.21782684326172], [39.755313873291016, -105.218017578125], [39.75534439086914, -105.21804809570312], [39.75570297241211, -105.21839141845703], [39.755775451660156, -105.21846008300781], [39.75583267211914, -105.21852111816406], [39.75590133666992, -105.21858215332031], [39.756038665771484, -105.21870422363281], [39.75616455078125, -105.21882629394531], [39.75627899169922, -105.21892547607422], [39.75651550292969, -105.21914672851562], [39.7565803527832, -105.21920776367188], [39.756526947021484, -105.21929931640625], [39.756473541259766, -105.21939849853516], [39.756324768066406, -105.21967315673828], [39.75604248046875, -105.2201919555664], [39.756011962890625, -105.22024536132812], [39.75606918334961, -105.22032165527344], [39.756256103515625, -105.22053527832031], [39.756282806396484, -105.2205581665039], [39.756404876708984, -105.2206802368164], [39.75654602050781, -105.2208023071289], [39.75674057006836, -105.220947265625], [39.75669860839844, -105.22109985351562], [39.75663757324219, -105.2213134765625], [39.75657272338867, -105.22146606445312], [39.75651931762695, -105.22156524658203], [39.7564582824707, -105.2216796875], [39.756290435791016, -105.22199249267578], [39.7562255859375, -105.22211456298828], [39.75630187988281, -105.22218322753906], [39.75661849975586, -105.22248077392578], [39.756629943847656, -105.22249603271484], [39.7569465637207, -105.22279357910156], [39.757057189941406, -105.22289276123047], [39.75748062133789, -105.2232666015625], [39.7575569152832, -105.22334289550781], [39.75762176513672, -105.22340393066406], [39.75785827636719, -105.22361755371094], [39.75796890258789, -105.22372436523438], [39.75800323486328, -105.2237548828125], [39.75830078125, -105.22405242919922], [39.758358001708984, -105.22410583496094], [39.758724212646484, -105.22444152832031], [39.75880432128906, -105.22451782226562], [39.759159088134766, -105.224853515625], [39.7595100402832, -105.22517395019531], [39.75968933105469, -105.225341796875], [39.7597541809082, -105.22540283203125], [39.75988006591797, -105.22551727294922], [39.75989532470703, -105.22553253173828], [39.75996398925781, -105.22560119628906], [39.76001739501953, -105.22564697265625], [39.76040267944336, -105.22599029541016], [39.76050567626953, -105.22608947753906], [39.76059341430664, -105.2261734008789], [39.76066589355469, -105.22624206542969], [39.76079559326172, -105.22636413574219], [39.7608757019043, -105.2264404296875], [39.76158142089844, -105.22710418701172], [39.761627197265625, -105.2271499633789], [39.761680603027344, -105.22720336914062], [39.762203216552734, -105.22769165039062], [39.7623405456543, -105.22782897949219], [39.763038635253906, -105.22845458984375], [39.763282775878906, -105.22866821289062], [39.763736724853516, -105.22906494140625], [39.764015197753906, -105.22930908203125], [39.764095306396484, -105.22937774658203], [39.76417541503906, -105.22946166992188], [39.76435852050781, -105.22965240478516], [39.7645378112793, -105.22986602783203], [39.76482391357422, -105.23019409179688], [39.76520538330078, -105.23070526123047], [39.765472412109375, -105.2310791015625], [39.765480041503906, -105.23109436035156], [39.76552963256836, -105.23117065429688], [39.76557922363281, -105.23123168945312], [39.76559066772461, -105.23124694824219], [39.76577377319336, -105.23150634765625], [39.76589584350586, -105.23167419433594], [39.765995025634766, -105.23180389404297], [39.7661018371582, -105.23192596435547], [39.7662467956543, -105.23206329345703], [39.76645278930664, -105.23226165771484], [39.76714324951172, -105.23292541503906], [39.767356872558594, -105.23312377929688], [39.76744079589844, -105.23320770263672], [39.76751708984375, -105.23328399658203], [39.767574310302734, -105.23335266113281], [39.76762771606445, -105.2334213256836], [39.767696380615234, -105.23353576660156], [39.767730712890625, -105.23360443115234], [39.76776123046875, -105.2336654663086], [39.767791748046875, -105.2337417602539], [39.767818450927734, -105.23381042480469], [39.76785659790039, -105.23394012451172], [39.76787185668945, -105.2340316772461], [39.76789093017578, -105.23412322998047], [39.76790237426758, -105.2342300415039], [39.76791000366211, -105.23433685302734], [39.767906188964844, -105.23440551757812], [39.76790237426758, -105.2344970703125], [39.767887115478516, -105.23466491699219], [39.76786422729492, -105.23477935791016], [39.76783752441406, -105.2348861694336], [39.767799377441406, -105.23503112792969], [39.76775360107422, -105.2352066040039], [39.7677116394043, -105.23534393310547]],\n", + " {"bubblingMouseEvents": true, "color": "#0c0786", "dashArray": null, "dashOffset": null, "fill": false, "fillColor": "#0c0786", "fillOpacity": 0.2, "fillRule": "evenodd", "lineCap": "round", "lineJoin": "round", "noClip": false, "opacity": 0.8, "smoothFactor": 1.0, "stroke": true, "weight": 10}\n", + " ).addTo(map_75c2c9742d22aa678c2dac182a4fdbb3);\n", " \n", " \n", - " poly_line_ff15152996e3006e6a40c57671d6c306.bindTooltip(\n", + " poly_line_72c81ca9e1fa1fd1f2e995f2835bd738.bindTooltip(\n", " `<div>\n", - " 0.21473093048428635\n", + " 1.7423185323233328\n", " </div>`,\n", " {"sticky": true}\n", " );\n", " \n", " \n", - " var marker_5cc5c596e276d2042d0226dc92e3213d = L.marker(\n", - " [39.7273069, -105.1994169],\n", + " var marker_d8f39c1b95d7892e27586425668509bc = L.marker(\n", + " [39.7273063659668, -105.19941711425781],\n", " {}\n", - " ).addTo(map_a500a5662e07171781edbd5859e8c1b4);\n", + " ).addTo(map_75c2c9742d22aa678c2dac182a4fdbb3);\n", " \n", " \n", - " var icon_c559bb12b045734775d6d2602ac3d1a5 = L.AwesomeMarkers.icon(\n", + " var icon_0e96f519d93efe7decd7ccdccbf78ebd = L.AwesomeMarkers.icon(\n", " {"extraClasses": "fa-rotate-0", "icon": "circle", "iconColor": "white", "markerColor": "green", "prefix": "fa"}\n", " );\n", - " marker_5cc5c596e276d2042d0226dc92e3213d.setIcon(icon_c559bb12b045734775d6d2602ac3d1a5);\n", + " marker_d8f39c1b95d7892e27586425668509bc.setIcon(icon_0e96f519d93efe7decd7ccdccbf78ebd);\n", " \n", " \n", - " marker_5cc5c596e276d2042d0226dc92e3213d.bindTooltip(\n", + " marker_d8f39c1b95d7892e27586425668509bc.bindTooltip(\n", " `<div>\n", " Origin\n", " </div>`,\n", @@ -837,19 +921,19 @@ " );\n", " \n", " \n", - " var marker_93707e47ac405357e7964d4969bbdfae = L.marker(\n", - " [39.7677119, -105.2353468],\n", + " var marker_6721034e55ef7f8890c6884ebda2ef21 = L.marker(\n", + " [39.7677116394043, -105.23534393310547],\n", " {}\n", - " ).addTo(map_a500a5662e07171781edbd5859e8c1b4);\n", + " ).addTo(map_75c2c9742d22aa678c2dac182a4fdbb3);\n", " \n", " \n", - " var icon_569fb26a5435064e7a907a28c976878f = L.AwesomeMarkers.icon(\n", + " var icon_77f2c024366d7c028cfb8546b70e9528 = L.AwesomeMarkers.icon(\n", " {"extraClasses": "fa-rotate-0", "icon": "circle", "iconColor": "white", "markerColor": "red", "prefix": "fa"}\n", " );\n", - " marker_93707e47ac405357e7964d4969bbdfae.setIcon(icon_569fb26a5435064e7a907a28c976878f);\n", + " marker_6721034e55ef7f8890c6884ebda2ef21.setIcon(icon_77f2c024366d7c028cfb8546b70e9528);\n", " \n", " \n", - " marker_93707e47ac405357e7964d4969bbdfae.bindTooltip(\n", + " marker_6721034e55ef7f8890c6884ebda2ef21.bindTooltip(\n", " `<div>\n", " Destination\n", " </div>`,\n", @@ -860,16 +944,16 @@ "</html>\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen>" ], "text/plain": [ - "" + "" ] }, - "execution_count": 16, + "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "m = plot_routes_folium(results, value_fn=lambda r: r[\"traversal_summary\"][\"vehicle\"][\"energy_liquid\"], color_map=\"plasma\")\n", + "m = plot_routes_folium(results, value_fn=lambda r: r[\"traversal_summary\"][\"energy_liquid\"], color_map=\"plasma\")\n", "m" ] }, @@ -898,7 +982,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.5" + "version": "3.9.15" } }, "nbformat": 4, diff --git a/python/nrel/routee/compass/io/generate_dataset.py b/python/nrel/routee/compass/io/generate_dataset.py index cb667617..55603150 100644 --- a/python/nrel/routee/compass/io/generate_dataset.py +++ b/python/nrel/routee/compass/io/generate_dataset.py @@ -162,7 +162,7 @@ def replace_id(vertex_uuid): # for now we'll just use the start heading. headings_df["end_heading"] = None headings_df.to_csv( - output_directory / "edges-headings-enumerated.csv.gz", + output_directory / "edges-headings-enumerated.txt.gz", index=False, compression="gzip", ) diff --git a/python/nrel/routee/compass/resources/osm_default_energy.toml b/python/nrel/routee/compass/resources/osm_default_energy.toml index 4f12618c..bc6a302d 100644 --- a/python/nrel/routee/compass/resources/osm_default_energy.toml +++ b/python/nrel/routee/compass/resources/osm_default_energy.toml @@ -45,12 +45,19 @@ energy_electric = 1 [traversal] type = "energy_model" +time_model_speed_unit = "kilometers_per_hour" +grade_table_input_file = "edges-grade-enumerated.txt.gz" +grade_table_grade_unit = "decimal" +time_unit = "minutes" +distance_unit = "miles" +headings_table_input_file = "edges-headings-enumerated.txt.gz" + +[traversal.time_model] +type = "speed_table" speed_table_input_file = "edges-posted-speed-enumerated.txt.gz" -speed_table_speed_unit = "kilometers_per_hour" -output_time_unit = "minutes" +speed_unit = "kilometers_per_hour" output_distance_unit = "miles" -headings_table_input_file = "edges-headings-enumerated.csv.gz" - +output_time_unit = "minutes" [[traversal.vehicles]] name = "2012_Ford_Focus" diff --git a/rust/routee-compass-core/src/algorithm/search/a_star/a_star_algorithm.rs b/rust/routee-compass-core/src/algorithm/search/a_star/a_star_algorithm.rs index 7ea63ff3..ccef5c7e 100644 --- a/rust/routee-compass-core/src/algorithm/search/a_star/a_star_algorithm.rs +++ b/rust/routee-compass-core/src/algorithm/search/a_star/a_star_algorithm.rs @@ -8,7 +8,8 @@ use crate::model::road_network::edge_id::EdgeId; use crate::model::road_network::graph::Graph; use crate::model::road_network::vertex_id::VertexId; use crate::model::termination::termination_model::TerminationModel; -use crate::model::traversal::state::traversal_state::TraversalState; +use crate::model::traversal::state::state_variable::StateVar; + use crate::model::traversal::traversal_model::TraversalModel; use crate::model::unit::cost::ReverseCost; use crate::model::unit::Cost; @@ -369,7 +370,7 @@ pub fn run_a_star_edge_oriented( pub fn h_cost( src: VertexId, dst: VertexId, - state: &TraversalState, + state: &[StateVar], g: &RwLockReadGuard, m: &Arc, u: &CostModel, diff --git a/rust/routee-compass-core/src/algorithm/search/edge_traversal.rs b/rust/routee-compass-core/src/algorithm/search/edge_traversal.rs index 83134fdd..03796a58 100644 --- a/rust/routee-compass-core/src/algorithm/search/edge_traversal.rs +++ b/rust/routee-compass-core/src/algorithm/search/edge_traversal.rs @@ -2,6 +2,7 @@ use super::search_error::SearchError; use crate::model::cost::cost_model::CostModel; use crate::model::road_network::edge_id::EdgeId; use crate::model::road_network::graph::Graph; +use crate::model::traversal::state::state_variable::StateVar; use crate::model::traversal::state::traversal_state::TraversalState; use crate::model::traversal::traversal_model::TraversalModel; use crate::model::unit::Cost; @@ -41,7 +42,7 @@ impl EdgeTraversal { pub fn perform_traversal( edge_id: EdgeId, prev_edge_id: Option, - prev_state: &TraversalState, + prev_state: &[StateVar], g: &RwLockReadGuard, tm: &Arc, um: &CostModel, diff --git a/rust/routee-compass-core/src/model/cost/cost_error.rs b/rust/routee-compass-core/src/model/cost/cost_error.rs index fd7662a0..03cf3b3f 100644 --- a/rust/routee-compass-core/src/model/cost/cost_error.rs +++ b/rust/routee-compass-core/src/model/cost/cost_error.rs @@ -7,8 +7,10 @@ pub enum CostError { }, #[error("invalid cost model configuration: {0}")] InvalidConfiguration(String), - #[error("expected state variable name {0} not found in {1} table")] - StateVariableNotFound(String, String), + #[error( + "expected state variable name {0} not found in {1} table. possible alternatives: {{2}}" + )] + StateVariableNotFound(String, String, String), #[error("index {0} for state variable {1} out of bounds, not found in traversal state")] StateIndexOutOfBounds(usize, String), #[error("invalid cost variables, sum of state variable coefficients must be non-zero")] diff --git a/rust/routee-compass-core/src/model/cost/cost_model.rs b/rust/routee-compass-core/src/model/cost/cost_model.rs index 31ae6f75..ddb2c7b7 100644 --- a/rust/routee-compass-core/src/model/cost/cost_model.rs +++ b/rust/routee-compass-core/src/model/cost/cost_model.rs @@ -5,7 +5,7 @@ use super::vehicle::vehicle_cost_rate::VehicleCostRate; use crate::model::cost::cost_error::CostError; use crate::model::property::edge::Edge; use crate::model::traversal::state::state_variable::StateVar; -use crate::model::traversal::state::traversal_state::TraversalState; + use crate::model::unit::Cost; use std::collections::HashMap; use std::sync::Arc; @@ -207,7 +207,7 @@ impl CostModel { /// A JSON serialized version of the state. This does not need to include /// additional details such as the units (kph, hours, etc), which can be /// summarized in the serialize_state_info method. - fn serialize_cost(&self, state: &TraversalState) -> Result { + fn serialize_cost(&self, state: &[StateVar]) -> Result { let mut state_variable_costs = self .state_variable_indices .iter() @@ -215,10 +215,19 @@ impl CostModel { let state_var = state .get(*idx) .ok_or_else(|| CostError::StateIndexOutOfBounds(*idx, name.clone()))?; + let rate = self.vehicle_state_variable_rates.get(*idx).ok_or_else(|| { + let alternatives = self + .state_variable_indices + .iter() + .filter(|(_, idx)| *idx < self.vehicle_state_variable_rates.len()) + .map(|(n, _)| n.to_string()) + .collect::>() + .join(","); CostError::StateVariableNotFound( name.clone(), - String::from("vehicle cost rates"), + String::from("vehicle cost rates while serializing cost"), + alternatives, ) })?; let cost = rate.map_value(*state_var); @@ -269,7 +278,7 @@ impl CostModel { /// and `serialize_cost_info`. pub fn serialize_cost_with_info( &self, - state: &TraversalState, + state: &[StateVar], ) -> Result { let mut output = serde_json::Map::new(); output.insert(String::from("cost"), self.serialize_cost(state)?); diff --git a/rust/routee-compass-core/src/model/cost/cost_ops.rs b/rust/routee-compass-core/src/model/cost/cost_ops.rs index 2f7c7822..bd6f316b 100644 --- a/rust/routee-compass-core/src/model/cost/cost_ops.rs +++ b/rust/routee-compass-core/src/model/cost/cost_ops.rs @@ -24,7 +24,17 @@ pub fn calculate_vehicle_costs( .ok_or_else(|| CostError::StateIndexOutOfBounds(*state_idx, name.clone()))?; let delta: StateVar = *next_state_var - *prev_state_var; let mapping = rates.get(model_idx).ok_or_else(|| { - CostError::StateVariableNotFound(name.clone(), String::from("vehicle_cost_rates")) + let alternatives = state_variable_indices + .iter() + .filter(|(_, idx)| *idx < rates.len()) + .map(|(n, _)| n.to_string()) + .collect::>() + .join(","); + CostError::StateVariableNotFound( + name.clone(), + String::from("vehicle cost rates while calculating costs"), + alternatives, + ) })?; let coefficient = state_variable_coefficients.get(model_idx).unwrap_or(&1.0); let delta_cost = mapping.map_value(delta); diff --git a/rust/routee-compass-core/src/model/frontier/frontier_model.rs b/rust/routee-compass-core/src/model/frontier/frontier_model.rs index 23366943..9800e22d 100644 --- a/rust/routee-compass-core/src/model/frontier/frontier_model.rs +++ b/rust/routee-compass-core/src/model/frontier/frontier_model.rs @@ -1,6 +1,5 @@ -use crate::model::{property::edge::Edge, traversal::state::traversal_state::TraversalState}; - use super::frontier_model_error::FrontierModelError; +use crate::model::{property::edge::Edge, traversal::state::state_variable::StateVar}; /// Validates edge and traversal states. Provides an API for removing edges from /// the frontier in a way that could be more efficient than modifying the [TraversalModel]. @@ -23,7 +22,7 @@ pub trait FrontierModel: Send + Sync { fn valid_frontier( &self, _edge: &Edge, - _state: &TraversalState, + _state: &[StateVar], _previous_edge: Option<&Edge>, ) -> Result { Ok(true) diff --git a/rust/routee-compass-core/src/model/traversal/default/distance_traversal_model.rs b/rust/routee-compass-core/src/model/traversal/default/distance_traversal_model.rs index 98343b52..17c3d5c3 100644 --- a/rust/routee-compass-core/src/model/traversal/default/distance_traversal_model.rs +++ b/rust/routee-compass-core/src/model/traversal/default/distance_traversal_model.rs @@ -30,14 +30,34 @@ impl TraversalModel for DistanceTraversalModel { vec![StateVar(0.0)] } - fn serialize_state(&self, state: &TraversalState) -> serde_json::Value { + fn get_state_variable( + &self, + key: &str, + state: &[StateVar], + ) -> Result { + let index = match key { + "distance" => Ok(0), + _ => Err(TraversalModelError::InternalError(format!( + "unknown state variable {}, i only know 'distance'", + key + ))), + }?; + let value_f64 = state.get(index).ok_or_else(|| { + TraversalModelError::InternalError(String::from( + "state variable distance with index 0 not found in state", + )) + })?; + Ok(*value_f64) + } + + fn serialize_state(&self, state: &[StateVar]) -> serde_json::Value { let total_distance = state[0].0; serde_json::json!({ "distance": total_distance }) } - fn serialize_state_info(&self, _state: &TraversalState) -> serde_json::Value { + fn serialize_state_info(&self, _state: &[StateVar]) -> serde_json::Value { serde_json::json!({ "distance_unit": self.distance_unit }) @@ -48,10 +68,10 @@ impl TraversalModel for DistanceTraversalModel { _src: &Vertex, edge: &Edge, _dst: &Vertex, - state: &TraversalState, + state: &[StateVar], ) -> Result { let distance = BASE_DISTANCE_UNIT.convert(edge.distance, self.distance_unit); - let mut updated_state = state.clone(); + let mut updated_state = state.to_vec(); updated_state[0] = state[0] + StateVar::from(distance); Ok(updated_state) } @@ -63,7 +83,7 @@ impl TraversalModel for DistanceTraversalModel { _v2: &Vertex, _dst: &Edge, _v3: &Vertex, - _state: &TraversalState, + _state: &[StateVar], ) -> Result, TraversalModelError> { Ok(None) } @@ -72,12 +92,12 @@ impl TraversalModel for DistanceTraversalModel { &self, src: &Vertex, dst: &Vertex, - state: &TraversalState, + state: &[StateVar], ) -> Result { let distance = haversine::coord_distance(&src.coordinate, &dst.coordinate, self.distance_unit) .map_err(TraversalModelError::NumericError)?; - let mut updated_state = state.clone(); + let mut updated_state = state.to_vec(); updated_state[0] = state[0] + StateVar::from(distance); Ok(updated_state) } diff --git a/rust/routee-compass-core/src/model/traversal/default/mod.rs b/rust/routee-compass-core/src/model/traversal/default/mod.rs index 60ccfa76..da18589a 100644 --- a/rust/routee-compass-core/src/model/traversal/default/mod.rs +++ b/rust/routee-compass-core/src/model/traversal/default/mod.rs @@ -1,2 +1,3 @@ pub mod distance_traversal_model; pub mod speed_traversal_model; +pub mod speed_traversal_service; diff --git a/rust/routee-compass-core/src/model/traversal/default/speed_traversal_model.rs b/rust/routee-compass-core/src/model/traversal/default/speed_traversal_model.rs index 2694e32f..2fd1f9d4 100644 --- a/rust/routee-compass-core/src/model/traversal/default/speed_traversal_model.rs +++ b/rust/routee-compass-core/src/model/traversal/default/speed_traversal_model.rs @@ -64,7 +64,29 @@ impl TraversalModel for SpeedTraversalModel { vec![StateVar(0.0), StateVar(0.0)] } - fn serialize_state(&self, state: &TraversalState) -> serde_json::Value { + fn get_state_variable( + &self, + key: &str, + state: &[StateVar], + ) -> Result { + let index = match key { + "distance" => Ok(0), + "time" => Ok(1), + _ => Err(TraversalModelError::InternalError(format!( + "unknown state variable {}, should be one of [distance, time]", + key + ))), + }?; + let value_f64 = state.get(index).ok_or_else(|| { + TraversalModelError::InternalError(format!( + "state variable {} with index {} not found in state", + key, index + )) + })?; + Ok(*value_f64) + } + + fn serialize_state(&self, state: &[StateVar]) -> serde_json::Value { let distance = get_distance_from_state(state); let time = get_time_from_state(state); serde_json::json!({ @@ -73,7 +95,7 @@ impl TraversalModel for SpeedTraversalModel { }) } - fn serialize_state_info(&self, _state: &TraversalState) -> serde_json::Value { + fn serialize_state_info(&self, _state: &[StateVar]) -> serde_json::Value { serde_json::json!({ "distance_unit": self.distance_unit, "time_unit": self.time_unit, @@ -85,7 +107,7 @@ impl TraversalModel for SpeedTraversalModel { _src: &Vertex, edge: &Edge, _dst: &Vertex, - state: &TraversalState, + state: &[StateVar], ) -> Result { let distance = BASE_DISTANCE_UNIT.convert(edge.distance, self.distance_unit); let speed = get_speed(&self.speed_table, edge.edge_id)?; @@ -108,7 +130,7 @@ impl TraversalModel for SpeedTraversalModel { _v2: &Vertex, _dst: &Edge, _v3: &Vertex, - _state: &TraversalState, + _state: &[StateVar], ) -> Result, TraversalModelError> { Ok(None) } @@ -117,14 +139,14 @@ impl TraversalModel for SpeedTraversalModel { &self, src: &Vertex, dst: &Vertex, - state: &TraversalState, + state: &[StateVar], ) -> Result { let distance = haversine::coord_distance(&src.coordinate, &dst.coordinate, self.distance_unit) .map_err(TraversalModelError::NumericError)?; if distance == Distance::ZERO { - return Ok(state.clone()); + return Ok(state.to_vec()); } let time = Time::create( @@ -140,18 +162,18 @@ impl TraversalModel for SpeedTraversalModel { } } -fn update_state(state: &TraversalState, distance: Distance, time: Time) -> TraversalState { - let mut updated_state = state.clone(); +fn update_state(state: &[StateVar], distance: Distance, time: Time) -> TraversalState { + let mut updated_state = state.to_vec(); updated_state[0] = state[0] + distance.into(); updated_state[1] = state[1] + time.into(); updated_state } -fn get_distance_from_state(state: &TraversalState) -> Distance { +fn get_distance_from_state(state: &[StateVar]) -> Distance { Distance::new(state[0].0) } -fn get_time_from_state(state: &TraversalState) -> Time { +fn get_time_from_state(state: &[StateVar]) -> Time { Time::new(state[1].0) } diff --git a/rust/routee-compass-core/src/model/traversal/default/speed_traversal_service.rs b/rust/routee-compass-core/src/model/traversal/default/speed_traversal_service.rs new file mode 100644 index 00000000..53ac5a47 --- /dev/null +++ b/rust/routee-compass-core/src/model/traversal/default/speed_traversal_service.rs @@ -0,0 +1,19 @@ +use super::speed_traversal_model::SpeedTraversalModel; +use crate::model::traversal::{ + traversal_model::TraversalModel, traversal_model_error::TraversalModelError, + traversal_model_service::TraversalModelService, +}; +use std::sync::Arc; + +pub struct SpeedLookupService { + pub m: Arc, +} + +impl TraversalModelService for SpeedLookupService { + fn build( + &self, + _parameters: &serde_json::Value, + ) -> Result, TraversalModelError> { + Ok(self.m.clone()) + } +} diff --git a/rust/routee-compass-core/src/model/traversal/traversal_model.rs b/rust/routee-compass-core/src/model/traversal/traversal_model.rs index 6889633f..02ea4ca8 100644 --- a/rust/routee-compass-core/src/model/traversal/traversal_model.rs +++ b/rust/routee-compass-core/src/model/traversal/traversal_model.rs @@ -1,3 +1,4 @@ +use super::state::state_variable::StateVar; use super::traversal_model_error::TraversalModelError; use crate::model::property::{edge::Edge, vertex::Vertex}; use crate::model::traversal::state::traversal_state::TraversalState; @@ -11,15 +12,36 @@ use crate::model::traversal::state::traversal_state::TraversalState; /// [DistanceModel]: super::default::distance::DistanceModel /// [SpeedLookupModel]: super::default::speed_lookup_model::SpeedLookupModel pub trait TraversalModel: Send + Sync { - /// Provides the list of state variable names in the order that they - /// appear in the TraversalState. for each state variable name, its position - /// in the result Vector is assumed to match the index of the state vector. + /// Provides the list of state variable names, sorted by index so that the names appear in the order + /// that the variables appear in the TraversalState. the resulting names vector can be used to support + /// communication in a heirarchical TraversalModel. /// /// # Returns /// - /// the names of the state + /// the names of the state variables in their index ordering fn state_variable_names(&self) -> Vec; + /// Extracts a state variable based on its name. + /// + /// A naive implementation would generate the state variable names, find their + /// indices, and then find a match, but this is inefficient. Therefore, TraversalModels + /// should hold a HashMap lookup table to give us the correct index + /// quickly. + /// + /// # Arguments + /// + /// * `key` - the variable name + /// * `state` - the state to extract state from + /// + /// # Returns + /// + /// The state variable, or an error + fn get_state_variable( + &self, + key: &str, + state: &[StateVar], + ) -> Result; + /// Creates the initial state of a search. this should be a vector of /// accumulators. /// @@ -45,7 +67,7 @@ pub trait TraversalModel: Send + Sync { src: &Vertex, edge: &Edge, dst: &Vertex, - state: &TraversalState, + state: &[StateVar], ) -> Result; /// Updates the traversal state by accessing some destination edge @@ -75,7 +97,7 @@ pub trait TraversalModel: Send + Sync { v2: &Vertex, dst: &Edge, v3: &Vertex, - state: &TraversalState, + state: &[StateVar], ) -> Result, TraversalModelError>; /// Estimates the traversal state by traversing between two vertices without @@ -94,7 +116,7 @@ pub trait TraversalModel: Send + Sync { &self, src: &Vertex, dst: &Vertex, - state: &TraversalState, + state: &[StateVar], ) -> Result; /// Serializes the traversal state into a JSON value. @@ -111,7 +133,7 @@ pub trait TraversalModel: Send + Sync { /// A JSON serialized version of the state. This does not need to include /// additional details such as the units (kph, hours, etc), which can be /// summarized in the serialize_state_info method. - fn serialize_state(&self, _state: &TraversalState) -> serde_json::Value { + fn serialize_state(&self, _state: &[StateVar]) -> serde_json::Value { serde_json::json!({}) } @@ -128,7 +150,7 @@ pub trait TraversalModel: Send + Sync { /// /// JSON containing information such as the units (kph, hours, etc) or other /// traversal info (charge events, days traveled, etc) - fn serialize_state_info(&self, _state: &TraversalState) -> serde_json::Value { + fn serialize_state_info(&self, _state: &[StateVar]) -> serde_json::Value { serde_json::json!({}) } @@ -143,7 +165,7 @@ pub trait TraversalModel: Send + Sync { /// /// JSON containing the state values and info described in `serialize_state` /// and `serialize_state_info`. - fn serialize_state_with_info(&self, state: &TraversalState) -> serde_json::Value { + fn serialize_state_with_info(&self, state: &[StateVar]) -> serde_json::Value { use serde_json::Value as Json; let mut summary = self.serialize_state(state); let summary_info = match self.serialize_state_info(state) { diff --git a/rust/routee-compass-powertrain/src/routee/energy_model_service.rs b/rust/routee-compass-powertrain/src/routee/energy_model_service.rs index 6b4c2600..d7b83317 100644 --- a/rust/routee-compass-powertrain/src/routee/energy_model_service.rs +++ b/rust/routee-compass-powertrain/src/routee/energy_model_service.rs @@ -1,7 +1,7 @@ use super::energy_traversal_model::EnergyTraversalModel; use super::vehicle::VehicleType; use routee_compass_core::model::road_network::edge_heading::EdgeHeading; -use routee_compass_core::model::traversal::default::speed_traversal_model::get_max_speed; + use routee_compass_core::model::traversal::traversal_model::TraversalModel; use routee_compass_core::model::traversal::traversal_model_error::TraversalModelError; use routee_compass_core::model::traversal::traversal_model_service::TraversalModelService; @@ -14,13 +14,12 @@ use std::sync::Arc; #[derive(Clone)] pub struct EnergyModelService { - pub speed_table: Arc>, - pub speeds_table_speed_unit: SpeedUnit, - pub max_speed: Speed, + pub time_model_service: Arc, + pub time_model_speed_unit: SpeedUnit, pub grade_table: Arc>>, pub grade_table_grade_unit: GradeUnit, - pub output_time_unit: TimeUnit, - pub output_distance_unit: DistanceUnit, + pub time_unit: TimeUnit, + pub distance_unit: DistanceUnit, pub vehicle_library: HashMap>, pub headings_table: Arc>>, } @@ -28,8 +27,8 @@ pub struct EnergyModelService { impl EnergyModelService { #[allow(clippy::too_many_arguments)] pub fn new>( - speed_table_path: &P, - speeds_table_speed_unit: SpeedUnit, + time_model_service: Arc, + time_model_speed_unit: SpeedUnit, grade_table_path_option: &Option

, grade_table_grade_unit_option: Option, output_time_unit_option: Option, @@ -40,33 +39,16 @@ impl EnergyModelService { let output_time_unit = output_time_unit_option.unwrap_or(BASE_TIME_UNIT); let output_distance_unit = output_distance_unit_option.unwrap_or(BASE_DISTANCE_UNIT); - // load speeds table - let speed_table: Arc> = Arc::new( - read_utils::read_raw_file(speed_table_path, read_decoders::default, None).map_err( - |e| { - TraversalModelError::FileReadError( - speed_table_path.as_ref().to_path_buf(), - e.to_string(), - ) - }, - )?, - ); - let grade_table: Arc>> = match grade_table_path_option { Some(gtp) => Arc::new(Some( read_utils::read_raw_file(gtp, read_decoders::default, None).map_err(|e| { - TraversalModelError::FileReadError( - speed_table_path.as_ref().to_path_buf(), - e.to_string(), - ) + TraversalModelError::FileReadError(gtp.as_ref().to_path_buf(), e.to_string()) })?, )), None => Arc::new(None), }; let grade_table_grade_unit = grade_table_grade_unit_option.unwrap_or(GradeUnit::Decimal); - let max_speed = get_max_speed(&speed_table)?; - let headings_table: Arc>> = match headings_table_path { Some(headings_path) => { let headings_table: Box<[EdgeHeading]> = @@ -82,13 +64,12 @@ impl EnergyModelService { }; Ok(EnergyModelService { - speed_table, - speeds_table_speed_unit, - max_speed, + time_model_service, + time_model_speed_unit, grade_table, grade_table_grade_unit, - output_time_unit, - output_distance_unit, + time_unit: output_time_unit, + distance_unit: output_distance_unit, vehicle_library, headings_table, }) @@ -101,7 +82,7 @@ impl TraversalModelService for EnergyModelService { parameters: &serde_json::Value, ) -> Result, TraversalModelError> { let arc_self = Arc::new(self.clone()); - let model = EnergyTraversalModel::try_from((arc_self, parameters))?; + let model = EnergyTraversalModel::new(arc_self, parameters)?; Ok(Arc::new(model)) } } diff --git a/rust/routee-compass-powertrain/src/routee/energy_traversal_model.rs b/rust/routee-compass-powertrain/src/routee/energy_traversal_model.rs index df05991d..2dadc932 100644 --- a/rust/routee-compass-powertrain/src/routee/energy_traversal_model.rs +++ b/rust/routee-compass-powertrain/src/routee/energy_traversal_model.rs @@ -1,195 +1,222 @@ -use super::energy_model_ops::{get_grade, get_headings}; +use super::energy_model_ops::get_grade; use super::energy_model_service::EnergyModelService; -use super::vehicle::vehicle_type::{VehicleState, VehicleType}; +use super::vehicle::vehicle_type::VehicleType; use routee_compass_core::model::property::edge::Edge; use routee_compass_core::model::property::vertex::Vertex; -use routee_compass_core::model::road_network::turn::Turn; -use routee_compass_core::model::traversal::default::speed_traversal_model::get_speed; use routee_compass_core::model::traversal::state::state_variable::StateVar; use routee_compass_core::model::traversal::state::traversal_state::TraversalState; use routee_compass_core::model::traversal::traversal_model::TraversalModel; use routee_compass_core::model::traversal::traversal_model_error::TraversalModelError; use routee_compass_core::model::unit::*; use routee_compass_core::util::geo::haversine; +use std::collections::HashMap; use std::sync::Arc; pub struct EnergyTraversalModel { - pub service: Arc, + pub energy_model_service: Arc, + pub time_model: Arc, pub vehicle: Arc, + pub vehicle_state_index: usize, + pub state_variables: HashMap, } impl TraversalModel for EnergyTraversalModel { fn initial_state(&self) -> TraversalState { - let state_size = 2 + self.vehicle.number_of_state_variables(); - let mut initial_state = Vec::with_capacity(state_size); - - // distance - initial_state.push(StateVar(0.0)); - // time - initial_state.push(StateVar(0.0)); - - // vehicle state gets slots 2..n - let vehicle_state = self.vehicle.initial_state(); - initial_state.extend(vehicle_state); - - initial_state + // the state representation is split between two underlying models, appearing in this order: + // 1. time traversal model state + // 2. energy traversal model state (the vehicle model) + let mut state = self.time_model.initial_state(); + state.extend(self.vehicle.initial_state()); + state } fn state_variable_names(&self) -> Vec { - let mut dims = vec![String::from("distance"), String::from("time")]; - dims.extend(self.vehicle.state_variable_names()); - dims + // provide names sorted by index + let mut result = vec![String::default(); self.state_variables.len()]; + for (name, idx) in self.state_variables.iter() { + result[*idx] = name.clone(); + } + result } - fn serialize_state(&self, state: &TraversalState) -> serde_json::Value { - let distance = get_distance_from_state(state); - let time = get_time_from_state(state); - let vehicle_state = get_vehicle_state_from_state(state); - let vehicle_state_summary = self.vehicle.serialize_state(vehicle_state); - serde_json::json!({ - "distance": distance, - "time": time, - "vehicle": vehicle_state_summary, - }) + fn get_state_variable( + &self, + key: &str, + state: &[StateVar], + ) -> Result { + let index = self.state_variables.get(key).ok_or_else(|| { + TraversalModelError::InternalError(format!("state variable {} not found in state", key)) + })?; + let value_f64 = state.get(*index).ok_or_else(|| { + TraversalModelError::InternalError(format!( + "state variable index {} not found in state", + index + )) + })?; + Ok(*value_f64) } - fn serialize_state_info(&self, state: &TraversalState) -> serde_json::Value { - let vehicle_state = get_vehicle_state_from_state(state); + fn serialize_state(&self, state: &[StateVar]) -> serde_json::Value { + let time_state = &state[0..self.vehicle_state_index]; + let vehicle_state = &state[self.vehicle_state_index..]; + let time_json = self.time_model.serialize_state(time_state); + let energy_json = self.vehicle.serialize_state(vehicle_state); + + use serde_json::Value::Object; + + match (time_json, energy_json) { + (Object(ref mut t), Object(ref e)) => { + for (k, v) in e { + t.insert(k.clone(), v.clone()); + } + serde_json::json!(t) + } + _ => { + serde_json::json!({"internal error": "unable to serialize energy and time states as expected"}) + } + } + } + + fn serialize_state_info(&self, state: &[StateVar]) -> serde_json::Value { + let vehicle_state = &state[self.vehicle_state_index..]; let vehicle_state_info = self.vehicle.serialize_state_info(vehicle_state); serde_json::json!({ - "distance_unit": self.service.output_distance_unit, - "time_unit": self.service.output_time_unit, + "distance_unit": self.energy_model_service.distance_unit, + "time_unit": self.energy_model_service.time_unit, "vehicle_info": vehicle_state_info, }) } fn traverse_edge( &self, - _src: &Vertex, + src: &Vertex, edge: &Edge, - _dst: &Vertex, - state: &TraversalState, + dst: &Vertex, + state: &[StateVar], ) -> Result { - let distance = BASE_DISTANCE_UNIT.convert(edge.distance, self.service.output_distance_unit); - let speed = get_speed(&self.service.speed_table, edge.edge_id)?; - let grade = get_grade(&self.service.grade_table, edge.edge_id)?; - - let time: Time = Time::create( - speed, - self.service.speeds_table_speed_unit, - distance, - self.service.output_distance_unit, - self.service.output_time_unit.clone(), - )?; - + let distance = + BASE_DISTANCE_UNIT.convert(edge.distance, self.energy_model_service.distance_unit); + + // perform time traversal + let time_state = &state[0..self.vehicle_state_index]; + let vehicle_state = &state[self.vehicle_state_index..]; + let mut updated_state = self.time_model.traverse_edge(src, edge, dst, time_state)?; + let time_next = self.time_model.get_state_variable("time", &updated_state)?; + let time_prev = self.get_state_variable("time", state)?; + let time_delta: Time = Time::new(time_next.0 - time_prev.0); + + // perform vehicle energy traversal + let grade = get_grade(&self.energy_model_service.grade_table, edge.edge_id)?; + let speed = Speed::from((distance, time_delta)); let energy_result = self.vehicle.consume_energy( - (speed, self.service.speeds_table_speed_unit), - (grade, self.service.grade_table_grade_unit), - (distance, self.service.output_distance_unit), - get_vehicle_state_from_state(state), + (speed, self.energy_model_service.time_model_speed_unit), + (grade, self.energy_model_service.grade_table_grade_unit), + (distance, self.energy_model_service.distance_unit), + vehicle_state, )?; - let updated_state = update_state(state, distance, time, energy_result.updated_state); + updated_state.extend(energy_result.updated_state); Ok(updated_state) } fn access_edge( &self, - _v1: &Vertex, + v1: &Vertex, src: &Edge, - _v2: &Vertex, + v2: &Vertex, dst: &Edge, - _v3: &Vertex, - state: &TraversalState, + v3: &Vertex, + state: &[StateVar], ) -> Result, TraversalModelError> { - match self.service.headings_table.as_deref() { - None => Ok(None), - Some(headings_table) => { - let src_heading = get_headings(headings_table, src.edge_id)?; - let dst_heading = get_headings(headings_table, dst.edge_id)?; - let angle = src_heading.next_edge_angle(&dst_heading); - let turn = Turn::from_angle(angle)?; - let time_cost = match turn { - Turn::NoTurn => { - // no penalty for straight - Time::new(0.0) - } - Turn::SlightRight => { - // 0.5 second penalty for slight right - Time::new(0.5) - } - Turn::Right => { - // 1 second penalty for right - Time::new(1.0) - } - Turn::SharpRight => { - // 1.5 second penalty for sharp right - Time::new(1.5) - } - Turn::SlightLeft => { - // 1 second penalty for slight left - Time::new(1.0) - } - Turn::Left => { - // 2.5 second penalty for left - Time::new(2.5) - } - Turn::SharpLeft => { - // 3.5 second penalty for sharp left - Time::new(3.5) - } - Turn::UTurn => { - // 9.5 second penalty for U-turn - Time::new(9.5) - } - }; - let time = TimeUnit::Seconds.convert(time_cost, &self.service.output_time_unit); - let updated_state = add_time_to_state(state, time); - Ok(Some(updated_state)) - } - } + // defer access updates to time model + self.time_model.access_edge(v1, src, v2, dst, v3, state) + // match self.energy_model_service.headings_table.as_deref() { + // None => Ok(None), + // Some(headings_table) => { + // let src_heading = get_headings(headings_table, src.edge_id)?; + // let dst_heading = get_headings(headings_table, dst.edge_id)?; + // let angle = src_heading.next_edge_angle(&dst_heading); + // let turn = Turn::from_angle(angle)?; + // let time_cost = match turn { + // Turn::NoTurn => { + // // no penalty for straight + // Time::new(0.0) + // } + // Turn::SlightRight => { + // // 0.5 second penalty for slight right + // Time::new(0.5) + // } + // Turn::Right => { + // // 1 second penalty for right + // Time::new(1.0) + // } + // Turn::SharpRight => { + // // 1.5 second penalty for sharp right + // Time::new(1.5) + // } + // Turn::SlightLeft => { + // // 1 second penalty for slight left + // Time::new(1.0) + // } + // Turn::Left => { + // // 2.5 second penalty for left + // Time::new(2.5) + // } + // Turn::SharpLeft => { + // // 3.5 second penalty for sharp left + // Time::new(3.5) + // } + // Turn::UTurn => { + // // 9.5 second penalty for U-turn + // Time::new(9.5) + // } + // }; + // let time = + // TimeUnit::Seconds.convert(time_cost, &self.energy_model_service.time_unit); + // let time_idx = self.time_model.get_state_variable(&"time", state)?; + // let mut updated_state = state.clone(); + // Ok(Some(updated_state)) + // } + // } } fn estimate_traversal( &self, src: &Vertex, dst: &Vertex, - state: &TraversalState, + state: &[StateVar], ) -> Result { let distance = haversine::coord_distance( &src.coordinate, &dst.coordinate, - self.service.output_distance_unit, + self.energy_model_service.distance_unit, ) .map_err(TraversalModelError::NumericError)?; if distance == Distance::ZERO { - return Ok(state.clone()); + return Ok(state.to_vec()); } - let time: Time = Time::create( - self.service.max_speed, - self.service.speeds_table_speed_unit, - distance, - self.service.output_distance_unit, - self.service.output_time_unit.clone(), + let time_state = &state[0..self.vehicle_state_index]; + let vehicle_state = &state[self.vehicle_state_index..]; + let mut updated_state = self.time_model.estimate_traversal(src, dst, time_state)?; + let best_case_result = self.vehicle.best_case_energy_state( + (distance, self.energy_model_service.distance_unit), + vehicle_state, )?; - let vehicle_state = get_vehicle_state_from_state(state); - let best_case_result = self - .vehicle - .best_case_energy_state((distance, self.service.output_distance_unit), vehicle_state)?; - - let updated_state = update_state(state, distance, time, best_case_result.updated_state); + updated_state.extend(best_case_result.updated_state); Ok(updated_state) } } -impl TryFrom<(Arc, &serde_json::Value)> for EnergyTraversalModel { - type Error = TraversalModelError; - - fn try_from(input: (Arc, &serde_json::Value)) -> Result { - let (service, conf) = input; +impl EnergyTraversalModel { + pub fn new( + energy_model_service: Arc, + conf: &serde_json::Value, + ) -> Result { + let time_model = energy_model_service.time_model_service.build(conf)?; + let vehicle_state_index = time_model.initial_state().len(); let prediction_model_name = conf .get("model_name".to_string()) @@ -204,9 +231,13 @@ impl TryFrom<(Arc, &serde_json::Value)> for EnergyTraversalM })? .to_string(); - let vehicle = match service.vehicle_library.get(&prediction_model_name) { + let vehicle = match energy_model_service + .vehicle_library + .get(&prediction_model_name) + { None => { - let model_names: Vec<&String> = service.vehicle_library.keys().collect(); + let model_names: Vec<&String> = + energy_model_service.vehicle_library.keys().collect(); Err(TraversalModelError::BuildError(format!( "No vehicle found with model_name = '{}', try one of: {:?}", prediction_model_name, model_names @@ -216,41 +247,23 @@ impl TryFrom<(Arc, &serde_json::Value)> for EnergyTraversalM }? .update_from_query(conf)?; - Ok(EnergyTraversalModel { service, vehicle }) + let mut state_variable_names = time_model.state_variable_names(); + state_variable_names.extend(vehicle.state_variable_names()); + let state_variables = state_variable_names + .into_iter() + .enumerate() + .map(|(idx, name)| (name, idx)) + .collect::>(); + Ok(EnergyTraversalModel { + energy_model_service, + time_model, + vehicle, + vehicle_state_index, + state_variables, + }) } } -fn update_state( - state: &TraversalState, - distance: Distance, - time: Time, - vehicle_state: VehicleState, -) -> TraversalState { - let mut updated_state = Vec::with_capacity(state.len()); - - updated_state.push(state[0] + distance.into()); - updated_state.push(state[1] + time.into()); - updated_state.extend(vehicle_state); - updated_state -} - -fn add_time_to_state(state: &TraversalState, time: Time) -> TraversalState { - let mut updated_state = state.clone(); - updated_state[1] = state[1] + time.into(); - updated_state -} -fn get_distance_from_state(state: &TraversalState) -> Distance { - Distance::new(state[0].0) -} - -fn get_time_from_state(state: &TraversalState) -> Time { - Time::new(state[1].0) -} - -fn get_vehicle_state_from_state(state: &TraversalState) -> &[StateVar] { - &state[2..] -} - #[cfg(test)] mod tests { use crate::routee::{ @@ -264,6 +277,10 @@ mod tests { model::{ property::{edge::Edge, vertex::Vertex}, road_network::{edge_id::EdgeId, vertex_id::VertexId}, + traversal::default::{ + speed_traversal_model::SpeedTraversalModel, + speed_traversal_service::SpeedLookupService, + }, }, util::geo::coord::InternalCoord, }; @@ -321,10 +338,19 @@ mod tests { let mut model_library: HashMap> = HashMap::new(); model_library.insert("Toyota_Camry".to_string(), Arc::new(camry)); + let time_model = + SpeedTraversalModel::new(&speed_file_path, SpeedUnit::KilometersPerHour, None, None) + .unwrap(); + let time_service = SpeedLookupService { + m: Arc::new(time_model), + }; + let service = EnergyModelService::new( - &speed_file_path, - SpeedUnit::KilometersPerHour, + Arc::new(time_service), + SpeedUnit::MilesPerHour, + // &speed_file_path, &Some(grade_file_path), + // SpeedUnit::KilometersPerHour, Some(GradeUnit::Millis), None, None, @@ -336,7 +362,7 @@ mod tests { let conf = serde_json::json!({ "model_name": "Toyota_Camry", }); - let model = EnergyTraversalModel::try_from((arc_service, &conf)).unwrap(); + let model = EnergyTraversalModel::new(arc_service, &conf).unwrap(); let initial = model.initial_state(); let e1 = mock_edge(0); // 100 meters @ 10kph should take 36 seconds ((0.1/10) * 3600) diff --git a/rust/routee-compass/src/app/compass/config/compass_app_builder.rs b/rust/routee-compass/src/app/compass/config/compass_app_builder.rs index 9032cc2a..1256c76a 100644 --- a/rust/routee-compass/src/app/compass/config/compass_app_builder.rs +++ b/rust/routee-compass/src/app/compass/config/compass_app_builder.rs @@ -121,12 +121,14 @@ impl CompassAppBuilder { fn default() -> CompassAppBuilder { // Traversal model builders let dist: Rc = Rc::new(DistanceBuilder {}); - let velo: Rc = Rc::new(SpeedLookupBuilder {}); - let energy_model: Rc = Rc::new(EnergyModelBuilder {}); + let speed: Rc = Rc::new(SpeedLookupBuilder {}); + let energy: Rc = Rc::new(EnergyModelBuilder::new( + HashMap::from([(String::from("speed_table"), speed.clone())]), + )); let tm_builders: HashMap> = HashMap::from([ (String::from("distance"), dist), - (String::from("speed_table"), velo), - (String::from("energy_model"), energy_model), + (String::from("speed_table"), speed), + (String::from("energy_model"), energy), ]); // Frontier model builders diff --git a/rust/routee-compass/src/app/compass/config/frontier_model/combined/combined_model.rs b/rust/routee-compass/src/app/compass/config/frontier_model/combined/combined_model.rs index 29edb4c2..1b3784d4 100644 --- a/rust/routee-compass/src/app/compass/config/frontier_model/combined/combined_model.rs +++ b/rust/routee-compass/src/app/compass/config/frontier_model/combined/combined_model.rs @@ -1,7 +1,7 @@ use routee_compass_core::model::{ frontier::{frontier_model::FrontierModel, frontier_model_error::FrontierModelError}, property::edge::Edge, - traversal::state::traversal_state::TraversalState, + traversal::state::state_variable::StateVar, }; use std::sync::Arc; @@ -13,7 +13,7 @@ impl FrontierModel for CombinedFrontierModel { fn valid_frontier( &self, edge: &Edge, - state: &TraversalState, + state: &[StateVar], previous_edge: Option<&Edge>, ) -> Result { // If any of the inner models return an invalid frontier, it invalidates the whole set and we diff --git a/rust/routee-compass/src/app/compass/config/frontier_model/road_class/road_class_model.rs b/rust/routee-compass/src/app/compass/config/frontier_model/road_class/road_class_model.rs index 022dbfb5..43cfea1b 100644 --- a/rust/routee-compass/src/app/compass/config/frontier_model/road_class/road_class_model.rs +++ b/rust/routee-compass/src/app/compass/config/frontier_model/road_class/road_class_model.rs @@ -2,7 +2,7 @@ use super::road_class_service::RoadClassFrontierService; use routee_compass_core::model::{ frontier::{frontier_model::FrontierModel, frontier_model_error::FrontierModelError}, property::edge::Edge, - traversal::state::traversal_state::TraversalState, + traversal::state::state_variable::StateVar, }; use std::{collections::HashSet, sync::Arc}; @@ -15,7 +15,7 @@ impl FrontierModel for RoadClassFrontierModel { fn valid_frontier( &self, edge: &Edge, - _state: &TraversalState, + _state: &[StateVar], _previous_edge: Option<&Edge>, ) -> Result { match &self.road_classes { diff --git a/rust/routee-compass/src/app/compass/config/frontier_model/turn_restrictions/turn_restriction_model.rs b/rust/routee-compass/src/app/compass/config/frontier_model/turn_restrictions/turn_restriction_model.rs index ed4a89c8..6df08f4f 100644 --- a/rust/routee-compass/src/app/compass/config/frontier_model/turn_restrictions/turn_restriction_model.rs +++ b/rust/routee-compass/src/app/compass/config/frontier_model/turn_restrictions/turn_restriction_model.rs @@ -1,7 +1,7 @@ use routee_compass_core::model::{ frontier::{frontier_model::FrontierModel, frontier_model_error::FrontierModelError}, property::edge::Edge, - traversal::state::traversal_state::TraversalState, + traversal::state::state_variable::StateVar, }; use std::sync::Arc; @@ -15,7 +15,7 @@ impl FrontierModel for TurnRestrictionFrontierModel { fn valid_frontier( &self, edge: &Edge, - _state: &TraversalState, + _state: &[StateVar], previous_edge: Option<&Edge>, ) -> Result { match previous_edge { diff --git a/rust/routee-compass/src/app/compass/config/traversal_model/energy_model_builder.rs b/rust/routee-compass/src/app/compass/config/traversal_model/energy_model_builder.rs index 34637775..59035ede 100644 --- a/rust/routee-compass/src/app/compass/config/traversal_model/energy_model_builder.rs +++ b/rust/routee-compass/src/app/compass/config/traversal_model/energy_model_builder.rs @@ -1,8 +1,9 @@ use std::collections::HashMap; +use std::rc::Rc; use std::sync::Arc; -use crate::app::compass::config::compass_configuration_field::CompassConfigurationField; use crate::app::compass::config::config_json_extension::ConfigJsonExtensions; +use itertools::Itertools; use routee_compass_core::model::traversal::traversal_model_builder::TraversalModelBuilder; use routee_compass_core::model::traversal::traversal_model_error::TraversalModelError; use routee_compass_core::model::traversal::traversal_model_service::TraversalModelService; @@ -11,38 +12,61 @@ use routee_compass_powertrain::routee::energy_model_service::EnergyModelService; use super::energy_model_vehicle_builders::VehicleBuilder; -pub struct EnergyModelBuilder {} +pub struct EnergyModelBuilder { + time_models: HashMap>, +} + +impl EnergyModelBuilder { + pub fn new(time_models: HashMap>) -> EnergyModelBuilder { + EnergyModelBuilder { time_models } + } +} impl TraversalModelBuilder for EnergyModelBuilder { fn build( &self, params: &serde_json::Value, ) -> Result, TraversalModelError> { - let traversal_key = CompassConfigurationField::Traversal.to_string(); + let parent_key = String::from("energy traversal model"); - let speed_table_path = params - .get_config_path(&"speed_table_input_file", &traversal_key) + // load the underlying travel time model + let time_model_params = params.get("time_model").ok_or_else(|| { + TraversalModelError::BuildError( + format!("{} missing time_model parameters", parent_key,), + ) + })?; + let time_model_type = time_model_params + .get_config_string(&"type", &parent_key) .map_err(|e| TraversalModelError::BuildError(e.to_string()))?; - let speed_table_speed_unit = params - .get_config_serde::(&"speed_table_speed_unit", &traversal_key) + + let time_builder = self.time_models.get(&time_model_type).ok_or_else(|| { + let valid_models = self.time_models.keys().join(","); + TraversalModelError::BuildError(format!( + "unknown time_model {}, must be one of [{}]", + time_model_type, valid_models + )) + })?; + let time_model_service = time_builder.build(time_model_params)?; + let time_model_speed_unit = time_model_params + .get_config_serde::(&"speed_unit", &"time_model") .map_err(|e| TraversalModelError::BuildError(e.to_string()))?; - let grade_table_path = params - .get_config_path_optional(&"grade_table_input_file", &traversal_key) + let grade_table_path_option = params + .get_config_path_optional(&"grade_table_input_file", &parent_key) .map_err(|e| TraversalModelError::BuildError(e.to_string()))?; - let grade_table_grade_unit = params - .get_config_serde_optional::(&"graph_grade_unit", &traversal_key) + let grade_table_grade_unit_option = params + .get_config_serde_optional::(&"graph_grade_unit", &parent_key) .map_err(|e| TraversalModelError::BuildError(e.to_string()))?; let vehicle_configs = params - .get_config_array(&"vehicles", &traversal_key) + .get_config_array(&"vehicles", &parent_key) .map_err(|e| TraversalModelError::BuildError(e.to_string()))?; + // read all vehicle configurations let mut vehicle_library = HashMap::new(); - for vehicle_config in vehicle_configs { let vehicle_type = vehicle_config - .get_config_string(&"type", &traversal_key) + .get_config_string(&"type", &parent_key) .map_err(|e| TraversalModelError::BuildError(e.to_string()))?; let vehicle_builder = VehicleBuilder::from_string(vehicle_type).map_err(|e| { TraversalModelError::BuildError(format!("Error building vehicle builder: {}", e)) @@ -53,24 +77,24 @@ impl TraversalModelBuilder for EnergyModelBuilder { vehicle_library.insert(vehicle.name(), vehicle); } - let output_time_unit_option = params - .get_config_serde_optional::(&"output_time_unit", &traversal_key) + let time_unit_option = params + .get_config_serde_optional::(&"time_unit", &parent_key) .map_err(|e| TraversalModelError::BuildError(e.to_string()))?; - let output_distance_unit_option = params - .get_config_serde_optional::(&"output_distance_unit", &traversal_key) + let distance_unit_option = params + .get_config_serde_optional::(&"distance_unit", &parent_key) .map_err(|e| TraversalModelError::BuildError(e.to_string()))?; let headings_table_path = params - .get_config_path_optional(&"headings_table_input_file", &traversal_key) + .get_config_path_optional(&"headings_table_input_file", &parent_key) .map_err(|e| TraversalModelError::BuildError(e.to_string()))?; let service = EnergyModelService::new( - &speed_table_path, - speed_table_speed_unit, - &grade_table_path, - grade_table_grade_unit, - output_time_unit_option, - output_distance_unit_option, + time_model_service, + time_model_speed_unit, + &grade_table_path_option, + grade_table_grade_unit_option, + time_unit_option, + distance_unit_option, vehicle_library, &headings_table_path, )?; diff --git a/rust/routee-compass/src/app/compass/config/traversal_model/speed_lookup_builder.rs b/rust/routee-compass/src/app/compass/config/traversal_model/speed_lookup_builder.rs index 85449071..8645f586 100644 --- a/rust/routee-compass/src/app/compass/config/traversal_model/speed_lookup_builder.rs +++ b/rust/routee-compass/src/app/compass/config/traversal_model/speed_lookup_builder.rs @@ -1,7 +1,7 @@ use crate::app::compass::config::compass_configuration_field::CompassConfigurationField; use crate::app::compass::config::config_json_extension::ConfigJsonExtensions; use routee_compass_core::model::traversal::default::speed_traversal_model::SpeedTraversalModel; -use routee_compass_core::model::traversal::traversal_model::TraversalModel; +use routee_compass_core::model::traversal::default::speed_traversal_service::SpeedLookupService; use routee_compass_core::model::traversal::traversal_model_builder::TraversalModelBuilder; use routee_compass_core::model::traversal::traversal_model_error::TraversalModelError; use routee_compass_core::model::traversal::traversal_model_service::TraversalModelService; @@ -10,10 +10,6 @@ use std::sync::Arc; pub struct SpeedLookupBuilder {} -pub struct SpeedLookupService { - m: Arc, -} - impl TraversalModelBuilder for SpeedLookupBuilder { fn build( &self, @@ -39,12 +35,3 @@ impl TraversalModelBuilder for SpeedLookupBuilder { Ok(service) } } - -impl TraversalModelService for SpeedLookupService { - fn build( - &self, - _parameters: &serde_json::Value, - ) -> Result, TraversalModelError> { - Ok(self.m.clone()) - } -}