Using Python, I generate a whale-protecting reduced speeding zone and calculate the impact on shipping for the coast of Dominica.
This blog post is based on an assignment from my Master’s of Environmental Data Science course EDS 223: Spatial Analysis for Environmental Data Science.
#load libraries
import pandas as pd
import geopandas as gpd
import matplotlib.pyplot as plt
import os
import numpy as np
from shapely.geometry import Polygon
In the code chunk below, I define a file path for Dominica spatial data:
= r"data/dominica"
input_folder = "dma_admn_adm0_py_s1_dominode_v2.shp"
dominica_shapefile
= os.path.join(input_folder, dominica_shapefile) dominica_fp
Next, I read in the Dominica shapefile using read_file()
:
= gpd.read_file(dominica_fp) dominica_data
Then I change the CRS from WGS 84 to Dominica 1945 using the function to_crs()
. This transforms the CRS to a more accurate geospatial reference system for the region of interest, coastal Dominica:
= dominica_data.to_crs("EPSG:2002") dominica_2002
Next, I plot the outline of Dominica to explore and check that the output is expected:
= plt.subplots(figsize=(3, 3), dpi=200)
fig, ax True)
ax.grid('lightblue')
ax.set_facecolor(
= ax, color = 'green') dominica_2002.plot(ax
Next, I define the file path for whale sighting spatial data:
= r"data"
sightings_input_folder = "sightings2005_2018.csv"
sightings_csv
= os.path.join(sightings_input_folder, sightings_csv) sightings_fp
Read file using read_file()
:
= gpd.read_file(sightings_fp) sightings_data
Bootstrap the geometries:
= gpd.points_from_xy(sightings_data['Long'], sightings_data['Lat']) sightings_points
Project the dataset into a Geo Data Frame with the appropriate CRS:
= gpd.GeoDataFrame(sightings_data, geometry=sightings_points, crs = 'EPSG:4326') sightings_gdf_4326
= sightings_gdf_4326.to_crs("EPSG:2002") sightings_gdf_2002
Define the grid’s boundaries:
= sightings_gdf_2002.total_bounds minx, miny, maxx, maxy
Define the grid’s cell size, in meters:
= 2000 cell_size
= np.arange(minx, maxx, cell_size)
xs = np.arange(miny, maxy, cell_size) ys
def make_cell(x, y, cell_size):
= [
ring
(x, y),+ cell_size, y),
(x + cell_size, y + cell_size),
(x + cell_size)
(x, y
]= Polygon(ring)
cell return cell
= []
cells for x in xs:
for y in ys:
= make_cell(x, y, cell_size)
cell cells.append(cell)
Create a grid GeoDataFrame
, containing a cell for each row:
= gpd.GeoDataFrame({'geometry': cells}, crs=2002) grid
Plot the grid to see how it looks:
We adjust the figure size so the cells are more visible than in the default grid:
= (10,20)) grid.boundary.plot(figsize
<AxesSubplot:>
Spatially join whale sightings data with grid data to get whale counts per grid cell:
= grid.sjoin(sightings_gdf_2002, how="inner")
sightings_with_grid sightings_with_grid
geometry | index_right | field_1 | GPStime | Lat | Long | |
---|---|---|---|---|---|---|
124 | POLYGON ((408480.652 1780792.746, 410480.652 1… | 4327 | 4327 | 2018-03-15 06:41:03 | 16.127 | -61.896866 |
124 | POLYGON ((408480.652 1780792.746, 410480.652 1… | 4328 | 4328 | 2018-03-15 06:44:05 | 16.127666 | -61.900766 |
124 | POLYGON ((408480.652 1780792.746, 410480.652 1… | 4329 | 4329 | 2018-03-15 06:58:17 | 16.1305 | -61.903366 |
125 | POLYGON ((408480.652 1782792.746, 410480.652 1… | 4330 | 4330 | 2018-03-15 07:15:33 | 16.139583 | -61.900116 |
125 | POLYGON ((408480.652 1782792.746, 410480.652 1… | 4331 | 4331 | 2018-03-15 07:17:30 | 16.14175 | -61.897716 |
… | … | … | … | … | … | … |
5133 | POLYGON ((484480.652 1690792.746, 486480.652 1… | 1147 | 1147 | 2008-05-04 16:59:36 | 15.304085 | -61.194134 |
5134 | POLYGON ((484480.652 1692792.746, 486480.652 1… | 1148 | 1148 | 2008-05-04 17:43:45 | 15.321439 | -61.19188 |
5985 | POLYGON ((498480.652 1532792.746, 500480.652 1… | 609 | 609 | 2005-03-20 11:50:05 | 13.86967067 | -61.0794355 |
5985 | POLYGON ((498480.652 1532792.746, 500480.652 1… | 611 | 611 | 2005-03-20 12:56:58 | 13.86967067 | -61.0794355 |
5985 | POLYGON ((498480.652 1532792.746, 500480.652 1… | 610 | 610 | 2005-03-20 12:05:10 | 13.86967067 | -61.0794355 |
4893 rows × 6 columns
Plot the Grid Cells with Whale Counts:
= (10,20)) sightings_with_grid.plot(figsize
<AxesSubplot:>
To ge the count of sightings in each cell, we have to perform a so called map-reduce operation using groupby
and count
. This is added to the Geo Data Frame as a new column:
'count'] = sightings_with_grid.groupby(sightings_with_grid.index).count()['index_right']
grid[ grid
geometry | count | |
---|---|---|
0 | POLYGON ((408480.652 1532792.746, 410480.652 1… | NaN |
1 | POLYGON ((408480.652 1534792.746, 410480.652 1… | NaN |
2 | POLYGON ((408480.652 1536792.746, 410480.652 1… | NaN |
3 | POLYGON ((408480.652 1538792.746, 410480.652 1… | NaN |
4 | POLYGON ((408480.652 1540792.746, 410480.652 1… | NaN |
… | … | … |
6113 | POLYGON ((498480.652 1788792.746, 500480.652 1… | NaN |
6114 | POLYGON ((498480.652 1790792.746, 500480.652 1… | NaN |
6115 | POLYGON ((498480.652 1792792.746, 500480.652 1… | NaN |
6116 | POLYGON ((498480.652 1794792.746, 500480.652 1… | NaN |
6117 | POLYGON ((498480.652 1796792.746, 500480.652 1… | NaN |
6118 rows × 2 columns
Subset grid df to cells with more than 20 sightings:
= grid[grid['count'] > 20] grid_20
= grid_20.unary_union
grid_20_union grid_20_union
Next we create a convex hull using the sightings we joined with unary_union
to generate the “whale habitat”:
= grid_20_union.convex_hull
habitat_convex_hull habitat_convex_hull
Convert the habitat convex hull polygon to a Geo Data Frame:
= gpd.GeoDataFrame(crs = 'EPSG:2002', geometry = [habitat_convex_hull]) convex_hull_gdf
= convex_hull_gdf.plot(color = 'y')
ax
= ax, figsize = (10,20)) dominica_2002.plot(ax
<AxesSubplot:>
Define file path for AIS vessel data:
= r"data"
ais_input_folder = "station1249.csv"
ais_csv
= os.path.join(ais_input_folder, ais_csv) ais_fp
Read file using read_file()
:
= gpd.read_file(ais_fp) ais_data
Bootstrap the geometries:
= gpd.points_from_xy(ais_data['LON'], ais_data['LAT']) ais_points
= gpd.GeoDataFrame(ais_data, geometry=ais_points, crs = 'EPSG:4326') ais_gdf
Project to the Dominica 1945 CRS:
= ais_gdf.to_crs("EPSG:2002") ais_gdf
The character strings in TIMESTAMP
are not in a recognized datetime format. We parse those strings here:
'TIMESTAMP']) pd.to_datetime(ais_gdf[
0 2015-05-22 13:53:26
1 2015-05-22 13:52:57
2 2015-05-22 13:52:32
3 2015-05-22 13:52:24
4 2015-05-22 13:51:23
...
617257 2015-05-21 21:34:59
617258 2015-05-21 21:34:55
617259 2015-05-21 21:34:46
617260 2015-05-21 21:34:46
617261 2015-05-21 21:34:45
Name: TIMESTAMP, Length: 617262, dtype: datetime64[ns]
Parse strings of the TIMESTAMP
column to a recognized datetime format:
'TIMESTAMP'] = pd.to_datetime(ais_gdf['TIMESTAMP']) ais_gdf[
Spatially subset vessel data using whale habitat data:
= ais_gdf.sjoin(convex_hull_gdf, how = 'inner') habitat_ais_gdf
Sort the dataframe by MMSI (Maritime Mobile Service Identity), the vessel’s unique identifier.
= habitat_ais_gdf.sort_values(['MMSI', 'TIMESTAMP']) habitat_ais_sorted
Create a copy of our dataframe and shift each observation down one row using shift()
.
= habitat_ais_sorted.copy()
habitat_ais_copy habitat_ais_copy
field_1 | MMSI | LON | LAT | TIMESTAMP | geometry | index_right | |
---|---|---|---|---|---|---|---|
235025 | 235025 | 203106200 | -61.40929 | 15.21021 | 2015-02-25 15:32:20 | POINT (462476.396 1680935.224) | 0 |
235018 | 235018 | 203106200 | -61.41107 | 15.21436 | 2015-02-25 15:34:50 | POINT (462283.995 1681393.698) | 0 |
235000 | 235000 | 203106200 | -61.41427 | 15.22638 | 2015-02-25 15:42:19 | POINT (461936.769 1682722.187) | 0 |
234989 | 234989 | 203106200 | -61.41553 | 15.2353 | 2015-02-25 15:47:19 | POINT (461798.818 1683708.377) | 0 |
234984 | 234984 | 203106200 | -61.41687 | 15.23792 | 2015-02-25 15:49:50 | POINT (461654.150 1683997.765) | 0 |
… | … | … | … | … | … | … | … |
259103 | 259103 | 983191049 | -61.38322 | 15.2927 | 2015-02-19 19:50:45 | POINT (465250.372 1690066.434) | 0 |
259094 | 259094 | 983191049 | -61.38328 | 15.29259 | 2015-02-19 19:55:09 | POINT (465243.965 1690054.249) | 0 |
258954 | 258954 | 983191049 | -61.38344 | 15.2932 | 2015-02-19 20:51:12 | POINT (465226.597 1690121.667) | 0 |
258930 | 258930 | 983191049 | -61.38329 | 15.29258 | 2015-02-19 21:02:54 | POINT (465242.895 1690053.140) | 0 |
258206 | 258206 | 983191049 | -61.38301 | 15.29255 | 2015-02-20 01:11:35 | POINT (465272.964 1690049.908) | 0 |
167411 rows × 7 columns
Shift each observation down one row in our copied ship dataframe:
= habitat_ais_copy.shift(periods = 1)
habitat_ais_copy habitat_ais_copy
field_1 | MMSI | LON | LAT | TIMESTAMP | geometry | index_right | |
---|---|---|---|---|---|---|---|
235025 | NaN | NaN | NaN | NaN | NaT | None | NaN |
235018 | 235025 | 203106200 | -61.40929 | 15.21021 | 2015-02-25 15:32:20 | POINT (462476.396 1680935.224) | 0.0 |
235000 | 235018 | 203106200 | -61.41107 | 15.21436 | 2015-02-25 15:34:50 | POINT (462283.995 1681393.698) | 0.0 |
234989 | 235000 | 203106200 | -61.41427 | 15.22638 | 2015-02-25 15:42:19 | POINT (461936.769 1682722.187) | 0.0 |
234984 | 234989 | 203106200 | -61.41553 | 15.2353 | 2015-02-25 15:47:19 | POINT (461798.818 1683708.377) | 0.0 |
… | … | … | … | … | … | … | … |
259103 | 259118 | 983191049 | -61.38323 | 15.29282 | 2015-02-19 19:44:46 | POINT (465249.261 1690079.703) | 0.0 |
259094 | 259103 | 983191049 | -61.38322 | 15.2927 | 2015-02-19 19:50:45 | POINT (465250.372 1690066.434) | 0.0 |
258954 | 259094 | 983191049 | -61.38328 | 15.29259 | 2015-02-19 19:55:09 | POINT (465243.965 1690054.249) | 0.0 |
258930 | 258954 | 983191049 | -61.38344 | 15.2932 | 2015-02-19 20:51:12 | POINT (465226.597 1690121.667) | 0.0 |
258206 | 258930 | 983191049 | -61.38329 | 15.29258 | 2015-02-19 21:02:54 | POINT (465242.895 1690053.140) | 0.0 |
167411 rows × 7 columns
Join original dataframe with shifted copy using join()
:
= habitat_ais_copy.join(habitat_ais_gdf, how = 'left', lsuffix = '_2', sort = False)
ais_joined ais_joined
field_1_2 | MMSI_2 | LON_2 | LAT_2 | TIMESTAMP_2 | geometry_2 | index_right_2 | field_1 | MMSI | LON | LAT | TIMESTAMP | geometry | index_right | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
235025 | NaN | NaN | NaN | NaN | NaT | None | NaN | 235025 | 203106200 | -61.40929 | 15.21021 | 2015-02-25 15:32:20 | POINT (462476.396 1680935.224) | 0 |
235018 | 235025 | 203106200 | -61.40929 | 15.21021 | 2015-02-25 15:32:20 | POINT (462476.396 1680935.224) | 0.0 | 235018 | 203106200 | -61.41107 | 15.21436 | 2015-02-25 15:34:50 | POINT (462283.995 1681393.698) | 0 |
235000 | 235018 | 203106200 | -61.41107 | 15.21436 | 2015-02-25 15:34:50 | POINT (462283.995 1681393.698) | 0.0 | 235000 | 203106200 | -61.41427 | 15.22638 | 2015-02-25 15:42:19 | POINT (461936.769 1682722.187) | 0 |
234989 | 235000 | 203106200 | -61.41427 | 15.22638 | 2015-02-25 15:42:19 | POINT (461936.769 1682722.187) | 0.0 | 234989 | 203106200 | -61.41553 | 15.2353 | 2015-02-25 15:47:19 | POINT (461798.818 1683708.377) | 0 |
234984 | 234989 | 203106200 | -61.41553 | 15.2353 | 2015-02-25 15:47:19 | POINT (461798.818 1683708.377) | 0.0 | 234984 | 203106200 | -61.41687 | 15.23792 | 2015-02-25 15:49:50 | POINT (461654.150 1683997.765) | 0 |
… | … | … | … | … | … | … | … | … | … | … | … | … | … | … |
259103 | 259118 | 983191049 | -61.38323 | 15.29282 | 2015-02-19 19:44:46 | POINT (465249.261 1690079.703) | 0.0 | 259103 | 983191049 | -61.38322 | 15.2927 | 2015-02-19 19:50:45 | POINT (465250.372 1690066.434) | 0 |
259094 | 259103 | 983191049 | -61.38322 | 15.2927 | 2015-02-19 19:50:45 | POINT (465250.372 1690066.434) | 0.0 | 259094 | 983191049 | -61.38328 | 15.29259 | 2015-02-19 19:55:09 | POINT (465243.965 1690054.249) | 0 |
258954 | 259094 | 983191049 | -61.38328 | 15.29259 | 2015-02-19 19:55:09 | POINT (465243.965 1690054.249) | 0.0 | 258954 | 983191049 | -61.38344 | 15.2932 | 2015-02-19 20:51:12 | POINT (465226.597 1690121.667) | 0 |
258930 | 258954 | 983191049 | -61.38344 | 15.2932 | 2015-02-19 20:51:12 | POINT (465226.597 1690121.667) | 0.0 | 258930 | 983191049 | -61.38329 | 15.29258 | 2015-02-19 21:02:54 | POINT (465242.895 1690053.140) | 0 |
258206 | 258930 | 983191049 | -61.38329 | 15.29258 | 2015-02-19 21:02:54 | POINT (465242.895 1690053.140) | 0.0 | 258206 | 983191049 | -61.38301 | 15.29255 | 2015-02-20 01:11:35 | POINT (465272.964 1690049.908) | 0 |
167411 rows × 14 columns
Next, we are looking to examine distances traveled by ships using their AIS data per row, so we eliminate rows in which MMSI for ship 1 and 2 are not the same to align the data:
= ais_joined[ais_joined['MMSI_2'] == ais_joined['MMSI']]
ais_joined ais_joined
field_1_2 | MMSI_2 | LON_2 | LAT_2 | TIMESTAMP_2 | geometry_2 | index_right_2 | field_1 | MMSI | LON | LAT | TIMESTAMP | geometry | index_right | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
235018 | 235025 | 203106200 | -61.40929 | 15.21021 | 2015-02-25 15:32:20 | POINT (462476.396 1680935.224) | 0.0 | 235018 | 203106200 | -61.41107 | 15.21436 | 2015-02-25 15:34:50 | POINT (462283.995 1681393.698) | 0 |
235000 | 235018 | 203106200 | -61.41107 | 15.21436 | 2015-02-25 15:34:50 | POINT (462283.995 1681393.698) | 0.0 | 235000 | 203106200 | -61.41427 | 15.22638 | 2015-02-25 15:42:19 | POINT (461936.769 1682722.187) | 0 |
234989 | 235000 | 203106200 | -61.41427 | 15.22638 | 2015-02-25 15:42:19 | POINT (461936.769 1682722.187) | 0.0 | 234989 | 203106200 | -61.41553 | 15.2353 | 2015-02-25 15:47:19 | POINT (461798.818 1683708.377) | 0 |
234984 | 234989 | 203106200 | -61.41553 | 15.2353 | 2015-02-25 15:47:19 | POINT (461798.818 1683708.377) | 0.0 | 234984 | 203106200 | -61.41687 | 15.23792 | 2015-02-25 15:49:50 | POINT (461654.150 1683997.765) | 0 |
234972 | 234984 | 203106200 | -61.41687 | 15.23792 | 2015-02-25 15:49:50 | POINT (461654.150 1683997.765) | 0.0 | 234972 | 203106200 | -61.41851 | 15.24147 | 2015-02-25 15:54:49 | POINT (461476.997 1684389.925) | 0 |
… | … | … | … | … | … | … | … | … | … | … | … | … | … | … |
259103 | 259118 | 983191049 | -61.38323 | 15.29282 | 2015-02-19 19:44:46 | POINT (465249.261 1690079.703) | 0.0 | 259103 | 983191049 | -61.38322 | 15.2927 | 2015-02-19 19:50:45 | POINT (465250.372 1690066.434) | 0 |
259094 | 259103 | 983191049 | -61.38322 | 15.2927 | 2015-02-19 19:50:45 | POINT (465250.372 1690066.434) | 0.0 | 259094 | 983191049 | -61.38328 | 15.29259 | 2015-02-19 19:55:09 | POINT (465243.965 1690054.249) | 0 |
258954 | 259094 | 983191049 | -61.38328 | 15.29259 | 2015-02-19 19:55:09 | POINT (465243.965 1690054.249) | 0.0 | 258954 | 983191049 | -61.38344 | 15.2932 | 2015-02-19 20:51:12 | POINT (465226.597 1690121.667) | 0 |
258930 | 258954 | 983191049 | -61.38344 | 15.2932 | 2015-02-19 20:51:12 | POINT (465226.597 1690121.667) | 0.0 | 258930 | 983191049 | -61.38329 | 15.29258 | 2015-02-19 21:02:54 | POINT (465242.895 1690053.140) | 0 |
258206 | 258930 | 983191049 | -61.38329 | 15.29258 | 2015-02-19 21:02:54 | POINT (465242.895 1690053.140) | 0.0 | 258206 | 983191049 | -61.38301 | 15.29255 | 2015-02-20 01:11:35 | POINT (465272.964 1690049.908) | 0 |
166255 rows × 14 columns
Set the geometry for our joined data frame:
= ais_joined.set_geometry(ais_joined['geometry']) ais_joined
Reproject to Dominica 1945 as our CRS:
= ais_joined.to_crs("EPSG:2002") ais_joined
Add a column in which we calculate the distance traveled between the first and second geometry:
'distance'] = ais_joined['geometry'].distance(ais_joined['geometry_2'])
ais_joined[ ais_joined
field_1_2 | MMSI_2 | LON_2 | LAT_2 | TIMESTAMP_2 | geometry_2 | index_right_2 | field_1 | MMSI | LON | LAT | TIMESTAMP | geometry | index_right | distance | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
235018 | 235025 | 203106200 | -61.40929 | 15.21021 | 2015-02-25 15:32:20 | POINT (462476.396 1680935.224) | 0.0 | 235018 | 203106200 | -61.41107 | 15.21436 | 2015-02-25 15:34:50 | POINT (462283.995 1681393.698) | 0 | 497.209041 |
235000 | 235018 | 203106200 | -61.41107 | 15.21436 | 2015-02-25 15:34:50 | POINT (462283.995 1681393.698) | 0.0 | 235000 | 203106200 | -61.41427 | 15.22638 | 2015-02-25 15:42:19 | POINT (461936.769 1682722.187) | 0 | 1373.116137 |
234989 | 235000 | 203106200 | -61.41427 | 15.22638 | 2015-02-25 15:42:19 | POINT (461936.769 1682722.187) | 0.0 | 234989 | 203106200 | -61.41553 | 15.2353 | 2015-02-25 15:47:19 | POINT (461798.818 1683708.377) | 0 | 995.792381 |
234984 | 234989 | 203106200 | -61.41553 | 15.2353 | 2015-02-25 15:47:19 | POINT (461798.818 1683708.377) | 0.0 | 234984 | 203106200 | -61.41687 | 15.23792 | 2015-02-25 15:49:50 | POINT (461654.150 1683997.765) | 0 | 323.533223 |
234972 | 234984 | 203106200 | -61.41687 | 15.23792 | 2015-02-25 15:49:50 | POINT (461654.150 1683997.765) | 0.0 | 234972 | 203106200 | -61.41851 | 15.24147 | 2015-02-25 15:54:49 | POINT (461476.997 1684389.925) | 0 | 430.317090 |
… | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … |
259103 | 259118 | 983191049 | -61.38323 | 15.29282 | 2015-02-19 19:44:46 | POINT (465249.261 1690079.703) | 0.0 | 259103 | 983191049 | -61.38322 | 15.2927 | 2015-02-19 19:50:45 | POINT (465250.372 1690066.434) | 0 | 13.315561 |
259094 | 259103 | 983191049 | -61.38322 | 15.2927 | 2015-02-19 19:50:45 | POINT (465250.372 1690066.434) | 0.0 | 259094 | 983191049 | -61.38328 | 15.29259 | 2015-02-19 19:55:09 | POINT (465243.965 1690054.249) | 0 | 13.766128 |
258954 | 259094 | 983191049 | -61.38328 | 15.29259 | 2015-02-19 19:55:09 | POINT (465243.965 1690054.249) | 0.0 | 258954 | 983191049 | -61.38344 | 15.2932 | 2015-02-19 20:51:12 | POINT (465226.597 1690121.667) | 0 | 69.619301 |
258930 | 258954 | 983191049 | -61.38344 | 15.2932 | 2015-02-19 20:51:12 | POINT (465226.597 1690121.667) | 0.0 | 258930 | 983191049 | -61.38329 | 15.29258 | 2015-02-19 21:02:54 | POINT (465242.895 1690053.140) | 0 | 70.438502 |
258206 | 258930 | 983191049 | -61.38329 | 15.29258 | 2015-02-19 21:02:54 | POINT (465242.895 1690053.140) | 0.0 | 258206 | 983191049 | -61.38301 | 15.29255 | 2015-02-20 01:11:35 | POINT (465272.964 1690049.908) | 0 | 30.241849 |
166255 rows × 15 columns
Add a column in which we calculate the time passed as ships traveled between the first and second geometry:
'time_passed'] = abs(ais_joined['TIMESTAMP'] - ais_joined['TIMESTAMP_2'])
ais_joined[ ais_joined
field_1_2 | MMSI_2 | LON_2 | LAT_2 | TIMESTAMP_2 | geometry_2 | index_right_2 | field_1 | MMSI | LON | LAT | TIMESTAMP | geometry | index_right | distance | time_passed | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
235018 | 235025 | 203106200 | -61.40929 | 15.21021 | 2015-02-25 15:32:20 | POINT (462476.396 1680935.224) | 0.0 | 235018 | 203106200 | -61.41107 | 15.21436 | 2015-02-25 15:34:50 | POINT (462283.995 1681393.698) | 0 | 497.209041 | 0 days 00:02:30 |
235000 | 235018 | 203106200 | -61.41107 | 15.21436 | 2015-02-25 15:34:50 | POINT (462283.995 1681393.698) | 0.0 | 235000 | 203106200 | -61.41427 | 15.22638 | 2015-02-25 15:42:19 | POINT (461936.769 1682722.187) | 0 | 1373.116137 | 0 days 00:07:29 |
234989 | 235000 | 203106200 | -61.41427 | 15.22638 | 2015-02-25 15:42:19 | POINT (461936.769 1682722.187) | 0.0 | 234989 | 203106200 | -61.41553 | 15.2353 | 2015-02-25 15:47:19 | POINT (461798.818 1683708.377) | 0 | 995.792381 | 0 days 00:05:00 |
234984 | 234989 | 203106200 | -61.41553 | 15.2353 | 2015-02-25 15:47:19 | POINT (461798.818 1683708.377) | 0.0 | 234984 | 203106200 | -61.41687 | 15.23792 | 2015-02-25 15:49:50 | POINT (461654.150 1683997.765) | 0 | 323.533223 | 0 days 00:02:31 |
234972 | 234984 | 203106200 | -61.41687 | 15.23792 | 2015-02-25 15:49:50 | POINT (461654.150 1683997.765) | 0.0 | 234972 | 203106200 | -61.41851 | 15.24147 | 2015-02-25 15:54:49 | POINT (461476.997 1684389.925) | 0 | 430.317090 | 0 days 00:04:59 |
… | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … |
259103 | 259118 | 983191049 | -61.38323 | 15.29282 | 2015-02-19 19:44:46 | POINT (465249.261 1690079.703) | 0.0 | 259103 | 983191049 | -61.38322 | 15.2927 | 2015-02-19 19:50:45 | POINT (465250.372 1690066.434) | 0 | 13.315561 | 0 days 00:05:59 |
259094 | 259103 | 983191049 | -61.38322 | 15.2927 | 2015-02-19 19:50:45 | POINT (465250.372 1690066.434) | 0.0 | 259094 | 983191049 | -61.38328 | 15.29259 | 2015-02-19 19:55:09 | POINT (465243.965 1690054.249) | 0 | 13.766128 | 0 days 00:04:24 |
258954 | 259094 | 983191049 | -61.38328 | 15.29259 | 2015-02-19 19:55:09 | POINT (465243.965 1690054.249) | 0.0 | 258954 | 983191049 | -61.38344 | 15.2932 | 2015-02-19 20:51:12 | POINT (465226.597 1690121.667) | 0 | 69.619301 | 0 days 00:56:03 |
258930 | 258954 | 983191049 | -61.38344 | 15.2932 | 2015-02-19 20:51:12 | POINT (465226.597 1690121.667) | 0.0 | 258930 | 983191049 | -61.38329 | 15.29258 | 2015-02-19 21:02:54 | POINT (465242.895 1690053.140) | 0 | 70.438502 | 0 days 00:11:42 |
258206 | 258930 | 983191049 | -61.38329 | 15.29258 | 2015-02-19 21:02:54 | POINT (465242.895 1690053.140) | 0.0 | 258206 | 983191049 | -61.38301 | 15.29255 | 2015-02-20 01:11:35 | POINT (465272.964 1690049.908) | 0 | 30.241849 | 0 days 04:08:41 |
166255 rows × 16 columns
Next, we convert the time passed to seconds for the purpose of calculating speed using the commands time_delta
and total_seconds
:
'time_seconds'] = pd.to_timedelta(ais_joined.time_passed, errors='coerce').dt.total_seconds()
ais_joined[ ais_joined
field_1_2 | MMSI_2 | LON_2 | LAT_2 | TIMESTAMP_2 | geometry_2 | index_right_2 | field_1 | MMSI | LON | LAT | TIMESTAMP | geometry | index_right | distance | time_passed | time_seconds | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
235018 | 235025 | 203106200 | -61.40929 | 15.21021 | 2015-02-25 15:32:20 | POINT (462476.396 1680935.224) | 0.0 | 235018 | 203106200 | -61.41107 | 15.21436 | 2015-02-25 15:34:50 | POINT (462283.995 1681393.698) | 0 | 497.209041 | 0 days 00:02:30 | 150.0 |
235000 | 235018 | 203106200 | -61.41107 | 15.21436 | 2015-02-25 15:34:50 | POINT (462283.995 1681393.698) | 0.0 | 235000 | 203106200 | -61.41427 | 15.22638 | 2015-02-25 15:42:19 | POINT (461936.769 1682722.187) | 0 | 1373.116137 | 0 days 00:07:29 | 449.0 |
234989 | 235000 | 203106200 | -61.41427 | 15.22638 | 2015-02-25 15:42:19 | POINT (461936.769 1682722.187) | 0.0 | 234989 | 203106200 | -61.41553 | 15.2353 | 2015-02-25 15:47:19 | POINT (461798.818 1683708.377) | 0 | 995.792381 | 0 days 00:05:00 | 300.0 |
234984 | 234989 | 203106200 | -61.41553 | 15.2353 | 2015-02-25 15:47:19 | POINT (461798.818 1683708.377) | 0.0 | 234984 | 203106200 | -61.41687 | 15.23792 | 2015-02-25 15:49:50 | POINT (461654.150 1683997.765) | 0 | 323.533223 | 0 days 00:02:31 | 151.0 |
234972 | 234984 | 203106200 | -61.41687 | 15.23792 | 2015-02-25 15:49:50 | POINT (461654.150 1683997.765) | 0.0 | 234972 | 203106200 | -61.41851 | 15.24147 | 2015-02-25 15:54:49 | POINT (461476.997 1684389.925) | 0 | 430.317090 | 0 days 00:04:59 | 299.0 |
… | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … |
259103 | 259118 | 983191049 | -61.38323 | 15.29282 | 2015-02-19 19:44:46 | POINT (465249.261 1690079.703) | 0.0 | 259103 | 983191049 | -61.38322 | 15.2927 | 2015-02-19 19:50:45 | POINT (465250.372 1690066.434) | 0 | 13.315561 | 0 days 00:05:59 | 359.0 |
259094 | 259103 | 983191049 | -61.38322 | 15.2927 | 2015-02-19 19:50:45 | POINT (465250.372 1690066.434) | 0.0 | 259094 | 983191049 | -61.38328 | 15.29259 | 2015-02-19 19:55:09 | POINT (465243.965 1690054.249) | 0 | 13.766128 | 0 days 00:04:24 | 264.0 |
258954 | 259094 | 983191049 | -61.38328 | 15.29259 | 2015-02-19 19:55:09 | POINT (465243.965 1690054.249) | 0.0 | 258954 | 983191049 | -61.38344 | 15.2932 | 2015-02-19 20:51:12 | POINT (465226.597 1690121.667) | 0 | 69.619301 | 0 days 00:56:03 | 3363.0 |
258930 | 258954 | 983191049 | -61.38344 | 15.2932 | 2015-02-19 20:51:12 | POINT (465226.597 1690121.667) | 0.0 | 258930 | 983191049 | -61.38329 | 15.29258 | 2015-02-19 21:02:54 | POINT (465242.895 1690053.140) | 0 | 70.438502 | 0 days 00:11:42 | 702.0 |
258206 | 258930 | 983191049 | -61.38329 | 15.29258 | 2015-02-19 21:02:54 | POINT (465242.895 1690053.140) | 0.0 | 258206 | 983191049 | -61.38301 | 15.29255 | 2015-02-20 01:11:35 | POINT (465272.964 1690049.908) | 0 | 30.241849 | 0 days 04:08:41 | 14921.0 |
166255 rows × 17 columns
Then, we add a column for speed, which is calculated by dividing the distance travelled by the time in seconds:
'avg_speed_mps'] = ais_joined_2['distance'] / ais_joined_2['time_seconds']
ais_joined_2[ ais_joined_2
field_1_2 | MMSI_2 | LON_2 | LAT_2 | TIMESTAMP_2 | geometry_2 | field_1 | MMSI | LON | LAT | TIMESTAMP | geometry | distance | time_passed | time_seconds | avg_speed | time_for_10_knots | time_difference | avg_speed_mps | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
511094 | 132562 | 1184 | -61.30541 | 14.79982 | 2015-07-21 12:27:51 | POINT (473775.169 1635578.904) | 132559 | 1184 | -61.39245 | 14.90217 | 2015-07-21 12:30:31 | POINT (464378.762 1646871.313) | 14690.505921 | 0 days 00:02:40 | 160.0 | 91.815662 | 285.563057 | 125.563057 | 91.815662 |
511090 | 132559 | 1184 | -61.39245 | 14.90217 | 2015-07-21 12:30:31 | POINT (464378.762 1646871.313) | 132555 | 1184 | -61.48131 | 15.00648 | 2015-07-21 12:33:12 | POINT (454794.970 1658383.473) | 14979.281904 | 0 days 00:02:41 | 161.0 | 93.039018 | 291.176462 | 130.176462 | 93.039018 |
511087 | 132555 | 1184 | -61.48131 | 15.00648 | 2015-07-21 12:33:12 | POINT (454794.970 1658383.473) | 132552 | 1184 | -61.54865 | 15.08558 | 2015-07-21 12:35:12 | POINT (447538.279 1667115.779) | 11353.974711 | 0 days 00:02:00 | 120.0 | 94.616456 | 220.705519 | 100.705519 | 94.616456 |
511084 | 132552 | 1184 | -61.54865 | 15.08558 | 2015-07-21 12:35:12 | POINT (447538.279 1667115.779) | 132549 | 1184 | -61.61598 | 15.1644 | 2015-07-21 12:37:12 | POINT (440288.034 1675819.254) | 11327.688520 | 0 days 00:02:00 | 120.0 | 94.397404 | 220.194552 | 100.194552 | 94.397404 |
511082 | 132549 | 1184 | -61.61598 | 15.1644 | 2015-07-21 12:37:12 | POINT (440288.034 1675819.254) | 132547 | 1184 | -61.6842 | 15.2442 | 2015-07-21 12:39:12 | POINT (432947.398 1684633.140) | 11470.375572 | 0 days 00:02:00 | 120.0 | 95.586463 | 222.968190 | 102.968190 | 95.586463 |
… | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … |
258930 | 258954 | 983191049 | -61.38344 | 15.2932 | 2015-02-19 20:51:12 | POINT (465226.597 1690121.667) | 258930 | 983191049 | -61.38329 | 15.29258 | 2015-02-19 21:02:54 | POINT (465242.895 1690053.140) | 70.438502 | 0 days 00:11:42 | 702.0 | 0.100340 | 1.369227 | -700.630773 | 0.100340 |
258206 | 258930 | 983191049 | -61.38329 | 15.29258 | 2015-02-19 21:02:54 | POINT (465242.895 1690053.140) | 258206 | 983191049 | -61.38301 | 15.29255 | 2015-02-20 01:11:35 | POINT (465272.964 1690049.908) | 30.241849 | 0 days 04:08:41 | 14921.0 | 0.002027 | 0.587860 | -14920.412140 | 0.002027 |
148161 | 148164 | 999000000 | -61.33341 | 14.71754 | 2015-03-23 09:50:22 | POINT (470789.272 1626469.836) | 148161 | 999000000 | -61.329 | 14.71341 | 2015-03-23 09:52:12 | POINT (471265.334 1626014.478) | 658.775338 | 0 days 00:01:50 | 110.0 | 5.988867 | 12.805679 | -97.194321 | 5.988867 |
148155 | 148161 | 999000000 | -61.329 | 14.71341 | 2015-03-23 09:52:12 | POINT (471265.334 1626014.478) | 148155 | 999000000 | -61.32005 | 14.70516 | 2015-03-23 09:55:51 | POINT (472231.502 1625104.938) | 1326.930261 | 0 days 00:03:39 | 219.0 | 6.059042 | 25.793684 | -193.206316 | 6.059042 |
148152 | 148155 | 999000000 | -61.32005 | 14.70516 | 2015-03-23 09:55:51 | POINT (472231.502 1625104.938) | 148152 | 999000000 | -61.31433 | 14.6998 | 2015-03-23 09:58:12 | POINT (472849.053 1624514.001) | 854.737548 | 0 days 00:02:21 | 141.0 | 6.061968 | 16.614912 | -124.385088 | 6.061968 |
615312 rows × 19 columns
To calculate the time it would take each vessel to cover the distance they did if their speed were changed to 10 knots, we converted nautical miles to meters in order to find the time in seconds it would take each vessel to do this.
= 1852
m_per_nm
'time_for_10_knots'] = (ais_joined['distance'] * 60 * 60) / (m_per_nm * 10)
ais_joined[ ais_joined
field_1_2 | MMSI_2 | LON_2 | LAT_2 | TIMESTAMP_2 | geometry_2 | index_right_2 | field_1 | MMSI | LON | LAT | TIMESTAMP | geometry | index_right | distance | time_passed | time_seconds | time_for_10_knots | time_difference | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
235018 | 235025 | 203106200 | -61.40929 | 15.21021 | 2015-02-25 15:32:20 | POINT (462476.396 1680935.224) | 0.0 | 235018 | 203106200 | -61.41107 | 15.21436 | 2015-02-25 15:34:50 | POINT (462283.995 1681393.698) | 0 | 497.209041 | 0 days 00:02:30 | 150.0 | 96.649706 | -140.334946 |
235000 | 235018 | 203106200 | -61.41107 | 15.21436 | 2015-02-25 15:34:50 | POINT (462283.995 1681393.698) | 0.0 | 235000 | 203106200 | -61.41427 | 15.22638 | 2015-02-25 15:42:19 | POINT (461936.769 1682722.187) | 0 | 1373.116137 | 0 days 00:07:29 | 449.0 | 266.912424 | -422.308527 |
234989 | 235000 | 203106200 | -61.41427 | 15.22638 | 2015-02-25 15:42:19 | POINT (461936.769 1682722.187) | 0.0 | 234989 | 203106200 | -61.41553 | 15.2353 | 2015-02-25 15:47:19 | POINT (461798.818 1683708.377) | 0 | 995.792381 | 0 days 00:05:00 | 300.0 | 193.566553 | -280.643177 |
234984 | 234989 | 203106200 | -61.41553 | 15.2353 | 2015-02-25 15:47:19 | POINT (461798.818 1683708.377) | 0.0 | 234984 | 203106200 | -61.41687 | 15.23792 | 2015-02-25 15:49:50 | POINT (461654.150 1683997.765) | 0 | 323.533223 | 0 days 00:02:31 | 151.0 | 62.889827 | -144.710963 |
234972 | 234984 | 203106200 | -61.41687 | 15.23792 | 2015-02-25 15:49:50 | POINT (461654.150 1683997.765) | 0.0 | 234972 | 203106200 | -61.41851 | 15.24147 | 2015-02-25 15:54:49 | POINT (461476.997 1684389.925) | 0 | 430.317090 | 0 days 00:04:59 | 299.0 | 83.646951 | -290.635233 |
… | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … |
259103 | 259118 | 983191049 | -61.38323 | 15.29282 | 2015-02-19 19:44:46 | POINT (465249.261 1690079.703) | 0.0 | 259103 | 983191049 | -61.38322 | 15.2927 | 2015-02-19 19:50:45 | POINT (465250.372 1690066.434) | 0 | 13.315561 | 0 days 00:05:59 | 359.0 | 2.588338 | -358.741164 |
259094 | 259103 | 983191049 | -61.38322 | 15.2927 | 2015-02-19 19:50:45 | POINT (465250.372 1690066.434) | 0.0 | 259094 | 983191049 | -61.38328 | 15.29259 | 2015-02-19 19:55:09 | POINT (465243.965 1690054.249) | 0 | 13.766128 | 0 days 00:04:24 | 264.0 | 2.675921 | -263.732406 |
258954 | 259094 | 983191049 | -61.38328 | 15.29259 | 2015-02-19 19:55:09 | POINT (465243.965 1690054.249) | 0.0 | 258954 | 983191049 | -61.38344 | 15.2932 | 2015-02-19 20:51:12 | POINT (465226.597 1690121.667) | 0 | 69.619301 | 0 days 00:56:03 | 3363.0 | 13.532909 | -3361.646697 |
258930 | 258954 | 983191049 | -61.38344 | 15.2932 | 2015-02-19 20:51:12 | POINT (465226.597 1690121.667) | 0.0 | 258930 | 983191049 | -61.38329 | 15.29258 | 2015-02-19 21:02:54 | POINT (465242.895 1690053.140) | 0 | 70.438502 | 0 days 00:11:42 | 702.0 | 13.692149 | -700.630773 |
258206 | 258930 | 983191049 | -61.38329 | 15.29258 | 2015-02-19 21:02:54 | POINT (465242.895 1690053.140) | 0.0 | 258206 | 983191049 | -61.38301 | 15.29255 | 2015-02-20 01:11:35 | POINT (465272.964 1690049.908) | 0 | 30.241849 | 0 days 04:08:41 | 14921.0 | 5.878545 | -14920.412140 |
166255 rows × 19 columns
To find the difference between the time that it actually took and how much it would have taken at 10 knots, we subtracted the time it actually took from the time it would have taken the vessels under 10 knots.
'time_difference'] = ais_joined['time_for_10_knots'] - ais_joined['time_seconds']
ais_joined[ ais_joined
field_1_2 | MMSI_2 | LON_2 | LAT_2 | TIMESTAMP_2 | geometry_2 | index_right_2 | field_1 | MMSI | LON | LAT | TIMESTAMP | geometry | index_right | distance | time_passed | time_seconds | time_for_10_knots | time_difference | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
235018 | 235025 | 203106200 | -61.40929 | 15.21021 | 2015-02-25 15:32:20 | POINT (462476.396 1680935.224) | 0.0 | 235018 | 203106200 | -61.41107 | 15.21436 | 2015-02-25 15:34:50 | POINT (462283.995 1681393.698) | 0 | 497.209041 | 0 days 00:02:30 | 150.0 | 96.649706 | -53.350294 |
235000 | 235018 | 203106200 | -61.41107 | 15.21436 | 2015-02-25 15:34:50 | POINT (462283.995 1681393.698) | 0.0 | 235000 | 203106200 | -61.41427 | 15.22638 | 2015-02-25 15:42:19 | POINT (461936.769 1682722.187) | 0 | 1373.116137 | 0 days 00:07:29 | 449.0 | 266.912424 | -182.087576 |
234989 | 235000 | 203106200 | -61.41427 | 15.22638 | 2015-02-25 15:42:19 | POINT (461936.769 1682722.187) | 0.0 | 234989 | 203106200 | -61.41553 | 15.2353 | 2015-02-25 15:47:19 | POINT (461798.818 1683708.377) | 0 | 995.792381 | 0 days 00:05:00 | 300.0 | 193.566553 | -106.433447 |
234984 | 234989 | 203106200 | -61.41553 | 15.2353 | 2015-02-25 15:47:19 | POINT (461798.818 1683708.377) | 0.0 | 234984 | 203106200 | -61.41687 | 15.23792 | 2015-02-25 15:49:50 | POINT (461654.150 1683997.765) | 0 | 323.533223 | 0 days 00:02:31 | 151.0 | 62.889827 | -88.110173 |
234972 | 234984 | 203106200 | -61.41687 | 15.23792 | 2015-02-25 15:49:50 | POINT (461654.150 1683997.765) | 0.0 | 234972 | 203106200 | -61.41851 | 15.24147 | 2015-02-25 15:54:49 | POINT (461476.997 1684389.925) | 0 | 430.317090 | 0 days 00:04:59 | 299.0 | 83.646951 | -215.353049 |
… | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … |
259103 | 259118 | 983191049 | -61.38323 | 15.29282 | 2015-02-19 19:44:46 | POINT (465249.261 1690079.703) | 0.0 | 259103 | 983191049 | -61.38322 | 15.2927 | 2015-02-19 19:50:45 | POINT (465250.372 1690066.434) | 0 | 13.315561 | 0 days 00:05:59 | 359.0 | 2.588338 | -356.411662 |
259094 | 259103 | 983191049 | -61.38322 | 15.2927 | 2015-02-19 19:50:45 | POINT (465250.372 1690066.434) | 0.0 | 259094 | 983191049 | -61.38328 | 15.29259 | 2015-02-19 19:55:09 | POINT (465243.965 1690054.249) | 0 | 13.766128 | 0 days 00:04:24 | 264.0 | 2.675921 | -261.324079 |
258954 | 259094 | 983191049 | -61.38328 | 15.29259 | 2015-02-19 19:55:09 | POINT (465243.965 1690054.249) | 0.0 | 258954 | 983191049 | -61.38344 | 15.2932 | 2015-02-19 20:51:12 | POINT (465226.597 1690121.667) | 0 | 69.619301 | 0 days 00:56:03 | 3363.0 | 13.532909 | -3349.467091 |
258930 | 258954 | 983191049 | -61.38344 | 15.2932 | 2015-02-19 20:51:12 | POINT (465226.597 1690121.667) | 0.0 | 258930 | 983191049 | -61.38329 | 15.29258 | 2015-02-19 21:02:54 | POINT (465242.895 1690053.140) | 0 | 70.438502 | 0 days 00:11:42 | 702.0 | 13.692149 | -688.307851 |
258206 | 258930 | 983191049 | -61.38329 | 15.29258 | 2015-02-19 21:02:54 | POINT (465242.895 1690053.140) | 0.0 | 258206 | 983191049 | -61.38301 | 15.29255 | 2015-02-20 01:11:35 | POINT (465272.964 1690049.908) | 0 | 30.241849 | 0 days 04:08:41 | 14921.0 | 5.878545 | -14915.121455 |
166255 rows × 19 columns
Next, we took all measurements in the time_difference
column > 0 to give us the vessels that actually travelled and therefor had positive time values.
= ais_joined[ais_joined['time_difference'] > 0]
fast_ships fast_ships
field_1_2 | MMSI_2 | LON_2 | LAT_2 | TIMESTAMP_2 | geometry_2 | index_right_2 | field_1 | MMSI | LON | LAT | TIMESTAMP | geometry | index_right | distance | time_passed | time_seconds | time_for_10_knots | time_difference | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
53218 | 53227 | 203106200 | -61.42602 | 15.35828 | 2015-04-26 16:04:15 | POINT (460636.434 1697307.052) | 0.0 | 53218 | 203106200 | -61.41927 | 15.34898 | 2015-04-26 16:08:16 | POINT (461363.603 1696280.393) | 0 | 1258.095562 | 0 days 00:04:01 | 241.0 | 244.554213 | 3.554213 |
84957 | 84977 | 203518400 | -61.51328 | 15.39394 | 2015-04-14 17:28:32 | POINT (451262.879 1701228.097) | 0.0 | 84957 | 203518400 | -61.51546 | 15.41408 | 2015-04-14 17:35:26 | POINT (451023.962 1703455.061) | 0 | 2239.743578 | 0 days 00:06:54 | 414.0 | 435.371322 | 21.371322 |
39279 | 39284 | 205531510 | -61.40996 | 15.34549 | 2015-05-02 18:24:17 | POINT (462363.849 1695897.095) | 0.0 | 39279 | 205531510 | -61.40981 | 15.3516 | 2015-05-02 18:26:15 | POINT (462378.106 1696572.914) | 0 | 675.968930 | 0 days 00:01:58 | 118.0 | 131.397848 | 13.397848 |
139303 | 139308 | 205571000 | -61.51243 | 15.33665 | 2015-03-26 09:35:06 | POINT (451368.368 1694892.030) | 0.0 | 139303 | 205571000 | -61.50684 | 15.33412 | 2015-03-26 09:37:06 | POINT (451968.978 1694613.570) | 0 | 662.020878 | 0 days 00:02:00 | 120.0 | 128.686564 | 8.686564 |
139301 | 139303 | 205571000 | -61.50684 | 15.33412 | 2015-03-26 09:37:06 | POINT (451968.978 1694613.570) | 0.0 | 139301 | 205571000 | -61.50115 | 15.33156 | 2015-03-26 09:39:06 | POINT (452580.343 1694331.833) | 0 | 673.159437 | 0 days 00:02:00 | 120.0 | 130.851726 | 10.851726 |
… | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … | … |
450065 | 71532 | 775907000 | -61.41703 | 15.26152 | 2015-08-31 15:22:58 | POINT (461629.985 1686607.886) | 0.0 | 71530 | 775907000 | -61.41251 | 15.26938 | 2015-08-31 15:25:58 | POINT (462112.948 1687478.511) | 0 | 995.610920 | 0 days 00:03:00 | 180.0 | 193.531280 | 13.531280 |
450061 | 71530 | 775907000 | -61.41251 | 15.26938 | 2015-08-31 15:25:58 | POINT (462112.948 1687478.511) | 0.0 | 71526 | 775907000 | -61.40833 | 15.27759 | 2015-08-31 15:28:58 | POINT (462559.266 1688387.759) | 0 | 1012.882607 | 0 days 00:03:00 | 180.0 | 196.888628 | 16.888628 |
450059 | 71526 | 775907000 | -61.40833 | 15.27759 | 2015-08-31 15:28:58 | POINT (462559.266 1688387.759) | 0.0 | 71524 | 775907000 | -61.40408 | 15.28582 | 2015-08-31 15:31:59 | POINT (463013.057 1689299.250) | 0 | 1018.205189 | 0 days 00:03:01 | 181.0 | 197.923255 | 16.923255 |
450056 | 71524 | 775907000 | -61.40408 | 15.28582 | 2015-08-31 15:31:59 | POINT (463013.057 1689299.250) | 0.0 | 71521 | 775907000 | -61.39967 | 15.29361 | 2015-08-31 15:34:59 | POINT (463484.122 1690162.135) | 0 | 983.093306 | 0 days 00:03:00 | 180.0 | 191.098051 | 11.098051 |
172907 | 172921 | 982358863 | -61.40942 | 15.35087 | 2015-03-14 16:04:52 | POINT (462420.182 1696492.289) | 0.0 | 172907 | 982358863 | -61.40751 | 15.34122 | 2015-03-14 16:08:23 | POINT (462628.091 1695425.545) | 0 | 1086.815697 | 0 days 00:03:31 | 211.0 | 211.260071 | 0.260071 |
21246 rows × 19 columns
Finally, we summed up all of the time differences which represents our approximation to the impact on shipping (in terms of increased travel time) of a 10-knot reduced-speed zone in our identified whale habitat.
= fast_ships['time_difference'].sum() seconds_lost
= seconds_lost / (60 * 60 * 24)
days_lost days_lost
27.876040448213132
We can see from our calculations that a 10-knot reduced-speed zone would amount to a total of 27.89 day impact on shipping. While this number is may seem large, it is simply the total amount of time this reduction would cause across all vessels. In order to advocate for this regulation, it might be best to took at the additional time added to each invidudal vessel which we would expect be much lower overall.
For attribution, please cite this work as
Leonard (2022, March 22). Scout Leonard (she/her): Spatial Analysis: Protecting Whales. Retrieved from https://scoutcleonard.github.io/posts/2022-03-22-spatial-analysis-protecting-whales/
BibTeX citation
@misc{leonard2022spatial, author = {Leonard, Scout}, title = {Scout Leonard (she/her): Spatial Analysis: Protecting Whales}, url = {https://scoutcleonard.github.io/posts/2022-03-22-spatial-analysis-protecting-whales/}, year = {2022} }