{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### x lines of Python\n",
"\n",
"# Read and write SHP files\n",
"\n",
"This notebook goes with [the blog post of the same name](https://agilescientific.com/blog/2017/8/10/x-lines-of-python-read-and-write-a-shapefile), published on 10 August 2017.\n",
"\n",
"We're going to load a shapefile containing some well data. Then we'll change its CRS, make a new attribute, and save a new shapefile.\n",
"\n",
"We'll lean on `geopandas` for help, but we'll also inspect the file with `fiona`, a lower-level library that `geopandas` uses under the hood.\n",
"\n",
"Install `geopandas` and its dependencies (like `gdal`, `proj`, and `fiona`) with \n",
"\n",
" conda install geopandas\n",
" conda install fiona # I had to do this too to get fiona to work."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import fiona\n",
"import matplotlib.pyplot as plt\n",
"import folium"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'geometry': {'coordinates': (-59.9170497222, 43.9346961111), 'type': 'Point'},\n",
" 'id': '0',\n",
" 'properties': OrderedDict([('Well_No_', 1.0),\n",
" ('D__', 1.0),\n",
" ('Well_Name', 'Sable Island'),\n",
" ('Well_Nam_1', 'C-67'),\n",
" ('Company', 'Mobil et al'),\n",
" ('Drilling_U', 'Bawden Rig 18'),\n",
" ('Spud_Date', '1967-06-07'),\n",
" ('Well_Termi', '1968-01-02'),\n",
" ('RT_Elevati', 8.2),\n",
" ('Water_Dept', 3.9),\n",
" ('Total_Dept', 4604.0),\n",
" ('Total_De_1', 15106.0),\n",
" ('Well_Type', 'Exploratory'),\n",
" ('Well_Symb', 'Plugged dry hole')]),\n",
" 'type': 'Feature'}\n"
]
}
],
"source": [
"import pprint\n",
"with fiona.open('../data/offshore_wells_2011_Geographic_NAD27.shp') as src:\n",
" pprint.pprint(src[0])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Using Geopandas"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import geopandas as gpd"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Load our data into a GeoDataFrame (gdf):"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"gdf = gpd.read_file('../data/offshore_wells_2011_Geographic_NAD27.shp')"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"
\n",
" \n",
" \n",
" | \n",
" Company | \n",
" D__ | \n",
" Drilling_U | \n",
" RT_Elevati | \n",
" Spud_Date | \n",
" Total_De_1 | \n",
" Total_Dept | \n",
" Water_Dept | \n",
" Well_Nam_1 | \n",
" Well_Name | \n",
" Well_No_ | \n",
" Well_Symb | \n",
" Well_Termi | \n",
" Well_Type | \n",
" geometry | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Mobil et al | \n",
" 1.0 | \n",
" Bawden Rig 18 | \n",
" 8.2 | \n",
" 1967-06-07 | \n",
" 15106.0 | \n",
" 4604.0 | \n",
" 3.9 | \n",
" C-67 | \n",
" Sable Island | \n",
" 1.0 | \n",
" Plugged dry hole | \n",
" 1968-01-02 | \n",
" Exploratory | \n",
" POINT (-59.9170497222 43.9346961111) | \n",
"
\n",
" \n",
" 1 | \n",
" Shell | \n",
" 2.0 | \n",
" Sedneth 1 | \n",
" 25.9 | \n",
" 1969-09-01 | \n",
" 13085.0 | \n",
" 3988.0 | \n",
" 57.9 | \n",
" E-84 | \n",
" Onondaga | \n",
" 2.0 | \n",
" Plugged gas well | \n",
" 1969-11-11 | \n",
" Exploratory | \n",
" POINT (-60.2214388889 43.721147222222) | \n",
"
\n",
" \n",
" 2 | \n",
" Shell | \n",
" 3.0 | \n",
" Sedneth 1 | \n",
" 25.9 | \n",
" 1969-11-16 | \n",
" 13516.0 | \n",
" 4120.0 | \n",
" 82.3 | \n",
" O-25 | \n",
" Oneida | \n",
" 3.0 | \n",
" Plugged dry hole | \n",
" 1970-02-10 | \n",
" Exploratory | \n",
" POINT (-61.5601366667 43.2492655556) | \n",
"
\n",
" \n",
" 3 | \n",
" Shell | \n",
" 4.0 | \n",
" Sedneth 1 | \n",
" 26.0 | \n",
" 1970-02-16 | \n",
" 7235.0 | \n",
" 2205.0 | \n",
" 95.1 | \n",
" N-30 | \n",
" Naskapi | \n",
" 4.0 | \n",
" Plugged dry hole | \n",
" 1970-03-19 | \n",
" Exploratory | \n",
" POINT (-62.5665408333 43.4963302778) | \n",
"
\n",
" \n",
" 4 | \n",
" Shell | \n",
" 5.0 | \n",
" Sedco H | \n",
" 31.4 | \n",
" 1970-05-03 | \n",
" 6975.0 | \n",
" 2126.0 | \n",
" 117.0 | \n",
" B-93 | \n",
" Mohawk | \n",
" 5.0 | \n",
" Plugged dry hole | \n",
" 1970-05-23 | \n",
" Exploratory | \n",
" POINT (-64.7315288889 42.7029227778) | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Company D__ Drilling_U RT_Elevati Spud_Date Total_De_1 \\\n",
"0 Mobil et al 1.0 Bawden Rig 18 8.2 1967-06-07 15106.0 \n",
"1 Shell 2.0 Sedneth 1 25.9 1969-09-01 13085.0 \n",
"2 Shell 3.0 Sedneth 1 25.9 1969-11-16 13516.0 \n",
"3 Shell 4.0 Sedneth 1 26.0 1970-02-16 7235.0 \n",
"4 Shell 5.0 Sedco H 31.4 1970-05-03 6975.0 \n",
"\n",
" Total_Dept Water_Dept Well_Nam_1 Well_Name Well_No_ \\\n",
"0 4604.0 3.9 C-67 Sable Island 1.0 \n",
"1 3988.0 57.9 E-84 Onondaga 2.0 \n",
"2 4120.0 82.3 O-25 Oneida 3.0 \n",
"3 2205.0 95.1 N-30 Naskapi 4.0 \n",
"4 2126.0 117.0 B-93 Mohawk 5.0 \n",
"\n",
" Well_Symb Well_Termi Well_Type \\\n",
"0 Plugged dry hole 1968-01-02 Exploratory \n",
"1 Plugged gas well 1969-11-11 Exploratory \n",
"2 Plugged dry hole 1970-02-10 Exploratory \n",
"3 Plugged dry hole 1970-03-19 Exploratory \n",
"4 Plugged dry hole 1970-05-23 Exploratory \n",
"\n",
" geometry \n",
"0 POINT (-59.9170497222 43.9346961111) \n",
"1 POINT (-60.2214388889 43.721147222222) \n",
"2 POINT (-61.5601366667 43.2492655556) \n",
"3 POINT (-62.5665408333 43.4963302778) \n",
"4 POINT (-64.7315288889 42.7029227778) "
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"gdf.head()"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"gdf.plot()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's look at the first 5 rows of the geometry attribute."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 POINT (-59.9170497222 43.9346961111)\n",
"1 POINT (-60.2214388889 43.721147222222)\n",
"2 POINT (-61.5601366667 43.2492655556)\n",
"3 POINT (-62.5665408333 43.4963302778)\n",
"4 POINT (-64.7315288889 42.7029227778)\n",
"Name: geometry, dtype: object"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"gdf.geometry[:5]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Notice we're in lat, lon:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'init': 'epsg:4267'}\n"
]
}
],
"source": [
"print(gdf.crs)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Visiting [EPSG 4267](http://spatialreference.org/ref/epsg/4267/) tells us the datum is NAD27."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Write a new file\n",
"\n",
"Let's cast the SHP to a new CRS: [EPSG 26920](http://spatialreference.org/ref/epsg/26920/):"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"gdf = gdf.to_crs({'init': 'epsg:26920'})"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we're in a UTM coordinate system: UTM Zone 20N, with a NAD83 datum:"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"0 POINT (747510.4372073817 4869250.818941217)\n",
"1 POINT (723875.2971043108 4844664.069700127)\n",
"2 POINT (616945.850614059 4789511.343230169)\n",
"3 POINT (535101.4182156855 4816032.927423127)\n",
"4 POINT (358242.7522037996 4729291.710525603)\n",
"Name: geometry, dtype: object"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"gdf.geometry[:5]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we'll also add a new attribute with the two-way seismic travel time to the seafloor (in milliseconds)."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"gdf['seafl_twt'] = 2 * 1000 * gdf.Water_Dept / 1485"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" Company | \n",
" D__ | \n",
" Drilling_U | \n",
" RT_Elevati | \n",
" Spud_Date | \n",
" Total_De_1 | \n",
" Total_Dept | \n",
" Water_Dept | \n",
" Well_Nam_1 | \n",
" Well_Name | \n",
" Well_No_ | \n",
" Well_Symb | \n",
" Well_Termi | \n",
" Well_Type | \n",
" geometry | \n",
" seafl_twt | \n",
"
\n",
" \n",
" \n",
" \n",
" 0 | \n",
" Mobil et al | \n",
" 1.0 | \n",
" Bawden Rig 18 | \n",
" 8.2 | \n",
" 1967-06-07 | \n",
" 15106.0 | \n",
" 4604.0 | \n",
" 3.9 | \n",
" C-67 | \n",
" Sable Island | \n",
" 1.0 | \n",
" Plugged dry hole | \n",
" 1968-01-02 | \n",
" Exploratory | \n",
" POINT (747510.4372073817 4869250.818941217) | \n",
" 5.252525 | \n",
"
\n",
" \n",
" 1 | \n",
" Shell | \n",
" 2.0 | \n",
" Sedneth 1 | \n",
" 25.9 | \n",
" 1969-09-01 | \n",
" 13085.0 | \n",
" 3988.0 | \n",
" 57.9 | \n",
" E-84 | \n",
" Onondaga | \n",
" 2.0 | \n",
" Plugged gas well | \n",
" 1969-11-11 | \n",
" Exploratory | \n",
" POINT (723875.2971043108 4844664.069700127) | \n",
" 77.979798 | \n",
"
\n",
" \n",
" 2 | \n",
" Shell | \n",
" 3.0 | \n",
" Sedneth 1 | \n",
" 25.9 | \n",
" 1969-11-16 | \n",
" 13516.0 | \n",
" 4120.0 | \n",
" 82.3 | \n",
" O-25 | \n",
" Oneida | \n",
" 3.0 | \n",
" Plugged dry hole | \n",
" 1970-02-10 | \n",
" Exploratory | \n",
" POINT (616945.850614059 4789511.343230169) | \n",
" 110.841751 | \n",
"
\n",
" \n",
" 3 | \n",
" Shell | \n",
" 4.0 | \n",
" Sedneth 1 | \n",
" 26.0 | \n",
" 1970-02-16 | \n",
" 7235.0 | \n",
" 2205.0 | \n",
" 95.1 | \n",
" N-30 | \n",
" Naskapi | \n",
" 4.0 | \n",
" Plugged dry hole | \n",
" 1970-03-19 | \n",
" Exploratory | \n",
" POINT (535101.4182156855 4816032.927423127) | \n",
" 128.080808 | \n",
"
\n",
" \n",
" 4 | \n",
" Shell | \n",
" 5.0 | \n",
" Sedco H | \n",
" 31.4 | \n",
" 1970-05-03 | \n",
" 6975.0 | \n",
" 2126.0 | \n",
" 117.0 | \n",
" B-93 | \n",
" Mohawk | \n",
" 5.0 | \n",
" Plugged dry hole | \n",
" 1970-05-23 | \n",
" Exploratory | \n",
" POINT (358242.7522037996 4729291.710525603) | \n",
" 157.575758 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Company D__ Drilling_U RT_Elevati Spud_Date Total_De_1 \\\n",
"0 Mobil et al 1.0 Bawden Rig 18 8.2 1967-06-07 15106.0 \n",
"1 Shell 2.0 Sedneth 1 25.9 1969-09-01 13085.0 \n",
"2 Shell 3.0 Sedneth 1 25.9 1969-11-16 13516.0 \n",
"3 Shell 4.0 Sedneth 1 26.0 1970-02-16 7235.0 \n",
"4 Shell 5.0 Sedco H 31.4 1970-05-03 6975.0 \n",
"\n",
" Total_Dept Water_Dept Well_Nam_1 Well_Name Well_No_ \\\n",
"0 4604.0 3.9 C-67 Sable Island 1.0 \n",
"1 3988.0 57.9 E-84 Onondaga 2.0 \n",
"2 4120.0 82.3 O-25 Oneida 3.0 \n",
"3 2205.0 95.1 N-30 Naskapi 4.0 \n",
"4 2126.0 117.0 B-93 Mohawk 5.0 \n",
"\n",
" Well_Symb Well_Termi Well_Type \\\n",
"0 Plugged dry hole 1968-01-02 Exploratory \n",
"1 Plugged gas well 1969-11-11 Exploratory \n",
"2 Plugged dry hole 1970-02-10 Exploratory \n",
"3 Plugged dry hole 1970-03-19 Exploratory \n",
"4 Plugged dry hole 1970-05-23 Exploratory \n",
"\n",
" geometry seafl_twt \n",
"0 POINT (747510.4372073817 4869250.818941217) 5.252525 \n",
"1 POINT (723875.2971043108 4844664.069700127) 77.979798 \n",
"2 POINT (616945.850614059 4789511.343230169) 110.841751 \n",
"3 POINT (535101.4182156855 4816032.927423127) 128.080808 \n",
"4 POINT (358242.7522037996 4729291.710525603) 157.575758 "
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"gdf.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"We can also get a statistical summary of the data frame:"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"
\n",
" \n",
" \n",
" | \n",
" D__ | \n",
" RT_Elevati | \n",
" Total_De_1 | \n",
" Total_Dept | \n",
" Water_Dept | \n",
" Well_No_ | \n",
" seafl_twt | \n",
"
\n",
" \n",
" \n",
" \n",
" count | \n",
" 207.000000 | \n",
" 207.000000 | \n",
" 207.000000 | \n",
" 207.000000 | \n",
" 207.000000 | \n",
" 207.000000 | \n",
" 207.000000 | \n",
"
\n",
" \n",
" mean | \n",
" 237.246377 | \n",
" 34.719952 | \n",
" 13026.159662 | \n",
" 3969.690821 | \n",
" 142.545894 | \n",
" 104.043478 | \n",
" 191.981002 | \n",
"
\n",
" \n",
" std | \n",
" 127.765494 | \n",
" 11.185937 | \n",
" 4081.887038 | \n",
" 1262.667988 | \n",
" 350.268990 | \n",
" 59.936723 | \n",
" 471.742748 | \n",
"
\n",
" \n",
" min | \n",
" 0.000000 | \n",
" 6.400000 | \n",
" 1503.000000 | \n",
" 0.000000 | \n",
" 0.000000 | \n",
" 1.000000 | \n",
" 0.000000 | \n",
"
\n",
" \n",
" 25% | \n",
" 129.500000 | \n",
" 25.900000 | \n",
" 9984.000000 | \n",
" 3043.000000 | \n",
" 39.500000 | \n",
" 52.500000 | \n",
" 53.198653 | \n",
"
\n",
" \n",
" 50% | \n",
" 267.000000 | \n",
" 31.400000 | \n",
" 13202.000000 | \n",
" 4024.000000 | \n",
" 53.300000 | \n",
" 104.000000 | \n",
" 71.784512 | \n",
"
\n",
" \n",
" 75% | \n",
" 349.500000 | \n",
" 41.500000 | \n",
" 15683.000000 | \n",
" 4800.500000 | \n",
" 82.650000 | \n",
" 156.500000 | \n",
" 111.313131 | \n",
"
\n",
" \n",
" max | \n",
" 403.000000 | \n",
" 82.000000 | \n",
" 21404.000000 | \n",
" 6676.000000 | \n",
" 2091.500000 | \n",
" 207.000000 | \n",
" 2816.835017 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" D__ RT_Elevati Total_De_1 Total_Dept Water_Dept \\\n",
"count 207.000000 207.000000 207.000000 207.000000 207.000000 \n",
"mean 237.246377 34.719952 13026.159662 3969.690821 142.545894 \n",
"std 127.765494 11.185937 4081.887038 1262.667988 350.268990 \n",
"min 0.000000 6.400000 1503.000000 0.000000 0.000000 \n",
"25% 129.500000 25.900000 9984.000000 3043.000000 39.500000 \n",
"50% 267.000000 31.400000 13202.000000 4024.000000 53.300000 \n",
"75% 349.500000 41.500000 15683.000000 4800.500000 82.650000 \n",
"max 403.000000 82.000000 21404.000000 6676.000000 2091.500000 \n",
"\n",
" Well_No_ seafl_twt \n",
"count 207.000000 207.000000 \n",
"mean 104.043478 191.981002 \n",
"std 59.936723 471.742748 \n",
"min 1.000000 0.000000 \n",
"25% 52.500000 53.198653 \n",
"50% 104.000000 71.784512 \n",
"75% 156.500000 111.313131 \n",
"max 207.000000 2816.835017 "
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"gdf.describe()"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"gdf.to_file('../data/offshore_wells_2011_UTM20_NAD83.shp')"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[0m\u001b[01;32m../data/offshore_wells_2011_Geographic_NAD27.shp\u001b[0m*\r\n",
"../data/offshore_wells_2011_UTM20_NAD83.shp\r\n"
]
}
],
"source": [
"ls ../data/*.shp"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Extra: GeoJSON\n",
"\n",
"GeoJSON is a standard format for encoding geospatial data. Think of it as a more web-friendly shapefile. (It's friendly because it's all contained in a single file, and the file is in JSON format, which JavaScript can process natively and other languages can easily consume)."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Must be geographic coords, so casting to WGS84.\n",
"gdf = gdf.to_crs({'init': 'epsg:4326'})\n",
"\n",
"with open('../data/offshore_wells.geojson', 'w') as f:\n",
" f.write(gdf.to_json())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can easily load GeoJSON into [QGIS](http://www.qgis.org/en/site/) for your usual GIS workflow. \n",
"\n",
"It's pretty cool how GeoJSON files show up [in GitHub](https://github.com/agile-geoscience/xlines/blob/master/data/offshore_wells.geojson)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Extra: Maps with folium\n",
"\n",
"You can get slippy maps right in Jupyter Notebook with `folium`. Install it with:\n",
"\n",
" conda install folium"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/plain": [
""
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import folium\n",
"\n",
"# Must be geographic coords, so casting to WGS84.\n",
"gdf = gdf.to_crs({'init': 'epsg:4326'})\n",
"\n",
"# Make the map, add the features via GeoJSON.\n",
"mymap = folium.Map(location=[45, -62], zoom_start=7)\n",
"features = folium.features.GeoJson(gdf.to_json())\n",
"mymap.add_child(features)\n",
"\n",
"mymap"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
\n",
"\n",
"\n",
"
© Agile Geoscience 2016
\n",
"
"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.8"
}
},
"nbformat": 4,
"nbformat_minor": 1
}