<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="8" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[8]</anchor-end> <dfn>Encoded Polyline</dfn> は、一連の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">経緯度</anchor>の組の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">リスト</anchor>を単一の
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ASCII文字列</anchor>として<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化</anchor>する方式です。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Google Maps</anchor> で用いられています。</p><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1]</anchor-end> <cite xml:lang="en">Encoded Polyline Algorithm Format  |  Google Maps APIs  |  Google Developers</cite>
(<time>2016-02-16 08:30:05 +09:00</time> 版)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://developers.google.com/maps/documentation/utilities/polylinealgorithm">https://developers.google.com/maps/documentation/utilities/polylinealgorithm</anchor-external></li></ul></refs><section><h1>符号化</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="11" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[11]</anchor-end> 一連の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">経緯度</anchor>を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化</anchor>してそのままの順序で並べます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="12" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[12]</anchor-end> 各<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">経緯度</anchor>は、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">緯度</anchor>、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">経度</anchor>の順に<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化</anchor>して順に並べます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="13" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[13]</anchor-end> 各値の最終文字は、 <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x3F</n>-<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x5E</n>  を使って表されます。
それよりも前の文字は、<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x5F</n>-<n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">0x7E</n> を使って表されます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="10" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[10]</anchor-end> 同じような性質を持つ他のデータにも適用できます。 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Google</anchor> 自身が
「level」の符号化に用いる例を示しています <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="4" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;4</anchor-internal></src>。
ただし、この場合<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">経緯度</anchor>のように値2つの組ではなく、値1つだけの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">リスト</anchor>となります。
しかも、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">経緯度</anchor>のように前の値との<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">差</anchor>を取ったり、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ビット演算</anchor>したりせずに、
5ビット<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号無し整数</anchor>としてそのまま符号化しているようです。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="19" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[19]</anchor-end> 
一般化すると、符号化器・復号器は次の引数を取る<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">アルゴリズム</anchor>となります。</p><figure class="list members"><dl><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">組の個数</f></dt><dd>1組のデータとして扱われるべき値の個数。<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">緯度経度</anchor>の場合は <n xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">2</n>。</dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">桁移動</f></dt><dd>個々の値を<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">整数</anchor>化するため符号化時に掛け、復号時に割るべき数。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">緯度経度</anchor>の場合は 1e5。</dd><dt><f xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">差分</f></dt><dd>1つ前の値との<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">差</anchor>かどうか。<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">緯度経度</anchor>の場合は<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">真</anchor>。</dd></dl></figure></section><section><h1>文脈</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="9" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[9]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Google Maps</anchor> の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">API</anchor> で<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">符号化</anchor>と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">復号</anchor>の機能が提供されています。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="15" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[15]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Strava</anchor> の <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">API</anchor> で採用されています <src xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="14" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;14</anchor-internal></src>。</p><refs xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><ul xmlns="http://www.w3.org/1999/xhtml"><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="3" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[3]</anchor-end> <cite xml:lang="en">Google Maps JavaScript API V3 Reference  |  Google Maps JavaScript API  |  Google Developers</cite> (<time>2016-09-27 13:07:08 +09:00</time> 版) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://developers.google.com/maps/documentation/javascript/reference?csw=1#encoding">https://developers.google.com/maps/documentation/javascript/reference?csw=1#encoding</anchor-external></li></ul></refs></section><section><h1>メモ</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[2]</anchor-end> <cite xml:lang="en">mapbox/polyline: polyline encoding and decoding in javascript</cite>
(<time>2016-04-20 15:07:00 +09:00</time> 版)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/mapbox/polyline">https://github.com/mapbox/polyline</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="4" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[4]</anchor-end> <cite xml:lang="en">Interactive Polyline Encoder Utility  |  Google Maps APIs  |  Google Developers</cite>
(<time>2016-02-16 08:30:08 +09:00</time> 版)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://developers.google.com/maps/documentation/utilities/polylineutility">https://developers.google.com/maps/documentation/utilities/polylineutility</anchor-external></p><figure class="quote"><figcaption><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="5" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[5]</anchor-end> <cite xml:lang="en">Encoded Polyline Algorithm Format  |  Google Maps APIs  |  Google Developers</cite>
(<time>2016-07-13 06:14:37 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://developers.google.com/maps/documentation/utilities/polylinealgorithm">https://developers.google.com/maps/documentation/utilities/polylinealgorithm</anchor-external></figcaption><blockquote><p>Polyline encoding is a lossy compression algorithm that allows you to store a series of coordinates as a single string. Point coordinates are encoded using signed values.</p></blockquote></figure><figure class="quote"><figcaption><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[6]</anchor-end> <cite xml:lang="en">Interactive Polyline Encoder Utility  |  Google Maps APIs  |  Google Developers</cite>
(<time>2016-07-13 06:14:40 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://developers.google.com/maps/documentation/utilities/polylineutility">https://developers.google.com/maps/documentation/utilities/polylineutility</anchor-external></figcaption><blockquote><p>Polylines in Google Maps are formed as a set of latitude/longitude pairs. In addition, for each vertex (location) in an encoded polyline, a level can be specified indicating that the location should appear on that level and any level higher (i.e. any decrease in zoom.).</p></blockquote></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[7]</anchor-end> <cite>Geo::Google::PolylineEncoder - search.cpan.org</cite>
(<time>2016-07-19 20:55:42 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://search.cpan.org/dist/Geo-Google-PolylineEncoder/lib/Geo/Google/PolylineEncoder.pm">http://search.cpan.org/dist/Geo-Google-PolylineEncoder/lib/Geo/Google/PolylineEncoder.pm</anchor-external></p><figure class="quote"><figcaption><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="14" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[14]</anchor-end> <cite xml:lang="en">Strava API Reference</cite>
( (<time>2016-07-26 09:24:09 +09:00</time>))
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://strava.github.io/api/#polylines">https://strava.github.io/api/#polylines</anchor-external></figcaption><blockquote><p>Activity and segment API requests may include summary polylines of their respective routes. The values are string encodings of the latitude and longitude points using the Google encoded polyline algorithm format.</p></blockquote></figure><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="16" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[16]</anchor-end> <cite xml:lang="en">wakaba/perl-geo-encodedpolyline</cite>
(<time>2016-10-04 20:23:13 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/wakaba/perl-geo-encodedpolyline">https://github.com/wakaba/perl-geo-encodedpolyline</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="17" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[17]</anchor-end> <cite xml:lang="en">wakaba/js-geo-encodedpolyline</cite>
(<time>2016-10-04 22:15:15 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/wakaba/js-geo-encodedpolyline">https://github.com/wakaba/js-geo-encodedpolyline</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="18" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[18]</anchor-end> <cite>ST_AsEncodedPolyline</cite>
(<time>2018-07-05 06:28:49 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://postgis.net/docs/ST_AsEncodedPolyline.html">https://postgis.net/docs/ST_AsEncodedPolyline.html</anchor-external></p></section></body></html>