Files
geopandas/set_operations.html

511 lines
46 KiB
HTML

<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Set-Operations with Overlay &mdash; GeoPandas 0.2-py3.5.egg documentation</title>
<link href='https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic|Roboto+Slab:400,700|Inconsolata:400,700&subset=latin,cyrillic' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="author" title="About these documents"
href="about.html"/>
<link rel="top" title="GeoPandas 0.2-py3.5.egg documentation" href="index.html"/>
<link rel="next" title="Aggregation with dissolve" href="aggregation_with_dissolve.html"/>
<link rel="prev" title="Geometric Manipulations" href="geometric_manipulations.html"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/modernizr/2.6.2/modernizr.min.js"></script>
</head>
<body class="wy-body-for-nav" role="document">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-nav-search">
<a href="index.html" class="fa fa-home"> GeoPandas</a>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="install.html">Installation</a><ul>
<li class="toctree-l2"><a class="reference internal" href="install.html#installing-geopandas">Installing GeoPandas</a></li>
<li class="toctree-l2"><a class="reference internal" href="install.html#dependencies">Dependencies</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="data_structures.html">Data Structures</a><ul>
<li class="toctree-l2"><a class="reference internal" href="data_structures.html#geoseries">GeoSeries</a></li>
<li class="toctree-l2"><a class="reference internal" href="data_structures.html#geodataframe">GeoDataFrame</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="io.html">Reading and Writing Files</a><ul>
<li class="toctree-l2"><a class="reference internal" href="io.html#reading-spatial-data">Reading Spatial Data</a></li>
<li class="toctree-l2"><a class="reference internal" href="io.html#writing-spatial-data">Writing Spatial Data</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="mapping.html">Making Maps</a><ul>
<li class="toctree-l2"><a class="reference internal" href="mapping.html#chloropleth-maps">Chloropleth Maps</a></li>
<li class="toctree-l2"><a class="reference internal" href="mapping.html#maps-with-layers">Maps with Layers</a></li>
<li class="toctree-l2"><a class="reference internal" href="mapping.html#other-resources">Other Resources</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="projections.html">Managing Projections</a><ul>
<li class="toctree-l2"><a class="reference internal" href="projections.html#coordinate-reference-systems">Coordinate Reference Systems</a></li>
<li class="toctree-l2"><a class="reference internal" href="projections.html#setting-a-projection">Setting a Projection</a></li>
<li class="toctree-l2"><a class="reference internal" href="projections.html#re-projecting">Re-Projecting</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="geometric_manipulations.html">Geometric Manipulations</a><ul>
<li class="toctree-l2"><a class="reference internal" href="geometric_manipulations.html#constructive-methods">Constructive Methods</a></li>
<li class="toctree-l2"><a class="reference internal" href="geometric_manipulations.html#affine-transformations">Affine transformations</a></li>
</ul>
</li>
<li class="toctree-l1 current"><a class="current reference internal" href="">Set Operations with overlay</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#the-different-overlay-operations">The different Overlay operations</a></li>
<li class="toctree-l2"><a class="reference internal" href="#overlay-countries-example">Overlay Countries Example</a></li>
<li class="toctree-l2"><a class="reference internal" href="#more-examples">More Examples</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="aggregation_with_dissolve.html">Aggregation with dissolve</a><ul>
<li class="toctree-l2"><a class="reference internal" href="aggregation_with_dissolve.html#dissolve-example"><code class="docutils literal"><span class="pre">dissolve</span></code> Example</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="mergingdata.html">Merging Data</a><ul>
<li class="toctree-l2"><a class="reference internal" href="mergingdata.html#attribute-joins">Attribute Joins</a></li>
<li class="toctree-l2"><a class="reference internal" href="mergingdata.html#spatial-joins">Spatial Joins</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="geocoding.html">Geocoding</a></li>
<li class="toctree-l1"><a class="reference internal" href="reference.html">Reference to All Attributes and Methods</a><ul>
<li class="toctree-l2"><a class="reference internal" href="reference.html#geodataframe">GeoDataFrame</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="contributing.html">Contributing to GeoPandas</a><ul>
<li class="toctree-l2"><a class="reference internal" href="contributing.html#overview">Overview</a></li>
<li class="toctree-l2"><a class="reference internal" href="contributing.html#forking-the-geopandas-repository-using-git">1) Forking the <em>geopandas</em> repository using Git</a></li>
<li class="toctree-l2"><a class="reference internal" href="contributing.html#creating-a-development-environment">2) Creating a development environment</a></li>
<li class="toctree-l2"><a class="reference internal" href="contributing.html#installing-dependencies">3) Installing Dependencies</a></li>
<li class="toctree-l2"><a class="reference internal" href="contributing.html#making-a-development-build">4) Making a development build</a></li>
<li class="toctree-l2"><a class="reference internal" href="contributing.html#making-changes-and-writing-tests">5) Making changes and writing tests</a></li>
<li class="toctree-l2"><a class="reference internal" href="contributing.html#updating-the-documentation">6) Updating the Documentation</a></li>
<li class="toctree-l2"><a class="reference internal" href="contributing.html#submitting-a-pull-request">7) Submitting a Pull Request</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="about.html">About</a><ul>
<li class="toctree-l2"><a class="reference internal" href="about.html#known-issues">Known issues</a></li>
</ul>
</li>
</ul>
</div>
&nbsp;
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" role="navigation" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">GeoPandas</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="index.html">Docs</a> &raquo;</li>
<li>Set-Operations with Overlay</li>
<li class="wy-breadcrumbs-aside">
<a href="_sources/set_operations.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document">
<div class="section" id="set-operations-with-overlay">
<h1>Set-Operations with Overlay<a class="headerlink" href="#set-operations-with-overlay" title="Permalink to this headline"></a></h1>
<p>When working with multiple spatial datasets &#8211; especially multiple <em>polygon</em> or
<em>line</em> datasets &#8211; users often wish to create new shapes based on places where
those datasets overlap (or don&#8217;t overlap). These manipulations are often
referred using the language of sets &#8211; intersections, unions, and differences.
These types of operations are made available in the <em>geopandas</em> library through
the <code class="docutils literal"><span class="pre">overlay</span></code> function.</p>
<p>The basic idea is demonstrated by the graphic below but keep in mind that
overlays operate at the DataFrame level, not on individual geometries, and the
properties from both are retained. In effect, for every shape in the first
GeoDataFrame, this operation is executed against every other shape in the other
GeoDataFrame:</p>
<img alt="_images/overlay_operations.png" src="_images/overlay_operations.png" />
<p><strong>Source: QGIS Documentation</strong></p>
<p>(Note to users familiar with the <em>shapely</em> library: <code class="docutils literal"><span class="pre">overlay</span></code> can be thought
of as offering versions of the standard <em>shapely</em> set-operations that deal with
the complexities of applying set operations to two <em>GeoSeries</em>. The standard
<em>shapely</em> set-operations are also available as <code class="docutils literal"><span class="pre">GeoSeries</span></code> methods.)</p>
<div class="section" id="the-different-overlay-operations">
<h2>The different Overlay operations<a class="headerlink" href="#the-different-overlay-operations" title="Permalink to this headline"></a></h2>
<p>First, we create some example data:</p>
<div class="highlight-ipython"><div class="highlight"><pre><span class="gp">In [1]: </span><span class="kn">from</span> <span class="nn">shapely.geometry</span> <span class="kn">import</span> <span class="n">Polygon</span>
<span class="gp">In [2]: </span><span class="n">polys1</span> <span class="o">=</span> <span class="n">gpd</span><span class="o">.</span><span class="n">GeoSeries</span><span class="p">([</span><span class="n">Polygon</span><span class="p">([(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">0</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">2</span><span class="p">),</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">2</span><span class="p">)]),</span>
<span class="gp"> ...: </span> <span class="n">Polygon</span><span class="p">([(</span><span class="mi">2</span><span class="p">,</span><span class="mi">2</span><span class="p">),</span> <span class="p">(</span><span class="mi">4</span><span class="p">,</span><span class="mi">2</span><span class="p">),</span> <span class="p">(</span><span class="mi">4</span><span class="p">,</span><span class="mi">4</span><span class="p">),</span> <span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">4</span><span class="p">)])])</span>
<span class="gp"> ...: </span>
<span class="gp">In [3]: </span><span class="n">polys2</span> <span class="o">=</span> <span class="n">gpd</span><span class="o">.</span><span class="n">GeoSeries</span><span class="p">([</span><span class="n">Polygon</span><span class="p">([(</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">3</span><span class="p">),</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">3</span><span class="p">)]),</span>
<span class="gp"> ...: </span> <span class="n">Polygon</span><span class="p">([(</span><span class="mi">3</span><span class="p">,</span><span class="mi">3</span><span class="p">),</span> <span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="mi">3</span><span class="p">),</span> <span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="mi">5</span><span class="p">),</span> <span class="p">(</span><span class="mi">3</span><span class="p">,</span><span class="mi">5</span><span class="p">)])])</span>
<span class="gp"> ...: </span>
<span class="gp">In [4]: </span><span class="n">df1</span> <span class="o">=</span> <span class="n">gpd</span><span class="o">.</span><span class="n">GeoDataFrame</span><span class="p">({</span><span class="s">&#39;geometry&#39;</span><span class="p">:</span> <span class="n">polys1</span><span class="p">,</span> <span class="s">&#39;df1&#39;</span><span class="p">:[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">]})</span>
<span class="gp">In [5]: </span><span class="n">df2</span> <span class="o">=</span> <span class="n">gpd</span><span class="o">.</span><span class="n">GeoDataFrame</span><span class="p">({</span><span class="s">&#39;geometry&#39;</span><span class="p">:</span> <span class="n">polys2</span><span class="p">,</span> <span class="s">&#39;df2&#39;</span><span class="p">:[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">]})</span>
</pre></div>
</div>
<p>These two GeoDataFrames have some overlapping areas:</p>
<div class="highlight-ipython"><div class="highlight"><pre><span class="gp">In [6]: </span><span class="n">ax</span> <span class="o">=</span> <span class="n">df1</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">color</span><span class="o">=</span><span class="s">&#39;red&#39;</span><span class="p">);</span>
<span class="gp">In [7]: </span><span class="n">df2</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">ax</span><span class="o">=</span><span class="n">ax</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s">&#39;green&#39;</span><span class="p">);</span>
</pre></div>
</div>
<a class="reference internal image-reference" href="_images/overlay_example.png"><img alt="_images/overlay_example.png" src="_images/overlay_example.png" style="width: 5in;" /></a>
<p>We illustrate the different overlay modes with the above example.
The <code class="docutils literal"><span class="pre">overlay</span></code> function will determine the set of all individual geometries
from overlaying the two input GeoDataFrames. This result covers the area covered
by the two input GeoDataFrames, and also preserves all unique regions defined by
the combined boundaries of the two GeoDataFrames.</p>
<p>When using <code class="docutils literal"><span class="pre">how='union'</span></code>, all those possible geometries are returned:</p>
<div class="highlight-ipython"><div class="highlight"><pre><span class="gp">In [8]: </span><span class="n">res_union</span> <span class="o">=</span> <span class="n">gpd</span><span class="o">.</span><span class="n">overlay</span><span class="p">(</span><span class="n">df1</span><span class="p">,</span> <span class="n">df2</span><span class="p">,</span> <span class="n">how</span><span class="o">=</span><span class="s">&#39;union&#39;</span><span class="p">)</span>
<span class="gp">In [9]: </span><span class="n">res_union</span>
<span class="gh">Out[9]: </span><span class="go"></span>
<span class="go"> df1 df2 geometry</span>
<span class="go">0 1 NaN POLYGON ((2 1, 2 0, 0 0, 0 2, 1 2, 1 1, 2 1))</span>
<span class="go">1 1 1 POLYGON ((2 1, 1 1, 1 2, 2 2, 2 1))</span>
<span class="go">2 NaN 1 POLYGON ((2 1, 2 2, 3 2, 3 1, 2 1))</span>
<span class="go">3 NaN 1 POLYGON ((2 2, 1 2, 1 3, 2 3, 2 2))</span>
<span class="go">4 2 NaN POLYGON ((3 2, 3 3, 4 3, 4 2, 3 2))</span>
<span class="go">5 2 1 POLYGON ((3 3, 3 2, 2 2, 2 3, 3 3))</span>
<span class="go">6 2 NaN POLYGON ((3 3, 2 3, 2 4, 3 4, 3 3))</span>
<span class="go">7 NaN 2 POLYGON ((4 3, 4 4, 3 4, 3 5, 5 5, 5 3, 4 3))</span>
<span class="go">8 2 2 POLYGON ((3 4, 4 4, 4 3, 3 3, 3 4))</span>
<span class="gp">In [10]: </span><span class="n">ax</span> <span class="o">=</span> <span class="n">res_union</span><span class="o">.</span><span class="n">plot</span><span class="p">()</span>
<span class="gp">In [11]: </span><span class="n">df1</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">ax</span><span class="o">=</span><span class="n">ax</span><span class="p">,</span> <span class="n">facecolor</span><span class="o">=</span><span class="s">&#39;none&#39;</span><span class="p">);</span>
<span class="gp">In [12]: </span><span class="n">df2</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">ax</span><span class="o">=</span><span class="n">ax</span><span class="p">,</span> <span class="n">facecolor</span><span class="o">=</span><span class="s">&#39;none&#39;</span><span class="p">);</span>
</pre></div>
</div>
<a class="reference internal image-reference" href="_images/overlay_example_union.png"><img alt="_images/overlay_example_union.png" src="_images/overlay_example_union.png" style="width: 5in;" /></a>
<p>The other <code class="docutils literal"><span class="pre">how</span></code> operations will return different subsets of those geometries.
With <code class="docutils literal"><span class="pre">how='intersection'</span></code>, it returns only those geometries that are contained
by both GeoDataFrames:</p>
<div class="highlight-ipython"><div class="highlight"><pre><span class="gp">In [13]: </span><span class="n">res_intersection</span> <span class="o">=</span> <span class="n">gpd</span><span class="o">.</span><span class="n">overlay</span><span class="p">(</span><span class="n">df1</span><span class="p">,</span> <span class="n">df2</span><span class="p">,</span> <span class="n">how</span><span class="o">=</span><span class="s">&#39;intersection&#39;</span><span class="p">)</span>
<span class="gp">In [14]: </span><span class="n">res_intersection</span>
<span class="gh">Out[14]: </span><span class="go"></span>
<span class="go"> df1 df2 geometry</span>
<span class="go">0 1 1 POLYGON ((2 1, 1 1, 1 2, 2 2, 2 1))</span>
<span class="go">1 2 1 POLYGON ((3 3, 3 2, 2 2, 2 3, 3 3))</span>
<span class="go">2 2 2 POLYGON ((3 4, 4 4, 4 3, 3 3, 3 4))</span>
<span class="gp">In [15]: </span><span class="n">ax</span> <span class="o">=</span> <span class="n">res_intersection</span><span class="o">.</span><span class="n">plot</span><span class="p">()</span>
<span class="gp">In [16]: </span><span class="n">df1</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">ax</span><span class="o">=</span><span class="n">ax</span><span class="p">,</span> <span class="n">facecolor</span><span class="o">=</span><span class="s">&#39;none&#39;</span><span class="p">);</span>
<span class="gp">In [17]: </span><span class="n">df2</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">ax</span><span class="o">=</span><span class="n">ax</span><span class="p">,</span> <span class="n">facecolor</span><span class="o">=</span><span class="s">&#39;none&#39;</span><span class="p">);</span>
</pre></div>
</div>
<a class="reference internal image-reference" href="_images/overlay_example_intersection.png"><img alt="_images/overlay_example_intersection.png" src="_images/overlay_example_intersection.png" style="width: 5in;" /></a>
<p><code class="docutils literal"><span class="pre">how='symmetric_difference'</span></code> is the opposite of <code class="docutils literal"><span class="pre">'intersection'</span></code> and returns
the geometries that are only part of one of the GeoDataFrames but not of both:</p>
<div class="highlight-ipython"><div class="highlight"><pre><span class="gp">In [18]: </span><span class="n">res_symdiff</span> <span class="o">=</span> <span class="n">gpd</span><span class="o">.</span><span class="n">overlay</span><span class="p">(</span><span class="n">df1</span><span class="p">,</span> <span class="n">df2</span><span class="p">,</span> <span class="n">how</span><span class="o">=</span><span class="s">&#39;symmetric_difference&#39;</span><span class="p">)</span>
<span class="gp">In [19]: </span><span class="n">res_symdiff</span>
<span class="gh">Out[19]: </span><span class="go"></span>
<span class="go"> df1 df2 geometry</span>
<span class="go">0 1 NaN POLYGON ((2 1, 2 0, 0 0, 0 2, 1 2, 1 1, 2 1))</span>
<span class="go">1 NaN 1 POLYGON ((2 1, 2 2, 3 2, 3 1, 2 1))</span>
<span class="go">2 NaN 1 POLYGON ((2 2, 1 2, 1 3, 2 3, 2 2))</span>
<span class="go">3 2 NaN POLYGON ((3 2, 3 3, 4 3, 4 2, 3 2))</span>
<span class="go">4 2 NaN POLYGON ((3 3, 2 3, 2 4, 3 4, 3 3))</span>
<span class="go">5 NaN 2 POLYGON ((4 3, 4 4, 3 4, 3 5, 5 5, 5 3, 4 3))</span>
<span class="gp">In [20]: </span><span class="n">ax</span> <span class="o">=</span> <span class="n">res_symdiff</span><span class="o">.</span><span class="n">plot</span><span class="p">()</span>
<span class="gp">In [21]: </span><span class="n">df1</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">ax</span><span class="o">=</span><span class="n">ax</span><span class="p">,</span> <span class="n">facecolor</span><span class="o">=</span><span class="s">&#39;none&#39;</span><span class="p">);</span>
<span class="gp">In [22]: </span><span class="n">df2</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">ax</span><span class="o">=</span><span class="n">ax</span><span class="p">,</span> <span class="n">facecolor</span><span class="o">=</span><span class="s">&#39;none&#39;</span><span class="p">);</span>
</pre></div>
</div>
<a class="reference internal image-reference" href="_images/overlay_example_symdiff.png"><img alt="_images/overlay_example_symdiff.png" src="_images/overlay_example_symdiff.png" style="width: 5in;" /></a>
<p>To obtain the geometries that are part of <code class="docutils literal"><span class="pre">df1</span></code> but are not contained in
<code class="docutils literal"><span class="pre">df2</span></code>, you can use <code class="docutils literal"><span class="pre">how='difference'</span></code>:</p>
<div class="highlight-ipython"><div class="highlight"><pre><span class="gp">In [23]: </span><span class="n">res_difference</span> <span class="o">=</span> <span class="n">gpd</span><span class="o">.</span><span class="n">overlay</span><span class="p">(</span><span class="n">df1</span><span class="p">,</span> <span class="n">df2</span><span class="p">,</span> <span class="n">how</span><span class="o">=</span><span class="s">&#39;difference&#39;</span><span class="p">)</span>
<span class="gp">In [24]: </span><span class="n">res_difference</span>
<span class="gh">Out[24]: </span><span class="go"></span>
<span class="go"> df1 df2 geometry</span>
<span class="go">0 1 None POLYGON ((2 1, 2 0, 0 0, 0 2, 1 2, 1 1, 2 1))</span>
<span class="go">1 2 None POLYGON ((3 2, 3 3, 4 3, 4 2, 3 2))</span>
<span class="go">2 2 None POLYGON ((3 3, 2 3, 2 4, 3 4, 3 3))</span>
<span class="gp">In [25]: </span><span class="n">ax</span> <span class="o">=</span> <span class="n">res_difference</span><span class="o">.</span><span class="n">plot</span><span class="p">()</span>
<span class="gp">In [26]: </span><span class="n">df1</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">ax</span><span class="o">=</span><span class="n">ax</span><span class="p">,</span> <span class="n">facecolor</span><span class="o">=</span><span class="s">&#39;none&#39;</span><span class="p">);</span>
<span class="gp">In [27]: </span><span class="n">df2</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">ax</span><span class="o">=</span><span class="n">ax</span><span class="p">,</span> <span class="n">facecolor</span><span class="o">=</span><span class="s">&#39;none&#39;</span><span class="p">);</span>
</pre></div>
</div>
<a class="reference internal image-reference" href="_images/overlay_example_difference.png"><img alt="_images/overlay_example_difference.png" src="_images/overlay_example_difference.png" style="width: 5in;" /></a>
<p>Finally, with <code class="docutils literal"><span class="pre">how='identity'</span></code>, the result consists of the surface of <code class="docutils literal"><span class="pre">df1</span></code>,
but with the geometries obtained from overlaying <code class="docutils literal"><span class="pre">df1</span></code> with <code class="docutils literal"><span class="pre">df2</span></code>:</p>
<div class="highlight-ipython"><div class="highlight"><pre><span class="gp">In [28]: </span><span class="n">res_identity</span> <span class="o">=</span> <span class="n">gpd</span><span class="o">.</span><span class="n">overlay</span><span class="p">(</span><span class="n">df1</span><span class="p">,</span> <span class="n">df2</span><span class="p">,</span> <span class="n">how</span><span class="o">=</span><span class="s">&#39;identity&#39;</span><span class="p">)</span>
<span class="gp">In [29]: </span><span class="n">res_identity</span>
<span class="gh">Out[29]: </span><span class="go"></span>
<span class="go"> df1 df2 geometry</span>
<span class="go">0 1 NaN POLYGON ((2 1, 2 0, 0 0, 0 2, 1 2, 1 1, 2 1))</span>
<span class="go">1 1 1 POLYGON ((2 1, 1 1, 1 2, 2 2, 2 1))</span>
<span class="go">2 2 NaN POLYGON ((3 2, 3 3, 4 3, 4 2, 3 2))</span>
<span class="go">3 2 1 POLYGON ((3 3, 3 2, 2 2, 2 3, 3 3))</span>
<span class="go">4 2 NaN POLYGON ((3 3, 2 3, 2 4, 3 4, 3 3))</span>
<span class="go">5 2 2 POLYGON ((3 4, 4 4, 4 3, 3 3, 3 4))</span>
<span class="gp">In [30]: </span><span class="n">ax</span> <span class="o">=</span> <span class="n">res_identity</span><span class="o">.</span><span class="n">plot</span><span class="p">()</span>
<span class="gp">In [31]: </span><span class="n">df1</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">ax</span><span class="o">=</span><span class="n">ax</span><span class="p">,</span> <span class="n">facecolor</span><span class="o">=</span><span class="s">&#39;none&#39;</span><span class="p">);</span>
<span class="gp">In [32]: </span><span class="n">df2</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">ax</span><span class="o">=</span><span class="n">ax</span><span class="p">,</span> <span class="n">facecolor</span><span class="o">=</span><span class="s">&#39;none&#39;</span><span class="p">);</span>
</pre></div>
</div>
<a class="reference internal image-reference" href="_images/overlay_example_identity.png"><img alt="_images/overlay_example_identity.png" src="_images/overlay_example_identity.png" style="width: 5in;" /></a>
</div>
<div class="section" id="overlay-countries-example">
<h2>Overlay Countries Example<a class="headerlink" href="#overlay-countries-example" title="Permalink to this headline"></a></h2>
<p>First, we load the countries and cities example datasets and select :</p>
<div class="highlight-ipython"><div class="highlight"><pre><span class="gp">In [33]: </span><span class="n">world</span> <span class="o">=</span> <span class="n">gpd</span><span class="o">.</span><span class="n">read_file</span><span class="p">(</span><span class="n">gpd</span><span class="o">.</span><span class="n">datasets</span><span class="o">.</span><span class="n">get_path</span><span class="p">(</span><span class="s">&#39;naturalearth_lowres&#39;</span><span class="p">))</span>
<span class="gp">In [34]: </span><span class="n">capitals</span> <span class="o">=</span> <span class="n">gpd</span><span class="o">.</span><span class="n">read_file</span><span class="p">(</span><span class="n">gpd</span><span class="o">.</span><span class="n">datasets</span><span class="o">.</span><span class="n">get_path</span><span class="p">(</span><span class="s">&#39;naturalearth_cities&#39;</span><span class="p">))</span>
<span class="go"># Select South Amarica and some columns</span>
<span class="gp">In [35]: </span><span class="n">countries</span> <span class="o">=</span> <span class="n">world</span><span class="p">[</span><span class="n">world</span><span class="p">[</span><span class="s">&#39;continent&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="s">&quot;South America&quot;</span><span class="p">]</span>
<span class="gp">In [36]: </span><span class="n">countries</span> <span class="o">=</span> <span class="n">countries</span><span class="p">[[</span><span class="s">&#39;geometry&#39;</span><span class="p">,</span> <span class="s">&#39;name&#39;</span><span class="p">]]</span>
<span class="go"># Project to crs that uses meters as distance measure</span>
<span class="gp">In [37]: </span><span class="n">countries</span> <span class="o">=</span> <span class="n">countries</span><span class="o">.</span><span class="n">to_crs</span><span class="p">(</span><span class="s">&#39;+init=epsg:3395&#39;</span><span class="p">)</span>
<span class="gp">In [38]: </span><span class="n">capitals</span> <span class="o">=</span> <span class="n">capitals</span><span class="o">.</span><span class="n">to_crs</span><span class="p">(</span><span class="s">&#39;+init=epsg:3395&#39;</span><span class="p">)</span>
</pre></div>
</div>
<p>To illustrate the <code class="docutils literal"><span class="pre">overlay</span></code> function, consider the following case in which one
wishes to identify the &#8220;core&#8221; portion of each country &#8211; defined as areas within
500km of a capital &#8211; using a <code class="docutils literal"><span class="pre">GeoDataFrame</span></code> of countries and a
<code class="docutils literal"><span class="pre">GeoDataFrame</span></code> of capitals.</p>
<div class="highlight-ipython"><div class="highlight"><pre><span class="go"># Look at countries:</span>
<span class="gp">In [39]: </span><span class="n">countries</span><span class="o">.</span><span class="n">plot</span><span class="p">();</span>
<span class="go"># Now buffer cities to find area within 500km.</span>
<span class="go"># Check CRS -- World Mercator, units of meters.</span>
<span class="gp">In [40]: </span><span class="n">capitals</span><span class="o">.</span><span class="n">crs</span>
<span class="gh">Out[40]: </span><span class="go">&#39;+init=epsg:3395&#39;</span>
<span class="go"># make 500km buffer</span>
<span class="gp">In [41]: </span><span class="n">capitals</span><span class="p">[</span><span class="s">&#39;geometry&#39;</span><span class="p">]</span><span class="o">=</span> <span class="n">capitals</span><span class="o">.</span><span class="n">buffer</span><span class="p">(</span><span class="mi">500000</span><span class="p">)</span>
<span class="gp">In [42]: </span><span class="n">capitals</span><span class="o">.</span><span class="n">plot</span><span class="p">();</span>
</pre></div>
</div>
<a class="reference internal image-reference" href="_images/world_basic.png"><img alt="_images/world_basic.png" src="_images/world_basic.png" style="width: 5in;" /></a>
<a class="reference internal image-reference" href="_images/capital_buffers.png"><img alt="_images/capital_buffers.png" src="_images/capital_buffers.png" style="width: 5in;" /></a>
<p>To select only the portion of countries within 500km of a capital, we specify the <code class="docutils literal"><span class="pre">how</span></code> option to be &#8220;intersect&#8221;, which creates a new set of polygons where these two layers overlap:</p>
<div class="highlight-ipython"><div class="highlight"><pre><span class="gp">In [43]: </span><span class="n">country_cores</span> <span class="o">=</span> <span class="n">gpd</span><span class="o">.</span><span class="n">overlay</span><span class="p">(</span><span class="n">countries</span><span class="p">,</span> <span class="n">capitals</span><span class="p">,</span> <span class="n">how</span><span class="o">=</span><span class="s">&#39;intersection&#39;</span><span class="p">)</span>
<span class="gt">---------------------------------------------------------------------------</span>
<span class="ne">KeyboardInterrupt</span><span class="g-Whitespace"> </span>Traceback (most recent call last)
<span class="nn">&lt;ipython-input-43-0142b1627c7c&gt;</span> in <span class="ni">&lt;module&gt;</span><span class="nt">()</span>
<span class="ne">----&gt; </span><span class="mi">1</span> <span class="n">country_cores</span> <span class="o">=</span> <span class="n">gpd</span><span class="o">.</span><span class="n">overlay</span><span class="p">(</span><span class="n">countries</span><span class="p">,</span> <span class="n">capitals</span><span class="p">,</span> <span class="n">how</span><span class="o">=</span><span class="s">&#39;intersection&#39;</span><span class="p">)</span>
<span class="nn">//anaconda/envs/py35/lib/python3.5/site-packages/geopandas-0.2-py3.5.egg/geopandas/tools/overlay.py</span> in <span class="ni">overlay</span><span class="nt">(df1, df2, how, use_sindex)</span>
<span class="g-Whitespace"> </span><span class="mi">113</span> <span class="c"># determine spatial relationship</span>
<span class="g-Whitespace"> </span><span class="mi">114</span> <span class="n">collection</span> <span class="o">=</span> <span class="p">[]</span>
<span class="ne">--&gt; </span><span class="mi">115</span> <span class="k">for</span> <span class="n">fid</span><span class="p">,</span> <span class="n">newpoly</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">newpolys</span><span class="p">):</span>
<span class="g-Whitespace"> </span><span class="mi">116</span> <span class="n">cent</span> <span class="o">=</span> <span class="n">newpoly</span><span class="o">.</span><span class="n">representative_point</span><span class="p">()</span>
<span class="g-Whitespace"> </span><span class="mi">117</span>
<span class="nn">//anaconda/envs/py35/lib/python3.5/site-packages/shapely/ops.py</span> in <span class="ni">polygonize</span><span class="nt">(self, lines)</span>
<span class="g-Whitespace"> </span><span class="mi">49</span> <span class="n">product</span> <span class="o">=</span> <span class="n">lgeos</span><span class="o">.</span><span class="n">GEOSPolygonize</span><span class="p">(</span><span class="n">byref</span><span class="p">(</span><span class="n">geom_array</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">obs</span><span class="p">))</span>
<span class="g-Whitespace"> </span><span class="mi">50</span> <span class="n">collection</span> <span class="o">=</span> <span class="n">geom_factory</span><span class="p">(</span><span class="n">product</span><span class="p">)</span>
<span class="ne">---&gt; </span><span class="mi">51</span> <span class="k">for</span> <span class="n">g</span> <span class="ow">in</span> <span class="n">collection</span><span class="o">.</span><span class="n">geoms</span><span class="p">:</span>
<span class="g-Whitespace"> </span><span class="mi">52</span> <span class="n">clone</span> <span class="o">=</span> <span class="n">lgeos</span><span class="o">.</span><span class="n">GEOSGeom_clone</span><span class="p">(</span><span class="n">g</span><span class="o">.</span><span class="n">_geom</span><span class="p">)</span>
<span class="g-Whitespace"> </span><span class="mi">53</span> <span class="n">g</span> <span class="o">=</span> <span class="n">geom_factory</span><span class="p">(</span><span class="n">clone</span><span class="p">)</span>
<span class="nn">//anaconda/envs/py35/lib/python3.5/site-packages/shapely/geometry/base.py</span> in <span class="ni">__iter__</span><span class="nt">(self)</span>
<span class="g-Whitespace"> </span><span class="mi">835</span> <span class="bp">self</span><span class="o">.</span><span class="n">_update</span><span class="p">()</span>
<span class="g-Whitespace"> </span><span class="mi">836</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__len__</span><span class="p">()):</span>
<span class="ne">--&gt; </span><span class="mi">837</span> <span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_geom_item</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
<span class="g-Whitespace"> </span><span class="mi">838</span>
<span class="g-Whitespace"> </span><span class="mi">839</span> <span class="k">def</span> <span class="nf">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="ne">KeyboardInterrupt</span>:
<span class="gp">In [44]: </span><span class="n">country_cores</span><span class="o">.</span><span class="n">plot</span><span class="p">();</span>
</pre></div>
</div>
<a class="reference internal image-reference" href="_images/country_cores.png"><img alt="_images/country_cores.png" src="_images/country_cores.png" style="width: 5in;" /></a>
<p>Changing the &#8220;how&#8221; option allows for different types of overlay operations. For example, if we were interested in the portions of countries <em>far</em> from capitals (the peripheries), we would compute the difference of the two.</p>
<div class="highlight-ipython"><div class="highlight"><pre><span class="gp">In [45]: </span><span class="n">country_peripheries</span> <span class="o">=</span> <span class="n">gpd</span><span class="o">.</span><span class="n">overlay</span><span class="p">(</span><span class="n">countries</span><span class="p">,</span> <span class="n">capitals</span><span class="p">,</span> <span class="n">how</span><span class="o">=</span><span class="s">&#39;difference&#39;</span><span class="p">)</span>
<span class="gt">---------------------------------------------------------------------------</span>
<span class="ne">KeyboardInterrupt</span><span class="g-Whitespace"> </span>Traceback (most recent call last)
<span class="nn">&lt;ipython-input-45-c647a7c2552d&gt;</span> in <span class="ni">&lt;module&gt;</span><span class="nt">()</span>
<span class="ne">----&gt; </span><span class="mi">1</span> <span class="n">country_peripheries</span> <span class="o">=</span> <span class="n">gpd</span><span class="o">.</span><span class="n">overlay</span><span class="p">(</span><span class="n">countries</span><span class="p">,</span> <span class="n">capitals</span><span class="p">,</span> <span class="n">how</span><span class="o">=</span><span class="s">&#39;difference&#39;</span><span class="p">)</span>
<span class="nn">//anaconda/envs/py35/lib/python3.5/site-packages/geopandas-0.2-py3.5.egg/geopandas/tools/overlay.py</span> in <span class="ni">overlay</span><span class="nt">(df1, df2, how, use_sindex)</span>
<span class="g-Whitespace"> </span><span class="mi">127</span> <span class="k">if</span> <span class="n">use_sindex</span> <span class="ow">and</span> <span class="n">df2</span><span class="o">.</span><span class="n">sindex</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
<span class="g-Whitespace"> </span><span class="mi">128</span> <span class="n">candidates2</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span><span class="o">.</span><span class="n">object</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span>
<span class="ne">--&gt; </span><span class="mi">129</span> <span class="n">df2</span><span class="o">.</span><span class="n">sindex</span><span class="o">.</span><span class="n">intersection</span><span class="p">(</span><span class="n">newpoly</span><span class="o">.</span><span class="n">bounds</span><span class="p">,</span> <span class="n">objects</span><span class="o">=</span><span class="bp">True</span><span class="p">)]</span>
<span class="g-Whitespace"> </span><span class="mi">130</span> <span class="k">else</span><span class="p">:</span>
<span class="g-Whitespace"> </span><span class="mi">131</span> <span class="n">candidates2</span> <span class="o">=</span> <span class="p">[</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">df2</span><span class="o">.</span><span class="n">iterrows</span><span class="p">()]</span>
<span class="nn">//anaconda/envs/py35/lib/python3.5/site-packages/shapely/geometry/base.py</span> in <span class="ni">bounds</span><span class="nt">(self)</span>
<span class="g-Whitespace"> </span><span class="mi">446</span> <span class="k">return</span> <span class="p">()</span>
<span class="g-Whitespace"> </span><span class="mi">447</span> <span class="k">else</span><span class="p">:</span>
<span class="ne">--&gt; </span><span class="mi">448</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">impl</span><span class="p">[</span><span class="s">&#39;bounds&#39;</span><span class="p">](</span><span class="bp">self</span><span class="p">)</span>
<span class="g-Whitespace"> </span><span class="mi">449</span>
<span class="g-Whitespace"> </span><span class="mi">450</span> <span class="nd">@property</span>
<span class="nn">//anaconda/envs/py35/lib/python3.5/site-packages/shapely/coords.py</span> in <span class="ni">__call__</span><span class="nt">(self, this)</span>
<span class="g-Whitespace"> </span><span class="mi">197</span> <span class="n">temp</span> <span class="o">=</span> <span class="n">c_double</span><span class="p">()</span>
<span class="g-Whitespace"> </span><span class="mi">198</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">cs_len</span><span class="o">.</span><span class="n">value</span><span class="p">):</span>
<span class="ne">--&gt; </span><span class="mi">199</span> <span class="n">lgeos</span><span class="o">.</span><span class="n">GEOSCoordSeq_getX</span><span class="p">(</span><span class="n">cs</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">byref</span><span class="p">(</span><span class="n">temp</span><span class="p">))</span>
<span class="g-Whitespace"> </span><span class="mi">200</span> <span class="n">x</span> <span class="o">=</span> <span class="n">temp</span><span class="o">.</span><span class="n">value</span>
<span class="g-Whitespace"> </span><span class="mi">201</span> <span class="k">if</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="n">minx</span><span class="p">:</span> <span class="n">minx</span> <span class="o">=</span> <span class="n">x</span>
<span class="ne">KeyboardInterrupt</span>:
<span class="gp">In [46]: </span><span class="n">country_peripheries</span><span class="o">.</span><span class="n">plot</span><span class="p">();</span>
</pre></div>
</div>
<a class="reference internal image-reference" href="_images/country_peripheries.png"><img alt="_images/country_peripheries.png" src="_images/country_peripheries.png" style="width: 5in;" /></a>
</div>
<div class="section" id="more-examples">
<h2>More Examples<a class="headerlink" href="#more-examples" title="Permalink to this headline"></a></h2>
<p>A larger set of examples of the use of <code class="docutils literal"><span class="pre">overlay</span></code> can be found <a class="reference external" href="http://nbviewer.jupyter.org/github/geopandas/geopandas/blob/master/examples/overlays.ipynb">here</a></p>
<div class="toctree-wrapper compound">
<ul class="simple">
</ul>
</div>
</div>
</div>
</div>
<footer>
<div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
<a href="aggregation_with_dissolve.html" class="btn btn-neutral float-right" title="Aggregation with dissolve">Next <span class="fa fa-arrow-circle-right"></span></a>
<a href="geometric_manipulations.html" class="btn btn-neutral" title="Geometric Manipulations"><span class="fa fa-arrow-circle-left"></span> Previous</a>
</div>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright 2013-2016, GeoPandas developers.
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT:'./',
VERSION:'0.2-py3.5.egg',
COLLAPSE_INDEX:false,
FILE_SUFFIX:'.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.StickyNav.enable();
});
</script>
</body>
</html>