{"id":625,"date":"2011-10-27T22:42:15","date_gmt":"2011-10-27T20:42:15","guid":{"rendered":"http:\/\/visurus.wordpress.com\/?p=625"},"modified":"2014-02-27T23:16:22","modified_gmt":"2014-02-27T23:16:22","slug":"zipscribble-map-switzerland-part-ii","status":"publish","type":"post","link":"https:\/\/www.ralphstraumann.ch\/blog\/2011\/10\/zipscribble-map-switzerland-part-ii\/","title":{"rendered":"ZIPScribble Map: Switzerland \u2013 Part II"},"content":{"rendered":"<p>Having seen a visualization by\u00a0<a href=\"http:\/\/kosara.net\/\">Robert Kosara<\/a>\u00a0of\u00a0<a href=\"http:\/\/eagereyes.org\">EagerEyes<\/a>\u00a0a loooong time ago,\u00a0I wanted to try to reproduce it for Switzerland using\u00a0<a href=\"http:\/\/visurus.wordpress.com\/2011\/03\/18\/intro-to-processing\/\">Processing<\/a>. This is the second installment of a two-parts post covering this project, in which I will describe how to arrive at the final result, the ZIPScribble Map. I&#8217;ll do that in some detail, maybe this is helpful to somebody.<\/p>\n<p>In the <a href=\"http:\/\/visurus.wordpress.com\/2011\/10\/16\/zipscribble-map-switzerland-%e2%80%93-part-i\/\">first installment<\/a>\u00a0of this series I explained my process up to an intermediate result: a map depicting all the postal code locations in Switzerland, like this:<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/www.ralphstraumann.ch\/blog\/wp-content\/uploads\/2011\/10\/postalcodesswi_dark_labels1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-616\" title=\"Postal codes of Switzerland\" alt=\"\" src=\"http:\/\/www.ralphstraumann.ch\/blog\/wp-content\/uploads\/2011\/10\/postalcodesswi_dark_labels1.png\" width=\"576\" height=\"378\" \/><\/a><\/p>\n<p>This involved creating a basemap with TileMill, using Till Nagel&#8217;s MercatorMap class in Processing, finding and downloading postal code data from Geonames and writing a Processing sketch which makes use of all these. In this second installment I will explain how to arrive at a ZIPScribble Map for Switzerland from the above intermediate result. So from the first part we have many things in place already. What is missing are basically three things:<!--more--><\/p>\n<ul>\n<li>Functionality to sort the postal codes and their associated location<\/li>\n<li>Functionality to draw lines between individual postal code locations<\/li>\n<li>Functionality to notice changes in the postal codes and to react accordingly (e.g. changing the line colour when changing from postal codes 1### to 2###)<\/li>\n<\/ul>\n<p>So in the remainder I will cover what it takes to include this abilities in the Processing sketch and to make it all work together.<\/p>\n<p><strong>Sorting postal codes and associated location<\/strong><\/p>\n<p>Sorting the postal codes and their location is necessary for the ZIPScribble Map, for in the map, all postal codes are visited in sequential order (from smallest to biggest or vice versa) and connected by a line. However, the <a href=\"http:\/\/www.geonames.org\">Geonames<\/a> dataset doesn&#8217;t come in this format. Of course, one could download the postal code data from Geonames, import the data in some spreadsheet programme, do the sorting and save the data to a comfortably accessible format.<\/p>\n<p>However, for easy re-production of the ZIPScribble Map I aimed at automating the whole process and to start from the Geonames postal code dataset without any manual touching up.<\/p>\n<p>So here is what I came up with after some research. Some sources suggested that in Processing\/Java it would be easiest to implement the\u00a0<a href=\"http:\/\/download.oracle.com\/javase\/7\/docs\/api\/java\/lang\/Comparable.html\">Comparable<\/a> interface. Any class that implements the Comparable interface is sortable, i.e. objects instantiated from that class have an ordering termed <em>natural ordering<\/em>. The natural ordering is defined by the class&#8217;s <em>compareTo<\/em> method. The objects can then be sorted using <em>Collections.sort()<\/em>.<\/p>\n<p>Less abstractly speaking, I created a class <em>Zippoint<\/em> in my Processing sketch by including the following code after the <em>draw()<\/em> method (another example of a <em>Comparable<\/em> implementation (unrelated to Processing and this project) can be seen <a href=\"http:\/\/www.java-tips.org\/java-se-tips\/java.lang\/how-to-use-comparable-interface.html\">here<\/a>):<\/p>\n<p>[sourcecode language=&#8221;java&#8221;]<br \/>\npublic class Zippoint implements Comparable {<br \/>\nfloat lat, lon;<br \/>\nString zipcode;<br \/>\n\/\/ Constructor<br \/>\npublic Zippoint(String zipcode, float lat, float lon) {<br \/>\nthis.zipcode = zipcode;<br \/>\nthis.lat = lat;<br \/>\nthis.lon = lon;<br \/>\n}<br \/>\npublic int compareTo(Object other) {<br \/>\nreturn((this.zipcode).compareTo(((Zippoint)other).zipcode));<br \/>\n}<br \/>\n}<br \/>\n[\/sourcecode]<\/p>\n<p>Line 1 in above code snippet declares that <em>Zippoint<\/em> implements <em>Comparable<\/em>. <em>Zippoint<\/em> has three instance variables: <em>lat<\/em>, <em>lon<\/em> and <em>zipcode<\/em> for storing the coordinates and the postal code as read from the Geonames dataset (lines 2 and 3). The constructor is straight-forward. Finally, the <em>compareTo<\/em> method (lines 10 to 12) does the trick: It takes an object <em>other<\/em> and compares the <em>zipcode<\/em> of <em>this<\/em>\u00a0zippoint to the <em>zipcode<\/em> of the <em>other\u00a0<\/em>zippoint.<br \/>\nOne could write one&#8217;s own functionality into this <em>compareTo<\/em> method. However, for my purpose it was good enough to re-use a <em>compareTo<\/em> method from the Java <em>String<\/em> class. The\u00a0<a href=\"http:\/\/download.oracle.com\/javase\/7\/docs\/api\/java\/lang\/String.html#compareTo(java.lang.String)\"><em>compareTo()<\/em>\u00a0method<\/a>\u00a0of the <em>String<\/em> class \u2013\u00a0used as follows: <em>stringA<\/em>.<em>compareTo(stringB)<\/em>\u00a0\u2013 compares two strings lexicographically:<\/p>\n<blockquote><p>The character sequence represented by this\u00a0<code>String<\/code>\u00a0object is compared lexicographically to the character sequence represented by the argument string. The result is a negative integer if this\u00a0<code>String<\/code>\u00a0object lexicographically precedes the argument string. The result is a positive integer if this\u00a0<code>String<\/code>\u00a0object lexicographically follows the argument string.<\/p><\/blockquote>\n<p>That is all we need in order to have the <em>Zippoint<\/em> class up and running and in order to implement <em>Comparable<\/em>.<\/p>\n<p>Side-note: String comparison is not problematic in this case. Since postal codes in Switzerland are always constituted by four digits, there are no problems with the String comparison. I.e., there is no situation where String comparison would sort a sequence of numbers like this: 101, 1011, 200, 2001.<br \/>\nIndeed,\u00a0String comparison is useful in this context for several reasons: When Processing reads the data from the Geonames text file, it first reads everything as String. So keeping postal codes stored as strings rather than integers, saves a conversion. Secondly, and more importantly, some countries have postal codes which contain sequences of characters and are thus best represented as strings.<\/p>\n<p>The following code snippet covers the part that reads the Geonames data from file, instantiates an object of the <em>Zippoint<\/em> class for every record, collects them in an <em>ArrayList<\/em>and does the sorting:<\/p>\n<p>[sourcecode language=&#8221;java&#8221;]<br \/>\nString[] lines;<br \/>\nIterator itr;<br \/>\nvoid setup() {<br \/>\n\/\/ &#8230;<br \/>\n\/\/ Read data from text file, build list, sort, set up iterator<br \/>\nint index = 0;<br \/>\nlines = loadStrings(&#8220;zipcodes_SWI.txt&#8221;);<br \/>\nList ziplist = new ArrayList();<br \/>\nwhile (index &lt; lines.length) {<br \/>\nString[] row = split(lines[index], &#8216;t&#8217;);<br \/>\nziplist.add(new Zippoint(row[1], float(row[9]), float(row[10])));<br \/>\nindex++;<br \/>\n}<br \/>\nCollections.sort(ziplist);<br \/>\nitr = ziplist.iterator();<br \/>\n}<br \/>\n[\/sourcecode]<\/p>\n<p>From <a href=\"http:\/\/visurus.wordpress.com\/2011\/10\/16\/zipscribble-map-switzerland-%e2%80%93-part-i\/\">the first part of this project<\/a> you are already familiar with line 7 which reads the postal code data from the text file. Line 8 defines an <em>ArrayList<\/em> object to store the <em>Zippoint<\/em> objects. In line 9 through 13 Processing iterates through the String array <em>lines<\/em>, gets the relevant substrings, creates a <em>Zippoint<\/em> object and adds it to the <em>ArrayList<\/em> object. Then line 14 does the sorting in ascending order (this, at last, is where we profit from having implemented the <em>Comparable<\/em> interface!). Line 15 finally sets up an iterator on the <em>ArrayList<\/em> object. This allows us to iterate over the <em>Zippoint<\/em> objects later in the <em>draw()<\/em> method.<\/p>\n<p><strong>Drawing lines between postal code locations<\/strong><\/p>\n<p>In this part I used the above mentioned iterator in order to (&#8220;<em>ta-dah!&#8221;\u00a0<\/em>;) iterate through the collection of <em>zippoints<\/em>. But before that, I define fill (none) and stroke colour and invoke a crucial method, <em>beginShape()<\/em>:<\/p>\n<p>[sourcecode language=&#8221;java&#8221; firstline=&#8221;17&#8243;]<br \/>\nnoFill();<br \/>\nstroke(60,180,210);<br \/>\nbeginShape();<br \/>\nwhile (itr.hasNext()) {<br \/>\nZippoint zippoint = (Zippoint)itr.next();<br \/>\nvertex(mercatorMap.getScreenLocation(new PVector(zippoint.lat, zippoint.lon)).x, mercatorMap.getScreenLocation(new PVector(zippoint.lat, zippoint.lon)).y);<br \/>\n}<br \/>\nendShape();<br \/>\n[\/sourcecode]<\/p>\n<p>The pair of <em>beginShape()<\/em> and <em>endShape()<\/em> allows you to define forms using vertices, so it gives you more flexibility over standard forms like, for example, <em>ellipse()<\/em>. The <a href=\"http:\/\/processing.org\/reference\/beginShape_.html\">Processing documentation<\/a> states:<\/p>\n<blockquote><p>Using the\u00a0beginShape()\u00a0and\u00a0endShape()\u00a0functions allow creating more complex forms.\u00a0beginShape()\u00a0begins recording vertices for a shape and\u00a0endShape()\u00a0stops recording. [&#8230;]\u00a0After calling the\u00a0beginShape()\u00a0function, a series of\u00a0vertex()commands must follow.<\/p><\/blockquote>\n<p>As you can see in the code snippet, the <em>beginShape()<\/em> method is followed by a call to <em>vertex()<\/em>, which is repeated for every <em>zippoint<\/em> the iterator finds in the sorted collection. <em>vertex()<\/em> is handed the latitude and longitude of the respective <em>zippoint<\/em>as its two arguments, the translation from geographic coordinates to screen coordinates is done by Till Nagel&#8217;s <em>mercatorMap.getScreenLocation()<\/em> method \u2013\u00a0you can read more on this in <a href=\"http:\/\/visurus.wordpress.com\/2011\/10\/16\/zipscribble-map-switzerland-%E2%80%93-part-i\/\">part I of this tutorial<\/a>.<\/p>\n<p>The code so far results in the following map:<\/p>\n<figure id=\"attachment_662\" aria-describedby=\"caption-attachment-662\" style=\"width: 576px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.ralphstraumann.ch\/blog\/wp-content\/uploads\/2011\/10\/postalcodesswi1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-662 \" title=\"ZIPScribble Map intermediate result\" alt=\"\" src=\"http:\/\/www.ralphstraumann.ch\/blog\/wp-content\/uploads\/2011\/10\/postalcodesswi1.png\" width=\"576\" height=\"378\" \/><\/a><figcaption id=\"caption-attachment-662\" class=\"wp-caption-text\">ZIPScribble Map intermediate result<\/figcaption><\/figure>\n<p>Not bad, but not yet done. For this to become a true ZIPScribble Map, the colour of the strokes connecting the postal codes has to change whenever the first part of the postal code changes (or, when we enter a new &#8216;postal area&#8217;). How is this done? Like so:<\/p>\n<p><strong>Switching visual style in response to change in postal code<\/strong><\/p>\n<p>This is not so hard anymore, given the code in the above code snippet which iterates through the <em>zippoints<\/em>. What I do is\u00a0\u00a0\u2013 abstractly speaking\u00a0\u2013 saving the first <em>n<\/em> digits of the last <em>zippoint<\/em> and comparing them to the first\u00a0<em>n<\/em>\u00a0digits of the current\u00a0<em>zippoint\u00a0<\/em>in the iterator. If there is a change I finish drawing the shape, change the visual style using a new <em>stroke()<\/em> assignment and start a new shape. The easiest way of implementing this will also automatically ensure that differently coloured ZIPScribbles are disconnected from each other.\u00a0It&#8217;s pretty straightforward and I will leave the implementation to the interested reader\/programmer.<\/p>\n<p>I have\u00a0the colour switching itself (or more precisely: the choosing of a \u00a0new colour) in a really naive way, I must admit. I had been trying various approaches (also some more intelligent ones) but wasn&#8217;t quite convinced by any of them.<br \/>\nWhat I do now is pretty much also the first approach I have ever come up with: I randomly select a new colour when a postal code discontinuity occurs.<br \/>\nAs a small quantum of sophistication and in order to have enough contrast with the background map, I repeat the random colour shuffling, until the sum of the r,g,b values is in an acceptable range to make a good contrast with the basemap at least highly likely. Behold this &#8220;ingenuity&#8221;:<\/p>\n<p>[sourcecode language=&#8221;java&#8221;]<br \/>\nint r = 255;<br \/>\nint g = 255;<br \/>\nint b = 255;<br \/>\nwhile (r+g+b &gt; 500 || r+g+b &lt; 450){<br \/>\nr = int(random(0,255));<br \/>\ng = int(random(0,255));<br \/>\nb = int(random(0,255));<br \/>\n}<br \/>\n[\/sourcecode]<\/p>\n<p>Readers: I&#8217;d be thankful for any pointers to more clever ways of choosing colour in this context.<\/p>\n<p><strong>Results<\/strong><\/p>\n<p>So, these are all the parts we need. Plugging them together correctly enables me to finally draw a ZIPScribble Map! (I&#8217;m excited here :)<\/p>\n<p>For my ZIPScribble Maps I varied the number of postal code digits which are compared for detecting breaks in the postal codes. I call these <em>levels<\/em>:<\/p>\n<ul>\n<li>Level 1 ZIPScribble Map: One digit is compared. Thus, a discontinuity is detected, for example, between postal codes 8679 and 9000, but no discontinuity is detected between 8399 and 8400.<\/li>\n<li>Level 2 ZIPScribble Map: Two digits are compared. Thus, a discontinuity is detected between postal codes 8679 and 9000 as well as between 8399 and 8400.<\/li>\n<li>The Level 3 ZIPScribble Map works accordingly&#8230;<\/li>\n<\/ul>\n<p>I have included some Level 1 to Level 3 examples with the two different backgrounds from Part I of this post series below:<\/p>\n<figure id=\"attachment_665\" aria-describedby=\"caption-attachment-665\" style=\"width: 576px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.ralphstraumann.ch\/blog\/wp-content\/uploads\/2011\/10\/postalcodesswi_level1_dark.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-665 \" title=\"ZIPScribble Map Switzerland Level 1\" alt=\"\" src=\"http:\/\/www.ralphstraumann.ch\/blog\/wp-content\/uploads\/2011\/10\/postalcodesswi_level1_dark.png\" width=\"576\" height=\"378\" srcset=\"https:\/\/www.ralphstraumann.ch\/blog\/wp-content\/uploads\/2011\/10\/postalcodesswi_level1_dark.png 1024w, https:\/\/www.ralphstraumann.ch\/blog\/wp-content\/uploads\/2011\/10\/postalcodesswi_level1_dark-300x197.png 300w, https:\/\/www.ralphstraumann.ch\/blog\/wp-content\/uploads\/2011\/10\/postalcodesswi_level1_dark-624x410.png 624w\" sizes=\"auto, (max-width: 576px) 100vw, 576px\" \/><\/a><figcaption id=\"caption-attachment-665\" class=\"wp-caption-text\">ZIPScribble Map Switzerland Level 1<\/figcaption><\/figure>\n<figure id=\"attachment_666\" aria-describedby=\"caption-attachment-666\" style=\"width: 576px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.ralphstraumann.ch\/blog\/wp-content\/uploads\/2011\/10\/postalcodesswi_level2_dark1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-666 \" title=\"ZIPScribble Map Switzerland Level 2\" alt=\"\" src=\"http:\/\/www.ralphstraumann.ch\/blog\/wp-content\/uploads\/2011\/10\/postalcodesswi_level2_dark1.png\" width=\"576\" height=\"378\" srcset=\"https:\/\/www.ralphstraumann.ch\/blog\/wp-content\/uploads\/2011\/10\/postalcodesswi_level2_dark1.png 1024w, https:\/\/www.ralphstraumann.ch\/blog\/wp-content\/uploads\/2011\/10\/postalcodesswi_level2_dark1-300x197.png 300w, https:\/\/www.ralphstraumann.ch\/blog\/wp-content\/uploads\/2011\/10\/postalcodesswi_level2_dark1-624x410.png 624w\" sizes=\"auto, (max-width: 576px) 100vw, 576px\" \/><\/a><figcaption id=\"caption-attachment-666\" class=\"wp-caption-text\">ZIPScribble Map Switzerland Level 2<\/figcaption><\/figure>\n<figure id=\"attachment_667\" aria-describedby=\"caption-attachment-667\" style=\"width: 576px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.ralphstraumann.ch\/blog\/wp-content\/uploads\/2011\/10\/postalcodesswi_level3_dark.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-667 \" title=\"ZIPScribble Map Switzerland Level 3\" alt=\"\" src=\"http:\/\/www.ralphstraumann.ch\/blog\/wp-content\/uploads\/2011\/10\/postalcodesswi_level3_dark.png\" width=\"576\" height=\"378\" \/><\/a><figcaption id=\"caption-attachment-667\" class=\"wp-caption-text\">ZIPScribble Map Switzerland Level 3<\/figcaption><\/figure>\n<figure id=\"attachment_668\" aria-describedby=\"caption-attachment-668\" style=\"width: 576px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.ralphstraumann.ch\/blog\/wp-content\/uploads\/2011\/10\/postalcodesswi_level1_bright1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-668 \" title=\"ZIPScribble Map Switzerland Level 1\" alt=\"\" src=\"http:\/\/www.ralphstraumann.ch\/blog\/wp-content\/uploads\/2011\/10\/postalcodesswi_level1_bright1.png\" width=\"576\" height=\"378\" \/><\/a><figcaption id=\"caption-attachment-668\" class=\"wp-caption-text\">ZIPScribble Map Switzerland Level 1<\/figcaption><\/figure>\n<figure id=\"attachment_669\" aria-describedby=\"caption-attachment-669\" style=\"width: 576px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.ralphstraumann.ch\/blog\/wp-content\/uploads\/2011\/10\/postalcodesswi_level2_bright.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-669 \" title=\"ZIPScribble Map Switzerland Level 2\" alt=\"\" src=\"http:\/\/www.ralphstraumann.ch\/blog\/wp-content\/uploads\/2011\/10\/postalcodesswi_level2_bright.png\" width=\"576\" height=\"378\" \/><\/a><figcaption id=\"caption-attachment-669\" class=\"wp-caption-text\">ZIPScribble Map Switzerland Level 2<\/figcaption><\/figure>\n<figure id=\"attachment_670\" aria-describedby=\"caption-attachment-670\" style=\"width: 576px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/www.ralphstraumann.ch\/blog\/wp-content\/uploads\/2011\/10\/postalcodesswi_level3_bright.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-670 \" title=\"ZIPScribble Map Switzerland Level 3\" alt=\"\" src=\"http:\/\/www.ralphstraumann.ch\/blog\/wp-content\/uploads\/2011\/10\/postalcodesswi_level3_bright.png\" width=\"576\" height=\"378\" \/><\/a><figcaption id=\"caption-attachment-670\" class=\"wp-caption-text\">ZIPScribble Map Switzerland Level 3<\/figcaption><\/figure>\n<p>This was the second part of the two parts tutorial on how to draw a ZIPScribble Map using freely available data and free software. As in Part I my thanks extend to\u00a0<a href=\"http:\/\/kosara.net\/\">Robert Kosara<\/a>,\u00a0<a href=\"http:\/\/mapbox.com\/tilemill\">TileMill<\/a>,\u00a0<a href=\"http:\/\/tillnagel.com\/\">Till Nagel<\/a>\u00a0and\u00a0<a href=\"http:\/\/www.geonames.org\/\">Geonames<\/a>!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Having seen a visualization by\u00a0Robert Kosara\u00a0of\u00a0EagerEyes\u00a0a loooong time ago,\u00a0I wanted to try to reproduce it for Switzerland using\u00a0Processing. This is the second installment of a two-parts post covering this project, in which I will describe how to arrive at the final result, the ZIPScribble Map. I&#8217;ll do that in some detail, maybe this is helpful &hellip; <a href=\"https:\/\/www.ralphstraumann.ch\/blog\/2011\/10\/zipscribble-map-switzerland-part-ii\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">ZIPScribble Map: Switzerland \u2013 Part II<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":662,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"ZIPScribble Map: Switzerland \u2013 Part II: http:\/\/wp.me\/p1qYOj-a5","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[8],"tags":[66,89,90,114,125,133,134],"class_list":["post-625","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-piece","tag-java","tag-postcodes","tag-processing","tag-tilemill","tag-visualization","tag-zip-codes","tag-zipscribblemap"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/www.ralphstraumann.ch\/blog\/wp-content\/uploads\/2011\/10\/postalcodesswi.png","jetpack_shortlink":"https:\/\/wp.me\/p3pPwF-a5","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.ralphstraumann.ch\/blog\/wp-json\/wp\/v2\/posts\/625","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ralphstraumann.ch\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ralphstraumann.ch\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ralphstraumann.ch\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ralphstraumann.ch\/blog\/wp-json\/wp\/v2\/comments?post=625"}],"version-history":[{"count":1,"href":"https:\/\/www.ralphstraumann.ch\/blog\/wp-json\/wp\/v2\/posts\/625\/revisions"}],"predecessor-version":[{"id":1612,"href":"https:\/\/www.ralphstraumann.ch\/blog\/wp-json\/wp\/v2\/posts\/625\/revisions\/1612"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ralphstraumann.ch\/blog\/wp-json\/wp\/v2\/media\/662"}],"wp:attachment":[{"href":"https:\/\/www.ralphstraumann.ch\/blog\/wp-json\/wp\/v2\/media?parent=625"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ralphstraumann.ch\/blog\/wp-json\/wp\/v2\/categories?post=625"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ralphstraumann.ch\/blog\/wp-json\/wp\/v2\/tags?post=625"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}