<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Sean Gillies (Posts about 2013)</title><link>https://sgillies.net/</link><description></description><atom:link href="https://sgillies.net/tags/cat_2013.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><lastBuildDate>Sun, 31 Dec 2023 01:26:19 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Shapely 1.2.19 and 1.3.0</title><link>https://sgillies.net/2013/12/31/shapely-1-2-19-and-1-3-0.html</link><dc:creator>Sean Gillies</dc:creator><description>&lt;p&gt;&lt;a class="reference external" href="https://pypi.python.org/pypi/Shapely/1.2.19"&gt;Shapely 1.2.19&lt;/a&gt; and &lt;a class="reference external" href="https://pypi.python.org/pypi/Shapely"&gt;Shapely
1.3.0&lt;/a&gt; have been tagged and uploaded
to PyPI.&lt;/p&gt;
&lt;p&gt;1.2.19 adds buffer styling, work (see &lt;a class="reference external" href="http://toblerity.org/shapely/code/buffer.hires.png"&gt;buffer.hires.png&lt;/a&gt;) that was done by &lt;a class="reference external" href="https://github.com/ahojnnes"&gt;Johannes Schönberger&lt;/a&gt;. 1.3.0 has no new features other than
support for Python 3.x, for which we traded in support for Python 2.5 and
lower. The force behind the Python 3 work is &lt;a class="reference external" href="https://github.com/mwtoews"&gt;Mike Toews&lt;/a&gt;. Johannes and Mike aren't the only
contributors to these releases. We're up to &lt;a class="reference external" href="https://github.com/Toblerity/Shapely/graphs/contributors"&gt;19 contributors&lt;/a&gt; since moving to
GitHub, not counting another 6-7 contributors from the olden days.&lt;/p&gt;
&lt;p&gt;If you're still on Python 2.5 (or 2.4), the 1.3.0 release is inconvenient: pip
and easy_install are going to grab it by default and it won't work for you.
I'm sorry, but you'll have to specify Shapely 1.2.x releases explicitly like
&lt;code class="docutils literal"&gt;pip install &lt;span class="pre"&gt;Shapely==1.2.19&lt;/span&gt;&lt;/code&gt;. If you're using a more modern Python, &lt;code class="docutils literal"&gt;pip
install Shapely&lt;/code&gt; will fetch 1.3.x from now on.&lt;/p&gt;
&lt;p&gt;The Shapely development plan for 2014: bug fixes and new GEOS version support
in 1.3.x (and 1.2.x when possible) and architectural changes for more speed and
other features for future Shapely versions in the master branch.&lt;/p&gt;</description><category>geometry</category><category>python</category><category>shapely</category><category>work</category><guid>https://sgillies.net/2013/12/31/shapely-1-2-19-and-1-3-0.html</guid><pubDate>Tue, 31 Dec 2013 07:00:00 GMT</pubDate></item><item><title>Gruß vom Krampus</title><link>https://sgillies.net/2013/12/25/gruss-vom-krampus.html</link><dc:creator>Sean Gillies</dc:creator><description>&lt;img alt="http://upload.wikimedia.org/wikipedia/commons/e/e2/Gruss_vom_Krampus.jpg" src="http://upload.wikimedia.org/wikipedia/commons/e/e2/Gruss_vom_Krampus.jpg" style="width: 510px; height: 810px;"&gt;
&lt;p&gt;I meant to post this last week, but got too busy in the run up to Christmas. All the
best to you and yours.&lt;/p&gt;</description><category>christmas</category><category>krampus</category><category>life</category><guid>https://sgillies.net/2013/12/25/gruss-vom-krampus.html</guid><pubDate>Wed, 25 Dec 2013 07:00:00 GMT</pubDate></item><item><title>Rasterio windows and masks</title><link>https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html</link><dc:creator>Sean Gillies</dc:creator><description>&lt;p&gt;Rasterio 0.4 is up on PyPI: &lt;a class="reference external" href="https://pypi.python.org/pypi/rasterio/0.4"&gt;https://pypi.python.org/pypi/rasterio/0.4&lt;/a&gt;. The new
features since the last time I blogged about rasterio are &lt;a class="reference external" href="https://github.com/sgillies/rasterio/blob/master/docs/windowed-rw.rst"&gt;windowed&lt;/a&gt; and
&lt;a class="reference external" href="https://github.com/sgillies/rasterio/blob/master/docs/nodata-masks.rst"&gt;masked&lt;/a&gt;
reads and writes. Here's an example that combines both features and demonstrates
a good pattern for reading raster data.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code python"&gt;&lt;a id="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-1" name="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-1" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-1"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt;
&lt;a id="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-2" name="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-2" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-2"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;rasterio&lt;/span&gt;
&lt;a id="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-3" name="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-3" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-3"&gt;&lt;/a&gt;
&lt;a id="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-4" name="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-4" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-4"&gt;&lt;/a&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;rasterio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'rasterio/tests/data/RGB.byte.tif'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-5" name="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-5" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-5"&gt;&lt;/a&gt;
&lt;a id="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-6" name="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-6" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-6"&gt;&lt;/a&gt;    &lt;span class="c1"&gt;# The following asserts that all bands have the same block/stripe structure.&lt;/span&gt;
&lt;a id="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-7" name="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-7" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-7"&gt;&lt;/a&gt;    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;block_shapes&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;a id="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-8" name="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-8" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-8"&gt;&lt;/a&gt;
&lt;a id="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-9" name="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-9" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-9"&gt;&lt;/a&gt;    &lt;span class="c1"&gt;# As they do, we can iterate over the first band's block windows&lt;/span&gt;
&lt;a id="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-10" name="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-10" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-10"&gt;&lt;/a&gt;    &lt;span class="c1"&gt;# and apply to all other bands.&lt;/span&gt;
&lt;a id="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-11" name="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-11" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-11"&gt;&lt;/a&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;ji&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;window&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;block_windows&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a id="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-12" name="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-12" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-12"&gt;&lt;/a&gt;
&lt;a id="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-13" name="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-13" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-13"&gt;&lt;/a&gt;        &lt;span class="c1"&gt;# Get data in this window for each band as a Numpy masked array.&lt;/span&gt;
&lt;a id="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-14" name="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-14" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-14"&gt;&lt;/a&gt;        &lt;span class="n"&gt;bands&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;a id="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-15" name="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-15" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-15"&gt;&lt;/a&gt;            &lt;span class="n"&gt;numpy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ma&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;masked_equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;a id="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-16" name="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-16" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-16"&gt;&lt;/a&gt;                &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read_band&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;indexes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;a id="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-17" name="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-17" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-17"&gt;&lt;/a&gt;                &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nodatavals&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;a id="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-18" name="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-18" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-18"&gt;&lt;/a&gt;            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;a id="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-19" name="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-19" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-19"&gt;&lt;/a&gt;
&lt;a id="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-20" name="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-20" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-20"&gt;&lt;/a&gt;        &lt;span class="c1"&gt;# Break out after the first block in this example.&lt;/span&gt;
&lt;a id="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-21" name="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-21" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-21"&gt;&lt;/a&gt;        &lt;span class="k"&gt;break&lt;/span&gt;
&lt;a id="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-22" name="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-22" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-22"&gt;&lt;/a&gt;
&lt;a id="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-23" name="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-23" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-23"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# Let's look at the first, blue band.&lt;/span&gt;
&lt;a id="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-24" name="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-24" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-24"&gt;&lt;/a&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bands&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;a id="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-25" name="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-25" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-25"&gt;&lt;/a&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-26" name="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-26" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-26"&gt;&lt;/a&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mask&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-27" name="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-27" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-27"&gt;&lt;/a&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fill_value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-28" name="rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-28" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_0d05dcbbfbb64cdcb6d8e317ccd19b56-28"&gt;&lt;/a&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The output:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code console"&gt;&lt;a id="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-1" name="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-1" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-1"&gt;&lt;/a&gt;&lt;span class="go"&gt;[[-- -- -- ..., -- -- --]&lt;/span&gt;
&lt;a id="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-2" name="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-2" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-2"&gt;&lt;/a&gt;&lt;span class="go"&gt; [-- -- -- ..., -- -- --]&lt;/span&gt;
&lt;a id="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-3" name="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-3" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-3"&gt;&lt;/a&gt;&lt;span class="go"&gt; [-- -- -- ..., -- -- --]&lt;/span&gt;
&lt;a id="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-4" name="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-4" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-4"&gt;&lt;/a&gt;&lt;span class="go"&gt; ...,&lt;/span&gt;
&lt;a id="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-5" name="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-5" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-5"&gt;&lt;/a&gt;&lt;span class="go"&gt; [-- -- -- ..., -- -- --]&lt;/span&gt;
&lt;a id="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-6" name="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-6" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-6"&gt;&lt;/a&gt;&lt;span class="go"&gt; [-- -- -- ..., -- -- --]&lt;/span&gt;
&lt;a id="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-7" name="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-7" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-7"&gt;&lt;/a&gt;&lt;span class="go"&gt; [-- -- -- ..., -- -- --]]&lt;/span&gt;
&lt;a id="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-8" name="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-8" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-8"&gt;&lt;/a&gt;&lt;span class="go"&gt;[[ True  True  True ...,  True  True  True]&lt;/span&gt;
&lt;a id="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-9" name="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-9" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-9"&gt;&lt;/a&gt;&lt;span class="go"&gt; [ True  True  True ...,  True  True  True]&lt;/span&gt;
&lt;a id="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-10" name="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-10" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-10"&gt;&lt;/a&gt;&lt;span class="go"&gt; [ True  True  True ...,  True  True  True]&lt;/span&gt;
&lt;a id="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-11" name="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-11" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-11"&gt;&lt;/a&gt;&lt;span class="go"&gt; ...,&lt;/span&gt;
&lt;a id="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-12" name="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-12" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-12"&gt;&lt;/a&gt;&lt;span class="go"&gt; [ True  True  True ...,  True  True  True]&lt;/span&gt;
&lt;a id="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-13" name="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-13" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-13"&gt;&lt;/a&gt;&lt;span class="go"&gt; [ True  True  True ...,  True  True  True]&lt;/span&gt;
&lt;a id="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-14" name="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-14" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-14"&gt;&lt;/a&gt;&lt;span class="go"&gt; [ True  True  True ...,  True  True  True]]&lt;/span&gt;
&lt;a id="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-15" name="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-15" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-15"&gt;&lt;/a&gt;&lt;span class="go"&gt;0&lt;/span&gt;
&lt;a id="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-16" name="rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-16" href="https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html#rest_code_34149ca7b1de40cc969aa9e79e9a3ae7-16"&gt;&lt;/a&gt;&lt;span class="gp gp-VirtualEnv"&gt;(1, 255, 44.434478650699106)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You can see that all four corners of the test image are masked.&lt;/p&gt;</description><category>cython</category><category>gdal</category><category>masks</category><category>numpy</category><category>pixels</category><category>python</category><category>rasterio</category><category>work</category><guid>https://sgillies.net/2013/12/21/rasterio-windows-and-masks.html</guid><pubDate>Sat, 21 Dec 2013 07:00:00 GMT</pubDate></item><item><title>Teaching Python GIS users to be more rational</title><link>https://sgillies.net/2013/12/17/teaching-python-gis-users-to-be-more-rational.html</link><dc:creator>Sean Gillies</dc:creator><description>&lt;p&gt;We, developers and documenters of GIS software for Python, have been teaching
users to code irrationally. I'm certain that there's a cost to this and that we
need to try to undo the damage as much as we can. Irrational coding happens in
the real world. I'm largely self-taught as a programmer and have a long history
of using and misusing software that I don't fully understand, cargo-culting
code, etc. I've been there. This is part of the reason we write software, to
put power in the hands of less expert computer users, and it seems to
necessarily invite the problem of irrational programming. When software is
baffling rather than enlightening, it can make the problem worse. Software
ought to instead teach its users to think more rationally and reward them for
doing so. In theory, there ought to be a virtuous circle here for open source
software: rational users providing better bug reports and more effective
community support, and becoming code contributors at a higher rate. Teaching
users to be irrational, on the other hand, guarantees a steady and soul-sucking
stream of frequently asked low grade support questions.&lt;/p&gt;
&lt;p&gt;I'm thinking about two things going on in Python GIS software in particular.
Exhibit A is the practice of teaching users to use &lt;code class="docutils literal"&gt;del&lt;/code&gt; to close or finalize
externalize resources like database connections and cursors. See
&lt;a class="reference external" href="http://gis.stackexchange.com/search?q=%5Bpython%5D+%22+del+%22"&gt;http://gis.stackexchange.com/search?q=%5Bpython%5D+%22+del+%22&lt;/a&gt;. Think hard
about this when you're developing, documenting, and supporting Python APIs. Do
you really want your users to have to know so much about the details of &lt;code class="docutils literal"&gt;del&lt;/code&gt;
or what happens to Python objects after they employ &lt;code class="docutils literal"&gt;del&lt;/code&gt;? And whether it's
dependent on their interpreter's garbage collection? Do you really want to
teach them to rely on side-effects of &lt;code class="docutils literal"&gt;del&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;Python's &lt;code class="docutils literal"&gt;del&lt;/code&gt; statement is all about &lt;a class="reference external" href="http://docs.python.org/2/reference/simple_stmts.html#the-del-statement"&gt;namespace and container management&lt;/a&gt; and
has nothing directly to do with finalizing external resources:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Deletion of a name removes the binding of that name from the local or
global namespace, depending on whether the name occurs in a global
statement in the same code block. If the name is unbound, a NameError
exception will be raised.&lt;/p&gt;
&lt;p&gt;It is illegal to delete a name from the local namespace if it occurs as
a free variable in a nested block.&lt;/p&gt;
&lt;p&gt;Deletion of attribute references, subscriptions and slicings is passed to
the primary object involved; deletion of a slicing is in general equivalent
to assignment of an empty slice of the right type (but even this is
determined by the sliced object).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Think about this too: will &lt;code class="docutils literal"&gt;del&lt;/code&gt; work to close and finalize external stuff if
the name you're deleting is not in a local or global namespace, but is a list
or dict item? Or if you've bound two names to the same object do you have to
&lt;code class="docutils literal"&gt;del&lt;/code&gt; both names or just one?&lt;/p&gt;
&lt;p&gt;Any closing of external resources is a side effect, and side effects in
software are almost always less than deterministic in nature. Teaching users to
rely on side effects is, in effect, teaching them to program irrationally.
Here's a user (not a GIS user, either) who has been particularly harmed, IMO:
&lt;a class="reference external" href="http://stackoverflow.com/a/12626643/159235"&gt;http://stackoverflow.com/a/12626643/159235&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The reason that &lt;code class="docutils literal"&gt;del&lt;/code&gt; works at all when it does is that the object to which
the name was bound has a __del__() method that calls another method that
finalizes.  Just make that other method part of your API, document it well, and
you have users programming rationally and getting rational results like
external files and resources closed and freed precisely when they should be.&lt;/p&gt;
&lt;p&gt;To their credit, the ArcPy developers have corrected this in recent versions,
but any visit to GIS StackExchange shows that the damage caused to programmers
continues.&lt;/p&gt;
&lt;p&gt;Exhibit B is the practice of teaching users to rebind names to &lt;code class="docutils literal"&gt;None&lt;/code&gt; to
finalize, as in &lt;a class="reference external" href="http://trac.osgeo.org/gdal/wiki/PythonGotchas#CertainobjectscontainaDestroymethodbutyoushouldneveruseit"&gt;GDAL/OGR Python bindings&lt;/a&gt;.
Before you write an API like this or write a tutorial or book chapter that
advocates this, ask yourself what is so special about &lt;code class="docutils literal"&gt;None&lt;/code&gt; in this case?
Will rebinding that name to &lt;code class="docutils literal"&gt;0&lt;/code&gt;, or &lt;code class="docutils literal"&gt;True&lt;/code&gt;, or &lt;code class="docutils literal"&gt;"abracadabra!"&lt;/code&gt; work just
as well? Why or why not? A library developer or teacher or writer should know
the answer to this and be able to explain it.&lt;/p&gt;
&lt;p&gt;&lt;code class="docutils literal"&gt;None&lt;/code&gt; truly &lt;a class="reference external" href="http://python-history.blogspot.com/2013/11/story-of-none-true-false.html"&gt;is special&lt;/a&gt;
in Python (just compare the results of &lt;code class="docutils literal"&gt;None = 1&lt;/code&gt; and &lt;code class="docutils literal"&gt;False = 1&lt;/code&gt; at your
interpreter prompt to see), but is its special nature the thing that causes
finalization, or is it the binding, or what?  What is actually going on in the
software and how do we teach users to use it rationally?&lt;/p&gt;
&lt;p&gt;In fact, the reason rebinding to &lt;code class="docutils literal"&gt;None&lt;/code&gt; works when it does is the same as
above: some finalizing method is called by the interpreter when the object is
no longer referenced by anything else. Just expose that method to programmers
and you have a less baffling API.&lt;/p&gt;
&lt;p&gt;In other words, &lt;a class="reference external" href="http://www.python.org/dev/peps/pep-0020"&gt;explicit is better than implicit&lt;/a&gt;. Teach users to close and finalize
external resources explicitly instead of teaching them to do something else
that has finalization as a side effect, and let's see if we all profit from more
rational Python GIS programmers.&lt;/p&gt;</description><category>arcpy</category><category>design</category><category>gdal</category><category>ogr</category><category>pedagogy</category><category>python</category><category>stack exchange</category><category>work</category><category>zen</category><guid>https://sgillies.net/2013/12/17/teaching-python-gis-users-to-be-more-rational.html</guid><pubDate>Tue, 17 Dec 2013 07:00:00 GMT</pubDate></item><item><title>Is rasterio fast enough?</title><link>https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html</link><dc:creator>Sean Gillies</dc:creator><description>&lt;p&gt;I've been working on a Python package named
&lt;a class="reference external" href="https://github.com/sgillies/rasterio"&gt;rasterio&lt;/a&gt; and have
&lt;a class="reference external" href="http://sgillies.net/blog/2013/11/24/introducing-rasterio.html"&gt;blogged&lt;/a&gt;
about my goals: more Python idioms, no gotchas, and speed. I'm doing well on
the first two, but now let's look at the last of these. Is rasterio fast
enough?&lt;/p&gt;
&lt;p&gt;Here is a raster band read to Numpy ndarray benchmark with a comparison to
osgeo.gdal. The RGB.byte.tif file is a small (about 800 x 800 pixel) GeoTIFF
file. I'm going to open the file, read the entirety of the first band to a
ndarray, and then close the file. The gdal Dataset class has no explicit
closing method, so I'm assigning the variable to None and indirectly freeing
up the GeoTIFF file. In rasterio, you should call an opened file's close()
method when done, or use a &lt;cite&gt;with&lt;/cite&gt; statement.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code python"&gt;&lt;a id="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-1" name="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-1" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_6dc6758e81944e1b880c61cd8d8a3b98-1"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;timeit&lt;/span&gt;
&lt;a id="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-2" name="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-2" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_6dc6758e81944e1b880c61cd8d8a3b98-2"&gt;&lt;/a&gt;
&lt;a id="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-3" name="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-3" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_6dc6758e81944e1b880c61cd8d8a3b98-3"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;rasterio&lt;/span&gt;
&lt;a id="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-4" name="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-4" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_6dc6758e81944e1b880c61cd8d8a3b98-4"&gt;&lt;/a&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;osgeo&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;gdal&lt;/span&gt;
&lt;a id="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-5" name="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-5" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_6dc6758e81944e1b880c61cd8d8a3b98-5"&gt;&lt;/a&gt;
&lt;a id="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-6" name="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-6" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_6dc6758e81944e1b880c61cd8d8a3b98-6"&gt;&lt;/a&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;a id="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-7" name="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-7" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_6dc6758e81944e1b880c61cd8d8a3b98-7"&gt;&lt;/a&gt;
&lt;a id="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-8" name="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-8" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_6dc6758e81944e1b880c61cd8d8a3b98-8"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# GDAL read as array&lt;/span&gt;
&lt;a id="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-9" name="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-9" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_6dc6758e81944e1b880c61cd8d8a3b98-9"&gt;&lt;/a&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"""&lt;/span&gt;
&lt;a id="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-10" name="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-10" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_6dc6758e81944e1b880c61cd8d8a3b98-10"&gt;&lt;/a&gt;&lt;span class="s2"&gt;src = gdal.Open('rasterio/tests/data/RGB.byte.tif')&lt;/span&gt;
&lt;a id="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-11" name="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-11" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_6dc6758e81944e1b880c61cd8d8a3b98-11"&gt;&lt;/a&gt;&lt;span class="s2"&gt;arr = src.GetRasterBand(1).ReadAsArray()&lt;/span&gt;
&lt;a id="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-12" name="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-12" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_6dc6758e81944e1b880c61cd8d8a3b98-12"&gt;&lt;/a&gt;&lt;span class="s2"&gt;src = None&lt;/span&gt;
&lt;a id="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-13" name="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-13" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_6dc6758e81944e1b880c61cd8d8a3b98-13"&gt;&lt;/a&gt;&lt;span class="s2"&gt;"""&lt;/span&gt;
&lt;a id="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-14" name="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-14" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_6dc6758e81944e1b880c61cd8d8a3b98-14"&gt;&lt;/a&gt;
&lt;a id="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-15" name="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-15" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_6dc6758e81944e1b880c61cd8d8a3b98-15"&gt;&lt;/a&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;timeit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timeit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'from osgeo import gdal'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-16" name="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-16" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_6dc6758e81944e1b880c61cd8d8a3b98-16"&gt;&lt;/a&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"GDAL:"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-17" name="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-17" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_6dc6758e81944e1b880c61cd8d8a3b98-17"&gt;&lt;/a&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt; usec&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;a id="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-18" name="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-18" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_6dc6758e81944e1b880c61cd8d8a3b98-18"&gt;&lt;/a&gt;
&lt;a id="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-19" name="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-19" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_6dc6758e81944e1b880c61cd8d8a3b98-19"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# Rasterio read band&lt;/span&gt;
&lt;a id="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-20" name="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-20" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_6dc6758e81944e1b880c61cd8d8a3b98-20"&gt;&lt;/a&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"""&lt;/span&gt;
&lt;a id="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-21" name="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-21" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_6dc6758e81944e1b880c61cd8d8a3b98-21"&gt;&lt;/a&gt;&lt;span class="s2"&gt;with rasterio.open('rasterio/tests/data/RGB.byte.tif') as src:&lt;/span&gt;
&lt;a id="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-22" name="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-22" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_6dc6758e81944e1b880c61cd8d8a3b98-22"&gt;&lt;/a&gt;&lt;span class="s2"&gt;    arr = src.read_band(1)&lt;/span&gt;
&lt;a id="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-23" name="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-23" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_6dc6758e81944e1b880c61cd8d8a3b98-23"&gt;&lt;/a&gt;&lt;span class="s2"&gt;"""&lt;/span&gt;
&lt;a id="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-24" name="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-24" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_6dc6758e81944e1b880c61cd8d8a3b98-24"&gt;&lt;/a&gt;
&lt;a id="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-25" name="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-25" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_6dc6758e81944e1b880c61cd8d8a3b98-25"&gt;&lt;/a&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;timeit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timeit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;setup&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'import rasterio'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-26" name="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-26" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_6dc6758e81944e1b880c61cd8d8a3b98-26"&gt;&lt;/a&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Rasterio:"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-27" name="rest_code_6dc6758e81944e1b880c61cd8d8a3b98-27" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_6dc6758e81944e1b880c61cd8d8a3b98-27"&gt;&lt;/a&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;%f&lt;/span&gt;&lt;span class="s2"&gt; usec&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here are the results on my 1.7 GHz Intel Core i7 MacBook Air:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code console"&gt;&lt;a id="rest_code_1a65092c94a14ef48126ac30163658e5-1" name="rest_code_1a65092c94a14ef48126ac30163658e5-1" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_1a65092c94a14ef48126ac30163658e5-1"&gt;&lt;/a&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;python benchmarks/ndarray.py
&lt;a id="rest_code_1a65092c94a14ef48126ac30163658e5-2" name="rest_code_1a65092c94a14ef48126ac30163658e5-2" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_1a65092c94a14ef48126ac30163658e5-2"&gt;&lt;/a&gt;&lt;span class="go"&gt;GDAL:&lt;/span&gt;
&lt;a id="rest_code_1a65092c94a14ef48126ac30163658e5-3" name="rest_code_1a65092c94a14ef48126ac30163658e5-3" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_1a65092c94a14ef48126ac30163658e5-3"&gt;&lt;/a&gt;&lt;span class="go"&gt;2.356141 ms&lt;/span&gt;
&lt;a id="rest_code_1a65092c94a14ef48126ac30163658e5-4" name="rest_code_1a65092c94a14ef48126ac30163658e5-4" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_1a65092c94a14ef48126ac30163658e5-4"&gt;&lt;/a&gt;
&lt;a id="rest_code_1a65092c94a14ef48126ac30163658e5-5" name="rest_code_1a65092c94a14ef48126ac30163658e5-5" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_1a65092c94a14ef48126ac30163658e5-5"&gt;&lt;/a&gt;&lt;span class="go"&gt;Rasterio:&lt;/span&gt;
&lt;a id="rest_code_1a65092c94a14ef48126ac30163658e5-6" name="rest_code_1a65092c94a14ef48126ac30163658e5-6" href="https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html#rest_code_1a65092c94a14ef48126ac30163658e5-6"&gt;&lt;/a&gt;&lt;span class="go"&gt;2.655728 ms&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I'm pleased that Rasterio is only about 15% slower for this benchmark. And
the difference between the two will diminish as files grow larger. Rasterio
does considerably more validation of input and logs quite a bit. Also, rasterio
could be a little more lazy about getting and formatting a file's coordinate
referencing system. Less code and fewer bugs is the main goal of rasterio, so
getting close to gdal.py performance-wise is icing on the cake.&lt;/p&gt;</description><category>benchmark</category><category>cython</category><category>gdal</category><category>numpy</category><category>pixels</category><category>python</category><category>rasterio</category><category>work</category><guid>https://sgillies.net/2013/12/13/is-rasterio-fast-enough.html</guid><pubDate>Fri, 13 Dec 2013 07:00:00 GMT</pubDate></item><item><title>My first photo in Wikimedia Commons</title><link>https://sgillies.net/2013/12/06/my-first-photo-in-wikimedia-commons.html</link><dc:creator>Sean Gillies</dc:creator><description>&lt;img alt="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/1601_Sheely_Drive.jpg/640px-1601_Sheely_Drive.jpg" src="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/1601_Sheely_Drive.jpg/640px-1601_Sheely_Drive.jpg" style="width: 640px;"&gt;
&lt;p&gt;If you ever need an panoramic illustration of what a post-WWII
just-figuring-out-this-suburban-thing Colorado neighborhood looks like in the
21st century, consider &lt;a class="reference external" href="http://commons.wikimedia.org/wiki/File:1601_Sheely_Drive.jpg"&gt;this one&lt;/a&gt;.&lt;/p&gt;</description><category>fort collins</category><category>history</category><category>life</category><category>photo</category><category>preservation</category><category>wikimedia</category><guid>https://sgillies.net/2013/12/06/my-first-photo-in-wikimedia-commons.html</guid><pubDate>Fri, 06 Dec 2013 07:00:00 GMT</pubDate></item><item><title>Some consequences of GeoJSON features as arrays</title><link>https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html</link><dc:creator>Sean Gillies</dc:creator><description>&lt;p&gt;Don't mind me, I'm just thinking out loud about the GeoJSON format.&lt;/p&gt;
&lt;p&gt;A GeoJSON Feature Collection is an object with a "features" key and the value
for the key is specified to be an array of Feature objects. Is the order of
Features significant? In the context of my &lt;a class="reference external" href="http://sgillies.net/blog/2013/12/04/json-diff-and-patch-for-geojson.html"&gt;previous post&lt;/a&gt;,
should a zero or empty RFC 6902 diff between this&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code javascript"&gt;&lt;a id="rest_code_23f90d7361a5468995d9a90765d69528-1" name="rest_code_23f90d7361a5468995d9a90765d69528-1" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_23f90d7361a5468995d9a90765d69528-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FeatureCollection"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_23f90d7361a5468995d9a90765d69528-2" name="rest_code_23f90d7361a5468995d9a90765d69528-2" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_23f90d7361a5468995d9a90765d69528-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"features"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_23f90d7361a5468995d9a90765d69528-3" name="rest_code_23f90d7361a5468995d9a90765d69528-3" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_23f90d7361a5468995d9a90765d69528-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Feature"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_23f90d7361a5468995d9a90765d69528-4" name="rest_code_23f90d7361a5468995d9a90765d69528-4" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_23f90d7361a5468995d9a90765d69528-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"foo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_23f90d7361a5468995d9a90765d69528-5" name="rest_code_23f90d7361a5468995d9a90765d69528-5" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_23f90d7361a5468995d9a90765d69528-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_23f90d7361a5468995d9a90765d69528-6" name="rest_code_23f90d7361a5468995d9a90765d69528-6" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_23f90d7361a5468995d9a90765d69528-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Feature"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_23f90d7361a5468995d9a90765d69528-7" name="rest_code_23f90d7361a5468995d9a90765d69528-7" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_23f90d7361a5468995d9a90765d69528-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_23f90d7361a5468995d9a90765d69528-8" name="rest_code_23f90d7361a5468995d9a90765d69528-8" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_23f90d7361a5468995d9a90765d69528-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;and this, where the feature array has been reversed,&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code javascript"&gt;&lt;a id="rest_code_b8c6ad036f1045569e9cb6fed9478fb3-1" name="rest_code_b8c6ad036f1045569e9cb6fed9478fb3-1" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b8c6ad036f1045569e9cb6fed9478fb3-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FeatureCollection"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b8c6ad036f1045569e9cb6fed9478fb3-2" name="rest_code_b8c6ad036f1045569e9cb6fed9478fb3-2" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b8c6ad036f1045569e9cb6fed9478fb3-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"features"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b8c6ad036f1045569e9cb6fed9478fb3-3" name="rest_code_b8c6ad036f1045569e9cb6fed9478fb3-3" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b8c6ad036f1045569e9cb6fed9478fb3-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Feature"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b8c6ad036f1045569e9cb6fed9478fb3-4" name="rest_code_b8c6ad036f1045569e9cb6fed9478fb3-4" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b8c6ad036f1045569e9cb6fed9478fb3-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b8c6ad036f1045569e9cb6fed9478fb3-5" name="rest_code_b8c6ad036f1045569e9cb6fed9478fb3-5" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b8c6ad036f1045569e9cb6fed9478fb3-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b8c6ad036f1045569e9cb6fed9478fb3-6" name="rest_code_b8c6ad036f1045569e9cb6fed9478fb3-6" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b8c6ad036f1045569e9cb6fed9478fb3-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Feature"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b8c6ad036f1045569e9cb6fed9478fb3-7" name="rest_code_b8c6ad036f1045569e9cb6fed9478fb3-7" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b8c6ad036f1045569e9cb6fed9478fb3-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"id"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"foo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b8c6ad036f1045569e9cb6fed9478fb3-8" name="rest_code_b8c6ad036f1045569e9cb6fed9478fb3-8" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b8c6ad036f1045569e9cb6fed9478fb3-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;be expected? Strictly speaking, no, because in JSON (see &lt;a class="reference external" href="http://www.json.org"&gt;json.org&lt;/a&gt; or &lt;a class="reference external" href="http://www.ecma-international.org/publications/standards/Ecma-404.htm"&gt;ECMA 404&lt;/a&gt;)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;An array is an ordered collection of values.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;whereas&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;An object is an unordered set of name/value pairs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;My question is related to &lt;a class="reference external" href="http://www.ietf.org/mail-archive/web/apps-discuss/current/msg08749.html"&gt;one asked on the IETF's apps-discuss
list&lt;/a&gt; in
January. Should we expect to be able to patch GeoJSON documents using the ids
of individual features? Being able to do so is more or less the reason why
GeoJSON Features have unique ids, but it's clear to me that a generic RFC 6902
won't do. As James Snell points out in that thread, more expressive paths will
be required.&lt;/p&gt;
&lt;p&gt;In my previous post on this topic (see link at the top of this one) I looked at
the addition of a new feature to the tail of the features array. The JSON patch
in this case was very simple. But what if that feature had been inserted at the
head of the features array? Is the resulting patch going to be something that
reads like "push back existing items and add new item to the head?" The result
from python-json-patch isn't pretty.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code javascript"&gt;&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-1" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-1" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-2" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-2" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-3" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-3" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"path"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/features/0/geometry/coordinates/0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-4" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-4" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;122.65496134757996&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-5" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-5" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"op"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"replace"&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-6" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-6" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-7" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-7" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-8" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-8" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"path"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/features/0/geometry/coordinates/1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-9" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-9" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;45.5212590460849&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-10" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-10" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"op"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"replace"&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-11" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-11" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-12" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-12" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-12"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-13" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-13" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-13"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"path"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/features/0/properties/Notes"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-14" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-14" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-14"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"op"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"remove"&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-15" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-15" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-15"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-16" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-16" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-16"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-17" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-17" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-17"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"path"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/features/0/properties/Name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-18" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-18" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-18"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Three Friends Coffeehouse"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-19" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-19" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-19"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"op"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"replace"&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-20" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-20" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-20"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-21" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-21" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-21"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-22" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-22" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-22"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"path"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/features/0/properties/Address"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-23" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-23" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-23"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"201 SE 12th Ave, Portland, OR 97214"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-24" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-24" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-24"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"op"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"replace"&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-25" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-25" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-25"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-26" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-26" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-26"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-27" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-27" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-27"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"path"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/features/1/geometry/coordinates/0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-28" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-28" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-28"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;122.67516911029816&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-29" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-29" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-29"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"op"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"replace"&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-30" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-30" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-30"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-31" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-31" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-31"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-32" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-32" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-32"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"path"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/features/1/geometry/coordinates/1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-33" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-33" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-33"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;45.55673233031101&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-34" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-34" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-34"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"op"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"replace"&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-35" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-35" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-35"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-36" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-36" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-36"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-37" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-37" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-37"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"path"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/features/1/properties/Notes"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-38" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-38" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-38"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"usually busy, outlets on side wall only"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-39" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-39" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-39"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"op"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"replace"&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-40" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-40" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-40"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-41" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-41" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-41"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-42" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-42" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-42"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"path"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/features/1/properties/Name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-43" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-43" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-43"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Albina Press"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-44" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-44" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-44"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"op"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"replace"&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-45" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-45" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-45"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-46" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-46" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-46"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-47" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-47" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-47"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"path"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/features/1/properties/Address"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-48" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-48" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-48"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"4637 N Albina Ave  Portland, OR 97217"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-49" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-49" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-49"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"op"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"replace"&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-50" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-50" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-50"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-51" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-51" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-51"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-52" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-52" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-52"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"path"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/features/2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-53" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-53" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-53"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-54" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-54" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-54"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"geometry"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-55" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-55" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-55"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Point"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-56" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-56" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-56"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"coordinates"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-57" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-57" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-57"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;122.68242716789246&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-58" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-58" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-58"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="mf"&gt;45.56997505986905&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-59" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-59" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-59"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-60" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-60" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-60"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-61" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-61" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-61"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Feature"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-62" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-62" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-62"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"properties"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-63" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-63" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-63"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"Notes"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-64" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-64" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-64"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"Name"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Arbor Lodge"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-65" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-65" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-65"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"Address"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1507 N Rosa Parks Way  Portland, OR 97217"&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-66" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-66" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-66"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-67" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-67" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-67"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-68" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-68" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-68"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"op"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"add"&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-69" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-69" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-69"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-70" name="rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-70" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_b2f2ef2f978e420a896b9d786d3a5e7f-70"&gt;&lt;/a&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Unless I misunderstand RFC 6901 and RFC 6902, the following ought to be
possible.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code javascript"&gt;&lt;a id="rest_code_99f85a7e6fe446b289cd84b5fa01470c-1" name="rest_code_99f85a7e6fe446b289cd84b5fa01470c-1" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_99f85a7e6fe446b289cd84b5fa01470c-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_99f85a7e6fe446b289cd84b5fa01470c-2" name="rest_code_99f85a7e6fe446b289cd84b5fa01470c-2" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_99f85a7e6fe446b289cd84b5fa01470c-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"op"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"move"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"from"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/foo/1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"path"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/foo/2"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_99f85a7e6fe446b289cd84b5fa01470c-3" name="rest_code_99f85a7e6fe446b289cd84b5fa01470c-3" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_99f85a7e6fe446b289cd84b5fa01470c-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"op"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"move"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"from"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/foo/0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"path"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/foo/1"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_99f85a7e6fe446b289cd84b5fa01470c-4" name="rest_code_99f85a7e6fe446b289cd84b5fa01470c-4" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_99f85a7e6fe446b289cd84b5fa01470c-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"path"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/features/0`"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_99f85a7e6fe446b289cd84b5fa01470c-5" name="rest_code_99f85a7e6fe446b289cd84b5fa01470c-5" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_99f85a7e6fe446b289cd84b5fa01470c-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_99f85a7e6fe446b289cd84b5fa01470c-6" name="rest_code_99f85a7e6fe446b289cd84b5fa01470c-6" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_99f85a7e6fe446b289cd84b5fa01470c-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"geometry"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_99f85a7e6fe446b289cd84b5fa01470c-7" name="rest_code_99f85a7e6fe446b289cd84b5fa01470c-7" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_99f85a7e6fe446b289cd84b5fa01470c-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Point"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_99f85a7e6fe446b289cd84b5fa01470c-8" name="rest_code_99f85a7e6fe446b289cd84b5fa01470c-8" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_99f85a7e6fe446b289cd84b5fa01470c-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"coordinates"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_99f85a7e6fe446b289cd84b5fa01470c-9" name="rest_code_99f85a7e6fe446b289cd84b5fa01470c-9" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_99f85a7e6fe446b289cd84b5fa01470c-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;122.65496134757996&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_99f85a7e6fe446b289cd84b5fa01470c-10" name="rest_code_99f85a7e6fe446b289cd84b5fa01470c-10" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_99f85a7e6fe446b289cd84b5fa01470c-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="mf"&gt;45.5212590460849&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_99f85a7e6fe446b289cd84b5fa01470c-11" name="rest_code_99f85a7e6fe446b289cd84b5fa01470c-11" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_99f85a7e6fe446b289cd84b5fa01470c-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_99f85a7e6fe446b289cd84b5fa01470c-12" name="rest_code_99f85a7e6fe446b289cd84b5fa01470c-12" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_99f85a7e6fe446b289cd84b5fa01470c-12"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_99f85a7e6fe446b289cd84b5fa01470c-13" name="rest_code_99f85a7e6fe446b289cd84b5fa01470c-13" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_99f85a7e6fe446b289cd84b5fa01470c-13"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Feature"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_99f85a7e6fe446b289cd84b5fa01470c-14" name="rest_code_99f85a7e6fe446b289cd84b5fa01470c-14" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_99f85a7e6fe446b289cd84b5fa01470c-14"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"properties"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_99f85a7e6fe446b289cd84b5fa01470c-15" name="rest_code_99f85a7e6fe446b289cd84b5fa01470c-15" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_99f85a7e6fe446b289cd84b5fa01470c-15"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"Name"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Three Friends Coffeehouse"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_99f85a7e6fe446b289cd84b5fa01470c-16" name="rest_code_99f85a7e6fe446b289cd84b5fa01470c-16" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_99f85a7e6fe446b289cd84b5fa01470c-16"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"Address"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"201 SE 12th Ave, Portland, OR 97214"&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_99f85a7e6fe446b289cd84b5fa01470c-17" name="rest_code_99f85a7e6fe446b289cd84b5fa01470c-17" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_99f85a7e6fe446b289cd84b5fa01470c-17"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_99f85a7e6fe446b289cd84b5fa01470c-18" name="rest_code_99f85a7e6fe446b289cd84b5fa01470c-18" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_99f85a7e6fe446b289cd84b5fa01470c-18"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_99f85a7e6fe446b289cd84b5fa01470c-19" name="rest_code_99f85a7e6fe446b289cd84b5fa01470c-19" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_99f85a7e6fe446b289cd84b5fa01470c-19"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"op"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"add"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_99f85a7e6fe446b289cd84b5fa01470c-20" name="rest_code_99f85a7e6fe446b289cd84b5fa01470c-20" href="https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html#rest_code_99f85a7e6fe446b289cd84b5fa01470c-20"&gt;&lt;/a&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Making concise patches won't be trivial, that seems clear, and the ideal patch
style for GeoJSON could differ from the ideal style for other applications.
I'm certain that we'd need to get to patches like the latter to make GeoJSON
patching something that developers would consider adopting. JSON PATCH provides
a useful grammar but by itself isn't enough. There's more work to be done.&lt;/p&gt;
&lt;p&gt;Did we ever consider making FeatureCollection's features key have an object
value? I'll look in the GeoJSON list archive when I have time.&lt;/p&gt;</description><category>diff</category><category>ecma</category><category>geojson</category><category>http</category><category>ietf</category><category>json</category><category>patch</category><category>python</category><category>work</category><guid>https://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html</guid><pubDate>Fri, 06 Dec 2013 07:00:00 GMT</pubDate></item><item><title>YLT covers NRBQ's Ridin' in My Car</title><link>https://sgillies.net/2013/12/06/ylt-covers-nrbq-s-ridin-in-my-car.html</link><dc:creator>Sean Gillies</dc:creator><description>&lt;p&gt;I know everybody else is using Pandora and Spotify and what not these days, but
here at home we're doubling down on actual 87.7 to 108.0 MHz radio. We give to
KCFR (Colorado Public Radio) and WFMU (Jersey City, New York, the Internet).
I'm wearing my WFMU donor swag T-shirt from 2012 in &lt;a class="reference external" href="https://www.mapbox.com/about/team/#sean-gillies"&gt;this photo&lt;/a&gt;.  This past March 14,
while I was packing to go to Santa Clara for PyCon, I made a song request
during Yo La Tengo's all-request fundraising show. The band played it, I nearly
wet myself with glee... and now just a few minutes ago, after searching for the
first time in months (I'd almost given up), I've found it on SoundCloud and am
experiencing uncomfortable levels of glee all over again:
&lt;a class="reference external" href="https://soundcloud.com/fonsessions/ridin-in-my-car-nrbq-cover-yo?in=fonsessions/sets/yo-la-tengo-wfmu-all-request"&gt;https://soundcloud.com/fonsessions/ridin-in-my-car-nrbq-cover-yo?in=fonsessions/sets/yo-la-tengo-wfmu-all-request&lt;/a&gt;.&lt;/p&gt;
&lt;img alt="http://farm8.staticflickr.com/7459/11247313594_2f9dc520d8_c_d.jpg" src="http://farm8.staticflickr.com/7459/11247313594_2f9dc520d8_c_d.jpg" style="width: 600px;"&gt;
&lt;p&gt;Definitely a highlight of 2013.&lt;/p&gt;</description><category>life</category><category>nrbq</category><category>radio</category><category>wfmu</category><category>yo la tengo</category><guid>https://sgillies.net/2013/12/06/ylt-covers-nrbq-s-ridin-in-my-car.html</guid><pubDate>Fri, 06 Dec 2013 07:00:00 GMT</pubDate></item><item><title>First blog post at MapBox</title><link>https://sgillies.net/2013/12/05/first-blog-post-at-mapbox.html</link><dc:creator>Sean Gillies</dc:creator><description>&lt;p&gt;I've made my first post for the MapBox blog: &lt;a class="reference external" href="http://mapbox.com/blog/open-web-geojson"&gt;Mapping the open web using
GeoJSON&lt;/a&gt;. It's a roundup of
products and services at work that employ GeoJSON and a bit of an explanation
of why the format fits MapBox so well. I work at a company that puts developers
first, and GeoJSON is a format that also puts developers first.&lt;/p&gt;
&lt;p&gt;What I didn't mention in the post is how much I see the format used for
getting things done everyday at work. Cutline for gdalwarp? GeoJSON. Need to
share some data in a Gist with another developer? GeoJSON. Quick map to help
someone get from A to B? GeoJSON. Of course this is what the GeoJSON authors
were hoping to make possible, but it's pretty exciting to see it happening,
and in unanticipated ways.&lt;/p&gt;
&lt;p&gt;Blogging at MapBox is super slick thanks to the engineering work &lt;a class="reference external" href="https://www.mapbox.com/blog/unit-test-blog/"&gt;Mike Morris
wrote about recently&lt;/a&gt; and
I found the amount and quality of feedback fascinating – seven different people
collaborated with me on the post in one way or another. I'm looking forward to
the next one.&lt;/p&gt;</description><category>geojson</category><category>mapbox</category><category>work</category><guid>https://sgillies.net/2013/12/05/first-blog-post-at-mapbox.html</guid><pubDate>Thu, 05 Dec 2013 07:00:00 GMT</pubDate></item><item><title>JSON diff and patch for GeoJSON</title><link>https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html</link><dc:creator>Sean Gillies</dc:creator><description>&lt;p&gt;We diff and patch source code all the time, but doing the same thing for JSON
data isn't as straightforward. More often than seeing the differences between JSON texts, we're interested in seeing (and sharing
and reapplying) the differences between the objects encoded in the text. We
want to gloss over differences in whitespace and order of object members and
see the real difference in the data. Unix patch and diff operate only on text,
and best on text of consistent and short line length, and aren't very useful
for parsing out differences between objects encoded in JSON. If diff and patch
aren't going to work, what will?&lt;/p&gt;
&lt;p&gt;RFC 6902, &lt;a class="reference external" href="http://tools.ietf.org/html/rfc6902"&gt;JavaScript Object Notation (JSON) Patch&lt;/a&gt; is one attempt at standardizing JSON
patches. From the introduction:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;JavaScript Object Notation (JSON) [&lt;a class="reference external" href="http://tools.ietf.org/html/rfc4627"&gt;RFC4627&lt;/a&gt;] is a common format for
the exchange and storage of structured data.  HTTP PATCH [&lt;a class="reference external" href="http://tools.ietf.org/html/rfc5789"&gt;RFC5789&lt;/a&gt;]
extends the Hypertext Transfer Protocol (HTTP) [&lt;a class="reference external" href="http://tools.ietf.org/html/rfc2616"&gt;RFC2616&lt;/a&gt;] with a
method to perform partial modifications to resources.&lt;/p&gt;
&lt;p&gt;JSON Patch is a format (identified by the media type "application/
json-patch+json") for expressing a sequence of operations to apply to
a target JSON document; it is suitable for use with the HTTP PATCH
method.&lt;/p&gt;
&lt;p&gt;This format is also potentially useful in other cases in which it is
necessary to make partial updates to a JSON document or to a data
structure that has similar constraints (i.e., they can be serialized
as an object or an array using the JSON grammar).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;RFC 6902 comes from developers interested in REST-style interaction with
JSON representations of resources but might be more generally useful. How does
it work? If you're familiar with XPath and XPointer, you might see some
similarities. A JSON patch doc contains an array of path, value, and operation
tuples. The path tells you how to traverse into the JSON document and the
operations specify what is done to objects using the values.&lt;/p&gt;
&lt;p&gt;For an example, I'm going to take GeoJSON from Lyzi Diamond's &lt;a class="reference external" href="https://github.com/lyzidiamond/learn-geojson"&gt;Learn GeoJSON&lt;/a&gt; project and make diffs using
Stefan Kögl's &lt;a class="reference external" href="https://github.com/stefankoegl/python-json-patch"&gt;python-json-patch&lt;/a&gt; package. RFC 6902 has
implementations in other languages, too, such as &lt;a class="reference external" href="https://github.com/bruth/jsonpatch-js"&gt;jsonpatch-js&lt;/a&gt; (npm).&lt;/p&gt;
&lt;p&gt;Here's a &lt;a class="reference external" href="https://gist.github.com/sgillies/7797688#file-json-diff-py"&gt;script&lt;/a&gt; that prints out the RFC 6902 diff between commits &lt;a class="reference external" href="https://github.com/lyzidiamond/learn-geojson/blob/44de76ef53b20bdaf51e0cde4aa634df210cd9d4/geojson/hackspots.geojson"&gt;44de76ef53&lt;/a&gt;
and &lt;a class="reference external" href="https://github.com/lyzidiamond/learn-geojson/blob/e9514f5c317ee980b94ed6580950cfd9fbde53db/geojson/hackspots.geojson"&gt;e9514f5c31&lt;/a&gt;
of &lt;a class="reference external" href="https://github.com/lyzidiamond/learn-geojson/blob/master/geojson/hackspots.geojson"&gt;hackspots.geojson&lt;/a&gt;:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code python"&gt;&lt;a id="rest_code_82d3a6bb16844e1d96947632f48c611f-1" name="rest_code_82d3a6bb16844e1d96947632f48c611f-1" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_82d3a6bb16844e1d96947632f48c611f-1"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;json&lt;/span&gt;
&lt;a id="rest_code_82d3a6bb16844e1d96947632f48c611f-2" name="rest_code_82d3a6bb16844e1d96947632f48c611f-2" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_82d3a6bb16844e1d96947632f48c611f-2"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;jsonpatch&lt;/span&gt;
&lt;a id="rest_code_82d3a6bb16844e1d96947632f48c611f-3" name="rest_code_82d3a6bb16844e1d96947632f48c611f-3" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_82d3a6bb16844e1d96947632f48c611f-3"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os.path&lt;/span&gt;
&lt;a id="rest_code_82d3a6bb16844e1d96947632f48c611f-4" name="rest_code_82d3a6bb16844e1d96947632f48c611f-4" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_82d3a6bb16844e1d96947632f48c611f-4"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;requests&lt;/span&gt;
&lt;a id="rest_code_82d3a6bb16844e1d96947632f48c611f-5" name="rest_code_82d3a6bb16844e1d96947632f48c611f-5" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_82d3a6bb16844e1d96947632f48c611f-5"&gt;&lt;/a&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;subprocess&lt;/span&gt;
&lt;a id="rest_code_82d3a6bb16844e1d96947632f48c611f-6" name="rest_code_82d3a6bb16844e1d96947632f48c611f-6" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_82d3a6bb16844e1d96947632f48c611f-6"&gt;&lt;/a&gt;
&lt;a id="rest_code_82d3a6bb16844e1d96947632f48c611f-7" name="rest_code_82d3a6bb16844e1d96947632f48c611f-7" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_82d3a6bb16844e1d96947632f48c611f-7"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# original&lt;/span&gt;
&lt;a id="rest_code_82d3a6bb16844e1d96947632f48c611f-8" name="rest_code_82d3a6bb16844e1d96947632f48c611f-8" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_82d3a6bb16844e1d96947632f48c611f-8"&gt;&lt;/a&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'hackspots-44de76ef53.json'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a id="rest_code_82d3a6bb16844e1d96947632f48c611f-9" name="rest_code_82d3a6bb16844e1d96947632f48c611f-9" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_82d3a6bb16844e1d96947632f48c611f-9"&gt;&lt;/a&gt;    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'https://github.com/lyzidiamond/learn-geojson/raw/44de76ef53b20bdaf51e0cde4aa634df210cd9d4/geojson/hackspots.geojson'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_82d3a6bb16844e1d96947632f48c611f-10" name="rest_code_82d3a6bb16844e1d96947632f48c611f-10" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_82d3a6bb16844e1d96947632f48c611f-10"&gt;&lt;/a&gt;    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;
&lt;a id="rest_code_82d3a6bb16844e1d96947632f48c611f-11" name="rest_code_82d3a6bb16844e1d96947632f48c611f-11" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_82d3a6bb16844e1d96947632f48c611f-11"&gt;&lt;/a&gt;    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'hackspots-44de76ef53.json'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'wb'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_82d3a6bb16844e1d96947632f48c611f-12" name="rest_code_82d3a6bb16844e1d96947632f48c611f-12" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_82d3a6bb16844e1d96947632f48c611f-12"&gt;&lt;/a&gt;        &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_82d3a6bb16844e1d96947632f48c611f-13" name="rest_code_82d3a6bb16844e1d96947632f48c611f-13" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_82d3a6bb16844e1d96947632f48c611f-13"&gt;&lt;/a&gt;
&lt;a id="rest_code_82d3a6bb16844e1d96947632f48c611f-14" name="rest_code_82d3a6bb16844e1d96947632f48c611f-14" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_82d3a6bb16844e1d96947632f48c611f-14"&gt;&lt;/a&gt;&lt;span class="c1"&gt;# next commit&lt;/span&gt;
&lt;a id="rest_code_82d3a6bb16844e1d96947632f48c611f-15" name="rest_code_82d3a6bb16844e1d96947632f48c611f-15" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_82d3a6bb16844e1d96947632f48c611f-15"&gt;&lt;/a&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'hackspots-e9514f5c31.json'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;a id="rest_code_82d3a6bb16844e1d96947632f48c611f-16" name="rest_code_82d3a6bb16844e1d96947632f48c611f-16" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_82d3a6bb16844e1d96947632f48c611f-16"&gt;&lt;/a&gt;    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'https://github.com/lyzidiamond/learn-geojson/raw/e9514f5c317ee980b94ed6580950cfd9fbde53db/geojson/hackspots.geojson'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_82d3a6bb16844e1d96947632f48c611f-17" name="rest_code_82d3a6bb16844e1d96947632f48c611f-17" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_82d3a6bb16844e1d96947632f48c611f-17"&gt;&lt;/a&gt;    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;
&lt;a id="rest_code_82d3a6bb16844e1d96947632f48c611f-18" name="rest_code_82d3a6bb16844e1d96947632f48c611f-18" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_82d3a6bb16844e1d96947632f48c611f-18"&gt;&lt;/a&gt;    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'hackspots-e9514f5c31.json'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'wb'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;a id="rest_code_82d3a6bb16844e1d96947632f48c611f-19" name="rest_code_82d3a6bb16844e1d96947632f48c611f-19" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_82d3a6bb16844e1d96947632f48c611f-19"&gt;&lt;/a&gt;        &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_82d3a6bb16844e1d96947632f48c611f-20" name="rest_code_82d3a6bb16844e1d96947632f48c611f-20" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_82d3a6bb16844e1d96947632f48c611f-20"&gt;&lt;/a&gt;
&lt;a id="rest_code_82d3a6bb16844e1d96947632f48c611f-21" name="rest_code_82d3a6bb16844e1d96947632f48c611f-21" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_82d3a6bb16844e1d96947632f48c611f-21"&gt;&lt;/a&gt;&lt;span class="n"&gt;diff_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;check_output&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
&lt;a id="rest_code_82d3a6bb16844e1d96947632f48c611f-22" name="rest_code_82d3a6bb16844e1d96947632f48c611f-22" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_82d3a6bb16844e1d96947632f48c611f-22"&gt;&lt;/a&gt;                &lt;span class="s1"&gt;'jsondiff'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_82d3a6bb16844e1d96947632f48c611f-23" name="rest_code_82d3a6bb16844e1d96947632f48c611f-23" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_82d3a6bb16844e1d96947632f48c611f-23"&gt;&lt;/a&gt;                &lt;span class="s1"&gt;'hackspots-44de76ef53.json'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;a id="rest_code_82d3a6bb16844e1d96947632f48c611f-24" name="rest_code_82d3a6bb16844e1d96947632f48c611f-24" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_82d3a6bb16844e1d96947632f48c611f-24"&gt;&lt;/a&gt;                &lt;span class="s1"&gt;'hackspots-e9514f5c31.json'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;a id="rest_code_82d3a6bb16844e1d96947632f48c611f-25" name="rest_code_82d3a6bb16844e1d96947632f48c611f-25" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_82d3a6bb16844e1d96947632f48c611f-25"&gt;&lt;/a&gt;&lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;diff_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;a id="rest_code_82d3a6bb16844e1d96947632f48c611f-26" name="rest_code_82d3a6bb16844e1d96947632f48c611f-26" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_82d3a6bb16844e1d96947632f48c611f-26"&gt;&lt;/a&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;diff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The result looks, to me, like a very reasonable representation of an operation
that adds one feature to a GeoJSON feature collection.&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code javascript"&gt;&lt;a id="rest_code_5869397c285c43c594898ad326a225f0-1" name="rest_code_5869397c285c43c594898ad326a225f0-1" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_5869397c285c43c594898ad326a225f0-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_5869397c285c43c594898ad326a225f0-2" name="rest_code_5869397c285c43c594898ad326a225f0-2" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_5869397c285c43c594898ad326a225f0-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_5869397c285c43c594898ad326a225f0-3" name="rest_code_5869397c285c43c594898ad326a225f0-3" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_5869397c285c43c594898ad326a225f0-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"path"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/features/2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_5869397c285c43c594898ad326a225f0-4" name="rest_code_5869397c285c43c594898ad326a225f0-4" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_5869397c285c43c594898ad326a225f0-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_5869397c285c43c594898ad326a225f0-5" name="rest_code_5869397c285c43c594898ad326a225f0-5" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_5869397c285c43c594898ad326a225f0-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"geometry"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_5869397c285c43c594898ad326a225f0-6" name="rest_code_5869397c285c43c594898ad326a225f0-6" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_5869397c285c43c594898ad326a225f0-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Point"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_5869397c285c43c594898ad326a225f0-7" name="rest_code_5869397c285c43c594898ad326a225f0-7" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_5869397c285c43c594898ad326a225f0-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"coordinates"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_5869397c285c43c594898ad326a225f0-8" name="rest_code_5869397c285c43c594898ad326a225f0-8" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_5869397c285c43c594898ad326a225f0-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;122.65496134757996&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_5869397c285c43c594898ad326a225f0-9" name="rest_code_5869397c285c43c594898ad326a225f0-9" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_5869397c285c43c594898ad326a225f0-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="mf"&gt;45.5212590460849&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_5869397c285c43c594898ad326a225f0-10" name="rest_code_5869397c285c43c594898ad326a225f0-10" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_5869397c285c43c594898ad326a225f0-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_5869397c285c43c594898ad326a225f0-11" name="rest_code_5869397c285c43c594898ad326a225f0-11" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_5869397c285c43c594898ad326a225f0-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_5869397c285c43c594898ad326a225f0-12" name="rest_code_5869397c285c43c594898ad326a225f0-12" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_5869397c285c43c594898ad326a225f0-12"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"type"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Feature"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_5869397c285c43c594898ad326a225f0-13" name="rest_code_5869397c285c43c594898ad326a225f0-13" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_5869397c285c43c594898ad326a225f0-13"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s2"&gt;"properties"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_5869397c285c43c594898ad326a225f0-14" name="rest_code_5869397c285c43c594898ad326a225f0-14" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_5869397c285c43c594898ad326a225f0-14"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"Name"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Three Friends Coffeehouse"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_5869397c285c43c594898ad326a225f0-15" name="rest_code_5869397c285c43c594898ad326a225f0-15" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_5869397c285c43c594898ad326a225f0-15"&gt;&lt;/a&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;"Address"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"201 SE 12th Ave, Portland, OR 97214"&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_5869397c285c43c594898ad326a225f0-16" name="rest_code_5869397c285c43c594898ad326a225f0-16" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_5869397c285c43c594898ad326a225f0-16"&gt;&lt;/a&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_5869397c285c43c594898ad326a225f0-17" name="rest_code_5869397c285c43c594898ad326a225f0-17" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_5869397c285c43c594898ad326a225f0-17"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_5869397c285c43c594898ad326a225f0-18" name="rest_code_5869397c285c43c594898ad326a225f0-18" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_5869397c285c43c594898ad326a225f0-18"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"op"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"add"&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_5869397c285c43c594898ad326a225f0-19" name="rest_code_5869397c285c43c594898ad326a225f0-19" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_5869397c285c43c594898ad326a225f0-19"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_5869397c285c43c594898ad326a225f0-20" name="rest_code_5869397c285c43c594898ad326a225f0-20" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_5869397c285c43c594898ad326a225f0-20"&gt;&lt;/a&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A hypothetical change of this same feature's coordinates from &lt;a class="reference external" href="https://github.com/lyzidiamond/learn-geojson/blob/e9514f5c317ee980b94ed6580950cfd9fbde53db/geojson/hackspots.geojson"&gt;e9514f5c31&lt;/a&gt;
to &lt;a class="reference external" href="https://gist.github.com/sgillies/7797688#file-foo-geojson"&gt;https://gist.github.com/sgillies/7797688#file-foo-geojson&lt;/a&gt; looks like this:&lt;/p&gt;
&lt;div class="code"&gt;&lt;pre class="code javascript"&gt;&lt;a id="rest_code_19e83f84d84340ebbc65a8efb0212946-1" name="rest_code_19e83f84d84340ebbc65a8efb0212946-1" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_19e83f84d84340ebbc65a8efb0212946-1"&gt;&lt;/a&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_19e83f84d84340ebbc65a8efb0212946-2" name="rest_code_19e83f84d84340ebbc65a8efb0212946-2" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_19e83f84d84340ebbc65a8efb0212946-2"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_19e83f84d84340ebbc65a8efb0212946-3" name="rest_code_19e83f84d84340ebbc65a8efb0212946-3" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_19e83f84d84340ebbc65a8efb0212946-3"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"path"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/features/2/geometry/coordinates/0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_19e83f84d84340ebbc65a8efb0212946-4" name="rest_code_19e83f84d84340ebbc65a8efb0212946-4" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_19e83f84d84340ebbc65a8efb0212946-4"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;122.655&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_19e83f84d84340ebbc65a8efb0212946-5" name="rest_code_19e83f84d84340ebbc65a8efb0212946-5" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_19e83f84d84340ebbc65a8efb0212946-5"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"op"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"replace"&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_19e83f84d84340ebbc65a8efb0212946-6" name="rest_code_19e83f84d84340ebbc65a8efb0212946-6" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_19e83f84d84340ebbc65a8efb0212946-6"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_19e83f84d84340ebbc65a8efb0212946-7" name="rest_code_19e83f84d84340ebbc65a8efb0212946-7" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_19e83f84d84340ebbc65a8efb0212946-7"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_19e83f84d84340ebbc65a8efb0212946-8" name="rest_code_19e83f84d84340ebbc65a8efb0212946-8" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_19e83f84d84340ebbc65a8efb0212946-8"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"path"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/features/2/geometry/coordinates/1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_19e83f84d84340ebbc65a8efb0212946-9" name="rest_code_19e83f84d84340ebbc65a8efb0212946-9" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_19e83f84d84340ebbc65a8efb0212946-9"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"value"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;45.522&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_19e83f84d84340ebbc65a8efb0212946-10" name="rest_code_19e83f84d84340ebbc65a8efb0212946-10" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_19e83f84d84340ebbc65a8efb0212946-10"&gt;&lt;/a&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;"op"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"replace"&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_19e83f84d84340ebbc65a8efb0212946-11" name="rest_code_19e83f84d84340ebbc65a8efb0212946-11" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_19e83f84d84340ebbc65a8efb0212946-11"&gt;&lt;/a&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;a id="rest_code_19e83f84d84340ebbc65a8efb0212946-12" name="rest_code_19e83f84d84340ebbc65a8efb0212946-12" href="https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html#rest_code_19e83f84d84340ebbc65a8efb0212946-12"&gt;&lt;/a&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;There's a potential for RFC 6902 style GeoJSON diffs to become very large if
highly detailed lines and polygons are being modified (via simplication or
reprojection). But GeoJSON itself is quite verbose already and a verbose patch
representation feels not surprising. If you already think GeoJSON sucks, JSON
patch for GeoJSON is going to look exta sucky because of the lengths of paths
to individual coordinate items. I don't think there's any way around that,
although GeoJSON's recursive coordinates member helps a little – consider that
the path to the first 'x' coordinate of the exterior ring of the first part of
a multi-polygon is "just" '/features/42/geometry/coordinates/0/0/0/0'.&lt;/p&gt;
&lt;p&gt;I'm not sure how RFC 6902 patches will play out at scale, but I think it's
worth further consideration.&lt;/p&gt;</description><category>diff</category><category>geojson</category><category>github</category><category>http</category><category>json</category><category>patch</category><category>python</category><category>work</category><guid>https://sgillies.net/2013/12/04/json-diff-and-patch-for-geojson.html</guid><pubDate>Wed, 04 Dec 2013 07:00:00 GMT</pubDate></item></channel></rss>