{ "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CompanyD__Drilling_URT_ElevatiSpud_DateTotal_De_1Total_DeptWater_DeptWell_Nam_1Well_NameWell_No_Well_SymbWell_TermiWell_Typegeometry
0Mobil et al1.0Bawden Rig 188.21967-06-0715106.04604.03.9C-67Sable Island1.0Plugged dry hole1968-01-02ExploratoryPOINT (-59.9170497222 43.9346961111)
1Shell2.0Sedneth 125.91969-09-0113085.03988.057.9E-84Onondaga2.0Plugged gas well1969-11-11ExploratoryPOINT (-60.2214388889 43.721147222222)
2Shell3.0Sedneth 125.91969-11-1613516.04120.082.3O-25Oneida3.0Plugged dry hole1970-02-10ExploratoryPOINT (-61.5601366667 43.2492655556)
3Shell4.0Sedneth 126.01970-02-167235.02205.095.1N-30Naskapi4.0Plugged dry hole1970-03-19ExploratoryPOINT (-62.5665408333 43.4963302778)
4Shell5.0Sedco H31.41970-05-036975.02126.0117.0B-93Mohawk5.0Plugged dry hole1970-05-23ExploratoryPOINT (-64.7315288889 42.7029227778)
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CompanyD__Drilling_URT_ElevatiSpud_DateTotal_De_1Total_DeptWater_DeptWell_Nam_1Well_NameWell_No_Well_SymbWell_TermiWell_Typegeometryseafl_twt
0Mobil et al1.0Bawden Rig 188.21967-06-0715106.04604.03.9C-67Sable Island1.0Plugged dry hole1968-01-02ExploratoryPOINT (747510.4372073817 4869250.818941217)5.252525
1Shell2.0Sedneth 125.91969-09-0113085.03988.057.9E-84Onondaga2.0Plugged gas well1969-11-11ExploratoryPOINT (723875.2971043108 4844664.069700127)77.979798
2Shell3.0Sedneth 125.91969-11-1613516.04120.082.3O-25Oneida3.0Plugged dry hole1970-02-10ExploratoryPOINT (616945.850614059 4789511.343230169)110.841751
3Shell4.0Sedneth 126.01970-02-167235.02205.095.1N-30Naskapi4.0Plugged dry hole1970-03-19ExploratoryPOINT (535101.4182156855 4816032.927423127)128.080808
4Shell5.0Sedco H31.41970-05-036975.02126.0117.0B-93Mohawk5.0Plugged dry hole1970-05-23ExploratoryPOINT (358242.7522037996 4729291.710525603)157.575758
\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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
D__RT_ElevatiTotal_De_1Total_DeptWater_DeptWell_No_seafl_twt
count207.000000207.000000207.000000207.000000207.000000207.000000207.000000
mean237.24637734.71995213026.1596623969.690821142.545894104.043478191.981002
std127.76549411.1859374081.8870381262.667988350.26899059.936723471.742748
min0.0000006.4000001503.0000000.0000000.0000001.0000000.000000
25%129.50000025.9000009984.0000003043.00000039.50000052.50000053.198653
50%267.00000031.40000013202.0000004024.00000053.300000104.00000071.784512
75%349.50000041.50000015683.0000004800.50000082.650000156.500000111.313131
max403.00000082.00000021404.0000006676.0000002091.500000207.0000002816.835017
\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 }