Sean Gillies (Posts about ietf)https://sgillies.net/tags/ietf.atom2023-12-31T01:26:25ZSean GilliesNikolaSupport for GeoJSON text sequences in GDAL 2.4.0https://sgillies.net/2018/12/24/geojson-text-sequences-gdal-2-4-0.html2018-12-24T08:55:28-07:002018-12-24T08:55:28-07:00Sean Gillies<p><a class="reference external" href="https://github.com/OSGeo/gdal/blob/master/gdal/NEWS">GDAL 2.4.0 is out</a> and
among other features includes the support for <a class="reference external" href="https://tools.ietf.org/html/rfc8142">RFC 8142</a> sequences of GeoJSON features that <a class="reference external" href="https://sgillies.net/2018/09/20/whats-new-in-geojson-text-sequences.html">I
blogged about in September</a>.</p>
<p>Users of <a class="reference external" href="https://github.com/Toblerity/Fiona">Fiona's</a> fio-cat command have
been able to stream features and <a class="reference external" href="https://github.com/sgillies/frs-cheat-sheet#print-count-of-features-with-attributes-matching-a-given-pattern">pipe them into filters like jq</a>
for a long time, and now ogr2ogr can do this too. Upgrade, everybody, let's
make giant single JSON objects obsolete.</p>What's New in GeoJSON Text Sequenceshttps://sgillies.net/2018/09/20/whats-new-in-geojson-text-sequences.html2018-09-20T15:21:44-06:002018-09-20T15:21:44-06:00Sean Gillies<p>A year and a half ago, I blogged about the publication of RFC 8142 and some of
the <a class="reference external" href="https://sgillies.net/2017/05/18/rfc-8142-geojson-text-sequences.html">small complications</a> using
sequences of GeoJSON texts delimited by ASCII record separators (RS, or
<code class="docutils literal">\x1e</code>). At the time there weren't any implementations other than <a class="reference external" href="https://github.com/Toblerity/Fiona">Fiona</a>, <a class="reference external" href="https://github.com/mapbox/tippecanoe">Tippecanoe</a>, jq, and GNU parallel.</p>
<p>The situation is dramatically better this week, largely due to a blog post
about <a class="reference external" href="https://www.interline.io/blog/geojsonl-extracts/">non-standard GeoJSON sequences</a>. Even Rouault has added
a <a class="reference external" href="https://gdal.org/drv_geojsonseq.html">GeoJSONSeq driver for GDAL 2.4</a>.
This makes RFC 8142 a real thing for the open source GIS community. Once this
version gets deployed widely, gigantic and unweildly GeoJSON feature collection
blobs will be passé.</p>
<p>I've also written a new Python decoder and encoder for JSON text sequences
based on my experiences in developing this feature for the Fiona library:
<a class="reference external" href="https://pypi.org/project/jsonseq">https://pypi.org/project/jsonseq</a>. I'm using language features only available in
Python 3.5 or newer, type annotations in particular. It's been refreshing to
not even think about Python 2 compatibility. If you wanted to use these classes
in an older Python application, please vendor it. It's only a few lines of code
and is pretty much complete. I learned a little more about the Python standard
library's JSON decoder and encoder, too.</p>
<p>I tweeted a link to this post, which makes me feel like a tool, but it's
a small price to pay towards burying multi-GB GeoJSON file sharing.</p>Web Linking is Updatedhttps://sgillies.net/2017/10/25/web-linking-is-updated.html2017-10-25T10:25:08-06:002017-10-25T10:25:08-06:00Sean Gillies<p>RFC 5988, which <a class="reference external" href="https://sgillies.net/2010/10/31/rfc-5988.html">I wrote about back in 2010</a>, has been updated by <a class="reference external" href="https://tools.ietf.org/html/rfc8288">RFC
8288</a>.</p>RFC 8142: GeoJSON Text Sequenceshttps://sgillies.net/2017/05/18/rfc-8142-geojson-text-sequences.html2017-05-18T10:22:00+02:002017-05-18T10:22:00+02:00Sean Gillies<p><a class="reference external" href="https://tools.ietf.org/html/rfc8142">RFC 8142</a> is the second and final
deliverable of the IETF's GeoJSON working group. It standardizes sequences of
GeoJSON texts and and a media type you can use to tell receivers "here comes
a sequence of GeoJSON Feature objects, not a GeoJSON FeatureCollection." This
is useful because a GeoJSON feature collections must be read in its entirety
before it can be parsed <a class="footnote-reference brackets" href="https://sgillies.net/2017/05/18/rfc-8142-geojson-text-sequences.html#footnote-1" id="footnote-reference-1" role="doc-noteref"><span class="fn-bracket">[</span>1<span class="fn-bracket">]</span></a>. It's a blob. A text – not binary – blob, but
a blob nonetheless. A FeatureCollection becomes unwieldy as the number of
features increases. Dynamic feed-like streams of features (consider a stream of
OSM edits or stream of features extracted in real time from imagery) also need
a different kind of representation from a static array of Feature objects.</p>
<p>Newline-delimited sequences of GeoJSON objects are being employed by some
projects, including a few at Mapbox. In a newline-delimited sequence the
individual features must use a compact form. No pretty-printed features are
permitted. If you're aggregating features produced by other services, you must
parse them and reserialize them in compact form.</p>
<p>RFC 8142 describes a format for sequences of features that may be compact or
pretty-printed. Mixed sequences are also possible. The trick is that every
sequence item must begin with an ASCII Record Seperator (RS), <code class="docutils literal">0x1E</code>, and end
with a newline. Two delimiters. The first allows formatted, pretty-printed
texts within a sequence, the latter guards against truncated sequence records.
That's it. There's not a lot to RFC 8142 other than this and the definition of
a new internet media type to mark this kind of data stream.</p>
<p>Sprinkling RS in your file sort of turns it into a binary file. Python's
<code class="docutils literal">open()</code> function, for example, does not accept <code class="docutils literal"><span class="pre">newline=u'\x1e'</span></code> and can
not provide you an iterator over RS-delimited records. You may have to write
your own <code class="docutils literal">readLine()</code> type of function to get individual items from the
stream. It's not the end of the world, but does add some friction. Vladimir
Agafonkin tells me that this is the way to do it in JavaScript:</p>
<div class="code"><pre class="code javascript"><a id="rest_code_3b121564fcde4470ad8256144556a84f-1" name="rest_code_3b121564fcde4470ad8256144556a84f-1" href="https://sgillies.net/2017/05/18/rfc-8142-geojson-text-sequences.html#rest_code_3b121564fcde4470ad8256144556a84f-1"></a><span class="kd">var</span><span class="w"> </span><span class="nx">split</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">require</span><span class="p">(</span><span class="s1">'binary-split'</span><span class="p">);</span><span class="w"></span>
<a id="rest_code_3b121564fcde4470ad8256144556a84f-2" name="rest_code_3b121564fcde4470ad8256144556a84f-2" href="https://sgillies.net/2017/05/18/rfc-8142-geojson-text-sequences.html#rest_code_3b121564fcde4470ad8256144556a84f-2"></a>
<a id="rest_code_3b121564fcde4470ad8256144556a84f-3" name="rest_code_3b121564fcde4470ad8256144556a84f-3" href="https://sgillies.net/2017/05/18/rfc-8142-geojson-text-sequences.html#rest_code_3b121564fcde4470ad8256144556a84f-3"></a><span class="nx">fs</span><span class="p">.</span><span class="nx">createReadStream</span><span class="p">(</span><span class="s1">'data.foo'</span><span class="p">)</span><span class="w"></span>
<a id="rest_code_3b121564fcde4470ad8256144556a84f-4" name="rest_code_3b121564fcde4470ad8256144556a84f-4" href="https://sgillies.net/2017/05/18/rfc-8142-geojson-text-sequences.html#rest_code_3b121564fcde4470ad8256144556a84f-4"></a><span class="p">.</span><span class="nx">pipe</span><span class="p">(</span><span class="nx">split</span><span class="p">(</span><span class="s1">'\x1E'</span><span class="p">))</span><span class="w"></span>
<a id="rest_code_3b121564fcde4470ad8256144556a84f-5" name="rest_code_3b121564fcde4470ad8256144556a84f-5" href="https://sgillies.net/2017/05/18/rfc-8142-geojson-text-sequences.html#rest_code_3b121564fcde4470ad8256144556a84f-5"></a><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">'data'</span><span class="p">,</span><span class="w"> </span><span class="kd">function</span><span class="w"> </span><span class="p">(</span><span class="nx">buf</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<a id="rest_code_3b121564fcde4470ad8256144556a84f-6" name="rest_code_3b121564fcde4470ad8256144556a84f-6" href="https://sgillies.net/2017/05/18/rfc-8142-geojson-text-sequences.html#rest_code_3b121564fcde4470ad8256144556a84f-6"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nx">geojson</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">JSON</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="nx">buf</span><span class="p">.</span><span class="nx">toString</span><span class="p">());</span><span class="w"></span>
<a id="rest_code_3b121564fcde4470ad8256144556a84f-7" name="rest_code_3b121564fcde4470ad8256144556a84f-7" href="https://sgillies.net/2017/05/18/rfc-8142-geojson-text-sequences.html#rest_code_3b121564fcde4470ad8256144556a84f-7"></a><span class="p">});</span><span class="w"></span>
</pre></div>
<p>There is already support for GeoJSON text sequences in programs that I use
often like GNU Parallel, jq, and fio. In parallel's <code class="docutils literal"><span class="pre">--pipe</span></code> mode, the
<code class="docutils literal"><span class="pre">--recstart</span></code> option will split records on RS and <code class="docutils literal"><span class="pre">--rrs</span></code> will remove the RS
from the output.</p>
<div class="code"><pre class="code console"><a id="rest_code_301255df4d334288be6fd79c83d81bd3-1" name="rest_code_301255df4d334288be6fd79c83d81bd3-1" href="https://sgillies.net/2017/05/18/rfc-8142-geojson-text-sequences.html#rest_code_301255df4d334288be6fd79c83d81bd3-1"></a><span class="go">parallel --pipe --rrs --recstart '\x1E' cat < data.jsonseq</span>
</pre></div>
<p>The current version of jq, 1.5, will read and write RS-delimited sequences if
you pass the <code class="docutils literal"><span class="pre">--seq</span></code> option.</p>
<div class="code"><pre class="code console"><a id="rest_code_8be4c0d4c8a545568ba493559bfca536-1" name="rest_code_8be4c0d4c8a545568ba493559bfca536-1" href="https://sgillies.net/2017/05/18/rfc-8142-geojson-text-sequences.html#rest_code_8be4c0d4c8a545568ba493559bfca536-1"></a><span class="go">jq --seq -c '.' data.jsonseq</span>
</pre></div>
<p>Fiona's <a class="reference external" href="http://toblerity.org/fiona/cli.html#cat">fio-cat</a> will emit RS if
you use its <cite>--rs</cite> option. This is required if you want pretty-printed
features. Otherwise fio-cat writes compact GeoJSON delimited only by newlines.
The complementary fio-collect and fio-load commands accept either
newline-delimited sequences or GeoJSON text sequences.</p>
<p>Note that there's no recommended file extension for GeoJSON text sequences.
The format is intended for network protocols and not for files. If you do save
them to files it would be best not to use .json or .geojson as an extension
because a delimited sequence of GeoJSON (RS or not) isn't valid JSON.</p>
<p>Note also that while the format technically allows mixed sequences containing
GeoJSON FeatureCollection, Feature, and Geometry objects, the semantics of
these kinds of mixed sequences is unlikely to be understood by consumers.
Streams of features seems to me like the best application for this format right
now.</p>
<p>Thanks to the following people and organizations: Eric Wilde and Martin
Thomson, the WG chairs; Alissa Cooper, Area Director; the RFC Editor and IETF
reviewers; Mark Baker, Sean Leonard, and Ned Freed for comments on the media
type; WG participants Martin Daly, Stephan Drees, Kevin Wurster, Matthew Perry,
,Allan Doyle, Carl Reed, Jerry Sievert, Peter Vretanos, and Howard Butler; and
Mapbox, my employer, for allowing me time to edit the doc.</p>
<aside class="footnote-list brackets">
<aside class="footnote brackets" id="footnote-1" role="note">
<span class="label"><span class="fn-bracket">[</span><a role="doc-backlink" href="https://sgillies.net/2017/05/18/rfc-8142-geojson-text-sequences.html#footnote-reference-1">1</a><span class="fn-bracket">]</span></span>
<p>Streaming JSON parsers are rare and difficult to use. The author of a popular one says so here: <a class="reference external" href="https://github.com/lloyd/yajl">https://github.com/lloyd/yajl</a>.</p>
</aside>
</aside>RFC 7946, the GeoJSON formathttps://sgillies.net/2016/08/11/rfc-7946-the-geojson-format.html2016-08-11T00:00:00-06:002016-08-11T00:00:00-06:00Sean Gillies<p>Hello, <a class="reference external" href="https://tools.ietf.org/html/rfc7946">RFC 7946</a>. Congratulations to
everybody involved! I'm very satisfied with it. Taking off my editor hat, I'd
like to add some personal commentary on the RFC and the process that produced
it.</p>
<section id="the-results">
<h2>The results</h2>
<p>GeoJSON is already well adopted. What did we accomplish by making it an IETF
standard?</p>
<ul class="simple">
<li><p>We've made a standard for encoding geographic data in internet messages that
isn't just for GIS or web mapping developers and is more likely to be used
in network applications like WebRTC.</p></li>
<li><p>GeoJSON is more precisely defined than ever. Bugs in the spec have been
fixed. My job at Mapbox involves services that accept GeoJSON uploads and
I'm looking forward to more standardized GeoJSON as time goes on.</p></li>
<li><p>At last we can check off the "standards" box when selling GeoJSON services
to customers that are required to use formal standards.</p></li>
</ul>
</section>
<section id="acknowledgements">
<h2>Acknowledgements</h2>
<p>RFC 7946 is the product of the IETF GeoJSON Working Group (WG) formed in October
2015. All the original authors of the GeoJSON spec participated in the WG:
Howard Butler, Martin Daly, Allan Doyle, Sean Gillies (me), Tim Schaub, and
Christopher Schmidt.</p>
<p>I scraped the WG email list and the geojson/draft-geojson GitHub repo for the
names of other WG participants: Vladimir Agafonkin, Richard Barnes, Ben
Campbell, Jose Manuel Cantera Fonseca, Micah Cochran, Simon Cox, Sergey
Fedoseev, Atle Sveen Frenvik, Jérôme Gasperi, Pedro Goncalves, Blake Grotewold,
Max Hartmann Friedrich, Chris Hills, Tõnis Kärdi, Éric Lemoine, Chris Little,
Alexey Melnikov, Calvin Metcalf, Volker Mische, Matthias Müller, David Neufeld,
George Percivall, Alexandre Petrescu, Paul Ramsey, Carl Reed, Maik Riechert,
Peter Rushforth, James Seppi, Andrew Sheppard, Jerry Sievert, Scott Simmons,
Raj Singh, Sergey Tolstov, Dirk-Willem van Gulik, Peter Vretanos, Christine
Waigl, James Winterbottom, Jeff Yutzler, and Mohammed Zia. Two participants
are identified only by their GitHub user names: breynolds, and roomthily. All
these folks helped shape the RFC.</p>
<p>GeoJSON was also shaped by people playing specific IETF roles. The WG chairs,
Martin Thomson and Erik Wilde, did a fine job of keeping the draft on track.
Our Area Director, Alissa Cooper, was the first IETF member I talked to about
chartering a working group and was a super guide throughout the entire process.
IESG reviewers Ben Campbell, Stephen Farrell, Suresh Krishnan, Alexey Melnikov,
and Kathleen Moriarty asked questions and made suggestions that greatly
improved the final draft. I'm grateful to Mary Barnes and Cullen Jennings, the
Dispatch WG chairs, for explaining how dispatch works at the IETF and inviting
me to present remotely at IETF 92.</p>
<p>I'm grateful to Tom MacWright for all the GeoJSON explainers on his blog and
for his rhetorical support. Tom regularly reminded the web – and me – why a
GeoJSON I-D was worth the effort.</p>
<p>Stefan Drees was the one who really got this ball rolling with the first
commits creating the technical framework for authoring the draft. Thanks,
Stefan.</p>
<p>I did much of the draft editing at work and Mapbox paid for my attendance at
IETF 93, where the proposal was dispatched and the working group charter
was launched. I'm proud to work for a company that's committed to making the
internet work better.</p>
</section>
<section id="changes">
<h2>Changes</h2>
<p>The changes from the Pre-IETF GeoJSON Format Specification published in 2008 at
<a class="reference external" href="http://geojson.org">http://geojson.org</a> are listed at
<a class="reference external" href="https://tools.ietf.org/html/rfc7946#appendix-B">https://tools.ietf.org/html/rfc7946#appendix-B</a>.</p>
<p>To summarize:</p>
<ul class="simple">
<li><p>Coordinate reference systems are no longer in the core of the specification;
use CRS84 longitude and latitude with GeoJSON from now on.</p></li>
<li><p>Don't extend coordinate arrays with linear referencing measure, timestamps,
or other variables.</p></li>
<li><p>Follow the math and physics right-hand rule (not the surveyor's right-hand
rule) when forming polygon rings.</p></li>
<li><p>Construct bounding boxes so they are not ambiguous at the Earth's poles and
antimeridian.</p></li>
<li><p>Do extend GeoJSON, but don't change its semantics.</p></li>
<li><p>Don't write longitude and latitude values with more than 7 decimal places of
precision.</p></li>
<li><p>Avoid using GeometryCollection when possible.</p></li>
<li><p>Reference <a class="reference external" href="https://tools.ietf.org/html/rfc7946">RFC 7946</a> from now on
instead of <a class="reference external" href="http://geojson.org">http://geojson.org</a>.</p></li>
</ul>
<p>One change that we glossed over in that appendix is that the set of GeoJSON
types is closed. Extensions can't, for example, add a "Circle" type. That
doesn't mean that there will never be GeoJSON circles, ellipses, and curves,
but that they must be added to the core by a future RFC.</p>
<p>Here's an important point that may be obscured by formalities: RFC 7946
does not define a "GeoJSON 2.0." This is "GeoJSON." If you need to be more
specific, e.g., in describing support for deprecated features like "crs", you
should refer to "2008 geojson.org GeoJSON" vs. "RFC 7946 GeoJSON" or
"application/geo+json GeoJSON." There is no "GeoJSON 2.0."</p>
</section>
<section id="ietf-process-and-people">
<h2>IETF process and people</h2>
<p>I'm pleased to report that the IETF process works pretty much as described at
<a class="reference external" href="https://www.ietf.org/about/standards-process.html">https://www.ietf.org/about/standards-process.html</a>. Whenever I got baffled,
I found helpful and generous people to point me in the right direction. I'm
going to stay involved in the IETF in one way or another.</p>
</section>Building I-Ds and RFCs with CircleCIhttps://sgillies.net/2016/03/01/building-ids-and-rfcs-with-circleci.html2016-03-01T00:00:00-07:002016-03-01T00:00:00-07:00Sean Gillies<p>In the IETF GeoJSON WG we're using the technique described in <a class="reference external" href="http://tools.ietf.org/html/rfc7328.html">RFC 7328 --
Writing I-Ds and RFCs Using Pandoc and a Bit of XML</a> to write our drafts and
GitHub to collaborate on the Markdown sources. I've configured CircleCI to
build HTML, nroff, text, and XML editions of the draft on each push and pull
request to catch issues that break the draft building toolchain. I'm not fluent
with RFC editor XML and mess up the tagging regularly, so this is helping the
WG quite a bit.</p>
<p>Recently I woke up to the possibilities in saving the text and HTML editions as
CircleCI build artifacts. Here's the <code class="docutils literal">circle.yml</code> file from
<a class="reference external" href="https://github.com/geojson/draft-geojson">https://github.com/geojson/draft-geojson</a>:</p>
<div class="code"><pre class="code yaml"><a id="rest_code_64f6a12aaf8348759451af9ca9ab7e46-1" name="rest_code_64f6a12aaf8348759451af9ca9ab7e46-1" href="https://sgillies.net/2016/03/01/building-ids-and-rfcs-with-circleci.html#rest_code_64f6a12aaf8348759451af9ca9ab7e46-1"></a><span class="nt">machine</span><span class="p">:</span><span class="w"></span>
<a id="rest_code_64f6a12aaf8348759451af9ca9ab7e46-2" name="rest_code_64f6a12aaf8348759451af9ca9ab7e46-2" href="https://sgillies.net/2016/03/01/building-ids-and-rfcs-with-circleci.html#rest_code_64f6a12aaf8348759451af9ca9ab7e46-2"></a><span class="w"> </span><span class="nt">python</span><span class="p">:</span><span class="w"></span>
<a id="rest_code_64f6a12aaf8348759451af9ca9ab7e46-3" name="rest_code_64f6a12aaf8348759451af9ca9ab7e46-3" href="https://sgillies.net/2016/03/01/building-ids-and-rfcs-with-circleci.html#rest_code_64f6a12aaf8348759451af9ca9ab7e46-3"></a><span class="w"> </span><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">2.7.10</span><span class="w"></span>
<a id="rest_code_64f6a12aaf8348759451af9ca9ab7e46-4" name="rest_code_64f6a12aaf8348759451af9ca9ab7e46-4" href="https://sgillies.net/2016/03/01/building-ids-and-rfcs-with-circleci.html#rest_code_64f6a12aaf8348759451af9ca9ab7e46-4"></a>
<a id="rest_code_64f6a12aaf8348759451af9ca9ab7e46-5" name="rest_code_64f6a12aaf8348759451af9ca9ab7e46-5" href="https://sgillies.net/2016/03/01/building-ids-and-rfcs-with-circleci.html#rest_code_64f6a12aaf8348759451af9ca9ab7e46-5"></a><span class="nt">dependencies</span><span class="p">:</span><span class="w"></span>
<a id="rest_code_64f6a12aaf8348759451af9ca9ab7e46-6" name="rest_code_64f6a12aaf8348759451af9ca9ab7e46-6" href="https://sgillies.net/2016/03/01/building-ids-and-rfcs-with-circleci.html#rest_code_64f6a12aaf8348759451af9ca9ab7e46-6"></a><span class="w"> </span><span class="nt">pre</span><span class="p">:</span><span class="w"></span>
<a id="rest_code_64f6a12aaf8348759451af9ca9ab7e46-7" name="rest_code_64f6a12aaf8348759451af9ca9ab7e46-7" href="https://sgillies.net/2016/03/01/building-ids-and-rfcs-with-circleci.html#rest_code_64f6a12aaf8348759451af9ca9ab7e46-7"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">sudo apt-get update; sudo apt-get install pandoc</span><span class="w"></span>
<a id="rest_code_64f6a12aaf8348759451af9ca9ab7e46-8" name="rest_code_64f6a12aaf8348759451af9ca9ab7e46-8" href="https://sgillies.net/2016/03/01/building-ids-and-rfcs-with-circleci.html#rest_code_64f6a12aaf8348759451af9ca9ab7e46-8"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">pip install -U pip</span><span class="w"></span>
<a id="rest_code_64f6a12aaf8348759451af9ca9ab7e46-9" name="rest_code_64f6a12aaf8348759451af9ca9ab7e46-9" href="https://sgillies.net/2016/03/01/building-ids-and-rfcs-with-circleci.html#rest_code_64f6a12aaf8348759451af9ca9ab7e46-9"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">pip install xml2rfc</span><span class="w"></span>
<a id="rest_code_64f6a12aaf8348759451af9ca9ab7e46-10" name="rest_code_64f6a12aaf8348759451af9ca9ab7e46-10" href="https://sgillies.net/2016/03/01/building-ids-and-rfcs-with-circleci.html#rest_code_64f6a12aaf8348759451af9ca9ab7e46-10"></a>
<a id="rest_code_64f6a12aaf8348759451af9ca9ab7e46-11" name="rest_code_64f6a12aaf8348759451af9ca9ab7e46-11" href="https://sgillies.net/2016/03/01/building-ids-and-rfcs-with-circleci.html#rest_code_64f6a12aaf8348759451af9ca9ab7e46-11"></a><span class="nt">test</span><span class="p">:</span><span class="w"></span>
<a id="rest_code_64f6a12aaf8348759451af9ca9ab7e46-12" name="rest_code_64f6a12aaf8348759451af9ca9ab7e46-12" href="https://sgillies.net/2016/03/01/building-ids-and-rfcs-with-circleci.html#rest_code_64f6a12aaf8348759451af9ca9ab7e46-12"></a><span class="w"> </span><span class="nt">override</span><span class="p">:</span><span class="w"></span>
<a id="rest_code_64f6a12aaf8348759451af9ca9ab7e46-13" name="rest_code_64f6a12aaf8348759451af9ca9ab7e46-13" href="https://sgillies.net/2016/03/01/building-ids-and-rfcs-with-circleci.html#rest_code_64f6a12aaf8348759451af9ca9ab7e46-13"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">make</span><span class="w"></span>
<a id="rest_code_64f6a12aaf8348759451af9ca9ab7e46-14" name="rest_code_64f6a12aaf8348759451af9ca9ab7e46-14" href="https://sgillies.net/2016/03/01/building-ids-and-rfcs-with-circleci.html#rest_code_64f6a12aaf8348759451af9ca9ab7e46-14"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">head draft.txt</span><span class="w"></span>
<a id="rest_code_64f6a12aaf8348759451af9ca9ab7e46-15" name="rest_code_64f6a12aaf8348759451af9ca9ab7e46-15" href="https://sgillies.net/2016/03/01/building-ids-and-rfcs-with-circleci.html#rest_code_64f6a12aaf8348759451af9ca9ab7e46-15"></a>
<a id="rest_code_64f6a12aaf8348759451af9ca9ab7e46-16" name="rest_code_64f6a12aaf8348759451af9ca9ab7e46-16" href="https://sgillies.net/2016/03/01/building-ids-and-rfcs-with-circleci.html#rest_code_64f6a12aaf8348759451af9ca9ab7e46-16"></a><span class="nt">general</span><span class="p">:</span><span class="w"></span>
<a id="rest_code_64f6a12aaf8348759451af9ca9ab7e46-17" name="rest_code_64f6a12aaf8348759451af9ca9ab7e46-17" href="https://sgillies.net/2016/03/01/building-ids-and-rfcs-with-circleci.html#rest_code_64f6a12aaf8348759451af9ca9ab7e46-17"></a><span class="w"> </span><span class="nt">artifacts</span><span class="p">:</span><span class="w"></span>
<a id="rest_code_64f6a12aaf8348759451af9ca9ab7e46-18" name="rest_code_64f6a12aaf8348759451af9ca9ab7e46-18" href="https://sgillies.net/2016/03/01/building-ids-and-rfcs-with-circleci.html#rest_code_64f6a12aaf8348759451af9ca9ab7e46-18"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">draft.txt</span><span class="w"></span>
<a id="rest_code_64f6a12aaf8348759451af9ca9ab7e46-19" name="rest_code_64f6a12aaf8348759451af9ca9ab7e46-19" href="https://sgillies.net/2016/03/01/building-ids-and-rfcs-with-circleci.html#rest_code_64f6a12aaf8348759451af9ca9ab7e46-19"></a><span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">draft.html</span><span class="w"></span>
</pre></div>
<p>Under the <a class="reference external" href="https://circleci.com/gh/geojson/draft-geojson/56#artifacts">Artifacts</a>
tab on a CircleCI build page, there's a browseable folder hierarchy that
exposes links to <a class="reference external" href="https://circleci.com/gh/geojson/draft-geojson/56#artifacts">draft.html</a> and <a class="reference external" href="https://circle-artifacts.com/gh/geojson/draft-geojson/56/artifacts/0/home/ubuntu/draft-geojson/draft.txt">draft.txt</a>.</p>
<p>I should have done this sooner! I may look into including some of the IETF
tools like idnits and idspell.</p>IETF GeoJSONhttps://sgillies.net/2015/12/05/ietf-geojson.html2015-12-05T00:00:00-07:002015-12-05T00:00:00-07:00Sean Gillies<p>Having busted up my technical/administrative blogjam, I'm going to try to catch
up on the news from my little corner of the world. The new IETF GeoJSON
working group that I've been incubating finally hatched on October 1. The
chairs are Martin Thomson and Erik Wilde and I'm playing the role of lead
editor. All but one of the original format spec authors are participating in
the working group along others from the original email list and a bunch of
IETF folks. We're going to ship two documents: a GeoJSON format specification
(with clarifications and extension guidance) and a document describing a format
for a streamable sequence of GeoJSON texts (as I've sketched out in this blog
<a class="reference external" href="https://sgillies.net/2014/10/05/unix-style-spatial-etl-with-fio-cat-collect-and-load.html">previously</a>).</p>
<p>The IETF GeoJSON WG will operate out of the existing
<a class="reference external" href="https://github.com/geojson/draft-geojson">https://github.com/geojson/draft-geojson</a> repo and use an IETF GeoJSON mailing
list <a class="reference external" href="https://www.ietf.org/mailman/listinfo/geojson">https://www.ietf.org/mailman/listinfo/geojson</a> for discussion and
announcements. See
<a class="reference external" href="https://github.com/geojson/draft-geojson/blob/master/CONTRIBUTING.md">https://github.com/geojson/draft-geojson/blob/master/CONTRIBUTING.md</a> for all
the details about contributing. The WG's draft is <a class="reference external" href="https://datatracker.ietf.org/doc/draft-ietf-geojson/">https://datatracker.ietf.org/doc/draft-ietf-geojson/</a> and replaces the old <a class="reference external" href="https://datatracker.ietf.org/doc/draft-butler-geojson/">https://datatracker.ietf.org/doc/draft-butler-geojson/</a> draft that we've been iterating on for a year or so. This is to say
that the IETF GeoJSON WG has adopted the draft of the independent GeoJSON
working group and that the independent GeoJSON working group has become the
IETF GeoJSON WG.</p>
<p>To get to the next revision of draft-ietf-geojson, I'm going through the
outstanding issues in the tracker, summarizing them to the discussion list,
and trying to reach consensus on whether to add text to the spec, remove
text from the spec, or leave it alone. Some of these are more contentious than
others, such as if and how GeoJSON should be extended. So far we have
consensus that there is extensibility, but no consensus that there is a
capital E Extension Framework.</p>
<p>If you've ever felt that the GeoJSON specification wasn't clear enough on
something or is out of step with recent technological advances, this is the
time to jump in and help improve it.</p>Pruning CRS from GeoJSONhttps://sgillies.net/2014/08/06/pruning-crs-from-geojson.html2014-08-06T00:00:00-06:002014-08-06T00:00:00-06:00Sean Gillies<p>I uploaded <a class="reference external" href="http://tools.ietf.org/html/draft-butler-geojson-04">version 4 of the GeoJSON I-D</a> to the IETF's tracker
yesterday. It contains a <a class="reference external" href="http://tools.ietf.org/rfcdiff?url2=draft-butler-geojson-04.txt">major change to section
3</a>. In
version 3, the draft contained more or less the same text as in
<a class="reference external" href="http://geojson.org/geojson-spec.html">http://geojson.org/geojson-spec.html</a>, but version 4 declares that coordinate
reference systems other than the default are not recommended and that means of
describing them, <em>including the CRS object of the original 2008 spec</em>, are now
application specific concerns. In other words, if you want projected
coordinates in the GeoJSON that travels between the front and back ends of your
web app you're on your own. Furthermore, you're doing it wrong if you
publish this projected GeoJSON to the open web and expect processors to have
access to an EPSG database.</p>
<p>I've been watching the IETF JSON Working Group's JSON, I-JSON, and JSON
Sequence discussions closely while revising the GeoJSON I-D. Version 4 treats
CRS like RFC 7159 treats <a class="reference external" href="http://tools.ietf.org/html/rfc7159#section-8">character encoding</a>, acknowledging other
coordinate reference systems while making a very strong recommendation for
using the default CRS. You could say CRS84 is our UTF-8. Version 4 also requires
that coordinates not be ordered latitude, longitude. Lat/lng is like our byte
order mark.</p>
<p>Removing the CRS object description from the draft has been a goal of mine from
the start. Its poor design has been a distraction and it never was as useful to
developers as we intended. The GeoJSON draft is better without it. I get the
impression that some standards people will see its removal from the draft as
a void to be filled. CRS wonks gotta wonk, I suppose, but do developers care
very much that there is no JSON equivalent of <code class="docutils literal"><gml:ProjectedCRS></code>? I don't
think so.</p>Steady as she goeshttps://sgillies.net/2014/07/02/steady-as-she-goes.html2014-07-02T00:00:00-06:002014-07-02T00:00:00-06:00Sean Gillies<p>Standards organizations are increasingly interested in the little format that
could and if <a class="reference external" href="http://www.w3.org/2014/05/geo-charter">http://www.w3.org/2014/05/geo-charter</a> is any indication it's
likely that you'll be seeing more mention of <a class="reference external" href="http://geojson.org">GeoJSON</a>
and <a class="reference external" href="http://github.com/geojson/geojson-ld">GeoJSON-LD</a> in OGC and W3C
materials soon. However, the GeoJSON working group (for which I'm speaking in
just this and the following sentence), is going to keep its own independent
course. Work on the <a class="reference external" href="http://tools.ietf.org/html/draft-butler-geojson-03">GeoJSON Internet Draft</a> will continue to be
done at <a class="reference external" href="https://github.com/geojson/draft-geojson">https://github.com/geojson/draft-geojson</a> and on the GeoJSON <a class="reference external" href="http://lists.geojson.org/listinfo.cgi/geojson-geojson.org">discussion
list</a>.</p>
<p>Now, Mapbox has recently joined the OGC and I've subsequently received emails
from OGC members seeking discussion of GeoJSON. This is exactly the thing that
I want to avoid and I will decline to do so outside of the GeoJSON venues
I listed above. I hope you will, too, because discussions of GeoJSON on closed OGC
technical committee lists or private emails with other OGC members aren't going
to do the GeoJSON format, I-D, or users any good. GeoJSON is for the open web.
Let's continue to tend it on the open web.</p>Some consequences of GeoJSON features as arrayshttps://sgillies.net/2013/12/06/some-consequences-of-geojson-features-as-arrays.html2013-12-06T00:00:00-07:002013-12-06T00:00:00-07:00Sean Gillies<p>Don't mind me, I'm just thinking out loud about the GeoJSON format.</p>
<p>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 <a class="reference external" href="http://sgillies.net/blog/2013/12/04/json-diff-and-patch-for-geojson.html">previous post</a>,
should a zero or empty RFC 6902 diff between this</p>
<div class="code"><pre class="code javascript"><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"></a><span class="p">{</span><span class="w"> </span><span class="s2">"type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"FeatureCollection"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"features"</span><span class="o">:</span><span class="w"> </span><span class="p">[</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="s2">"type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"Feature"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"id"</span><span class="o">:</span><span class="w"> </span><span class="s2">"foo"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">...</span><span class="w"> </span><span class="p">},</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="s2">"type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"Feature"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"id"</span><span class="o">:</span><span class="w"> </span><span class="s2">"bar"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">...</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="p">}</span><span class="w"></span>
</pre></div>
<p>and this, where the feature array has been reversed,</p>
<div class="code"><pre class="code javascript"><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"></a><span class="p">{</span><span class="w"> </span><span class="s2">"type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"FeatureCollection"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"features"</span><span class="o">:</span><span class="w"> </span><span class="p">[</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="s2">"type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"Feature"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"id"</span><span class="o">:</span><span class="w"> </span><span class="s2">"bar"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">...</span><span class="w"> </span><span class="p">},</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="s2">"type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"Feature"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"id"</span><span class="o">:</span><span class="w"> </span><span class="s2">"foo"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">...</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="p">]</span><span class="w"> </span><span class="p">}</span><span class="w"></span>
</pre></div>
<p>be expected? Strictly speaking, no, because in JSON (see <a class="reference external" href="http://www.json.org">json.org</a> or <a class="reference external" href="http://www.ecma-international.org/publications/standards/Ecma-404.htm">ECMA 404</a>)</p>
<blockquote>
<p>An array is an ordered collection of values.</p>
</blockquote>
<p>whereas</p>
<blockquote>
<p>An object is an unordered set of name/value pairs.</p>
</blockquote>
<p>My question is related to <a class="reference external" href="http://www.ietf.org/mail-archive/web/apps-discuss/current/msg08749.html">one asked on the IETF's apps-discuss
list</a> 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.</p>
<p>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.</p>
<div class="code"><pre class="code javascript"><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"></a><span class="p">[</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">{</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"path"</span><span class="o">:</span><span class="w"> </span><span class="s2">"/features/0/geometry/coordinates/0"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"value"</span><span class="o">:</span><span class="w"> </span><span class="o">-</span><span class="mf">122.65496134757996</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"op"</span><span class="o">:</span><span class="w"> </span><span class="s2">"replace"</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">},</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">{</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"path"</span><span class="o">:</span><span class="w"> </span><span class="s2">"/features/0/geometry/coordinates/1"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"value"</span><span class="o">:</span><span class="w"> </span><span class="mf">45.5212590460849</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"op"</span><span class="o">:</span><span class="w"> </span><span class="s2">"replace"</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">},</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">{</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"path"</span><span class="o">:</span><span class="w"> </span><span class="s2">"/features/0/properties/Notes"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"op"</span><span class="o">:</span><span class="w"> </span><span class="s2">"remove"</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">},</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">{</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"path"</span><span class="o">:</span><span class="w"> </span><span class="s2">"/features/0/properties/Name"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"value"</span><span class="o">:</span><span class="w"> </span><span class="s2">"Three Friends Coffeehouse"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"op"</span><span class="o">:</span><span class="w"> </span><span class="s2">"replace"</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">},</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">{</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"path"</span><span class="o">:</span><span class="w"> </span><span class="s2">"/features/0/properties/Address"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"value"</span><span class="o">:</span><span class="w"> </span><span class="s2">"201 SE 12th Ave, Portland, OR 97214"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"op"</span><span class="o">:</span><span class="w"> </span><span class="s2">"replace"</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">},</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">{</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"path"</span><span class="o">:</span><span class="w"> </span><span class="s2">"/features/1/geometry/coordinates/0"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"value"</span><span class="o">:</span><span class="w"> </span><span class="o">-</span><span class="mf">122.67516911029816</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"op"</span><span class="o">:</span><span class="w"> </span><span class="s2">"replace"</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">},</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">{</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"path"</span><span class="o">:</span><span class="w"> </span><span class="s2">"/features/1/geometry/coordinates/1"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"value"</span><span class="o">:</span><span class="w"> </span><span class="mf">45.55673233031101</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"op"</span><span class="o">:</span><span class="w"> </span><span class="s2">"replace"</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">},</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">{</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"path"</span><span class="o">:</span><span class="w"> </span><span class="s2">"/features/1/properties/Notes"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"value"</span><span class="o">:</span><span class="w"> </span><span class="s2">"usually busy, outlets on side wall only"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"op"</span><span class="o">:</span><span class="w"> </span><span class="s2">"replace"</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">},</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">{</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"path"</span><span class="o">:</span><span class="w"> </span><span class="s2">"/features/1/properties/Name"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"value"</span><span class="o">:</span><span class="w"> </span><span class="s2">"Albina Press"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"op"</span><span class="o">:</span><span class="w"> </span><span class="s2">"replace"</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">},</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">{</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"path"</span><span class="o">:</span><span class="w"> </span><span class="s2">"/features/1/properties/Address"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"value"</span><span class="o">:</span><span class="w"> </span><span class="s2">"4637 N Albina Ave Portland, OR 97217"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"op"</span><span class="o">:</span><span class="w"> </span><span class="s2">"replace"</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">},</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">{</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"path"</span><span class="o">:</span><span class="w"> </span><span class="s2">"/features/2"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"value"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"geometry"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"Point"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"coordinates"</span><span class="o">:</span><span class="w"> </span><span class="p">[</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="o">-</span><span class="mf">122.68242716789246</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="mf">45.56997505986905</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">]</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">},</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"Feature"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"properties"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"Notes"</span><span class="o">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"Name"</span><span class="o">:</span><span class="w"> </span><span class="s2">"Arbor Lodge"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"Address"</span><span class="o">:</span><span class="w"> </span><span class="s2">"1507 N Rosa Parks Way Portland, OR 97217"</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">}</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">},</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"op"</span><span class="o">:</span><span class="w"> </span><span class="s2">"add"</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">}</span><span class="w"></span>
<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"></a><span class="p">]</span><span class="w"></span>
</pre></div>
<p>Unless I misunderstand RFC 6901 and RFC 6902, the following ought to be
possible.</p>
<div class="code"><pre class="code javascript"><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"></a><span class="p">[</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="s2">"op"</span><span class="o">:</span><span class="w"> </span><span class="s2">"move"</span><span class="p">,</span><span class="w"> </span><span class="s2">"from"</span><span class="o">:</span><span class="w"> </span><span class="s2">"/foo/1"</span><span class="p">,</span><span class="w"> </span><span class="s2">"path"</span><span class="o">:</span><span class="w"> </span><span class="s2">"/foo/2"</span><span class="w"> </span><span class="p">},</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="s2">"op"</span><span class="o">:</span><span class="w"> </span><span class="s2">"move"</span><span class="p">,</span><span class="w"> </span><span class="s2">"from"</span><span class="o">:</span><span class="w"> </span><span class="s2">"/foo/0"</span><span class="p">,</span><span class="w"> </span><span class="s2">"path"</span><span class="o">:</span><span class="w"> </span><span class="s2">"/foo/1"</span><span class="w"> </span><span class="p">},</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="s2">"path"</span><span class="o">:</span><span class="w"> </span><span class="s2">"/features/0`"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"value"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"geometry"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"Point"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"coordinates"</span><span class="o">:</span><span class="w"> </span><span class="p">[</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="o">-</span><span class="mf">122.65496134757996</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="mf">45.5212590460849</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">]</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">},</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"type"</span><span class="o">:</span><span class="w"> </span><span class="s2">"Feature"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"properties"</span><span class="o">:</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"Name"</span><span class="o">:</span><span class="w"> </span><span class="s2">"Three Friends Coffeehouse"</span><span class="p">,</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"Address"</span><span class="o">:</span><span class="w"> </span><span class="s2">"201 SE 12th Ave, Portland, OR 97214"</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">}</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="p">},</span><span class="w"></span>
<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"></a><span class="w"> </span><span class="s2">"op"</span><span class="o">:</span><span class="w"> </span><span class="s2">"add"</span><span class="w"> </span><span class="p">}</span><span class="w"></span>
<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"></a><span class="p">]</span><span class="w"></span>
</pre></div>
<p>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.</p>
<p>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.</p>