<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>OSM - Jake Coppinger</title>
	<atom:link href="https://jakecoppinger.com/tag/osm/feed/" rel="self" type="application/rss+xml" />
	<link>https://jakecoppinger.com</link>
	<description>Jake Coppinger&#039;s blog and portfolio.</description>
	<lastBuildDate>Mon, 09 Sep 2024 13:13:36 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.5</generator>

<image>
	<url>https://jakecoppinger.com/wp-content/uploads/2024/07/cropped-closeup-headshot-jake-coppinger-2024-32x32.jpg</url>
	<title>OSM - Jake Coppinger</title>
	<link>https://jakecoppinger.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Preliminary analysis of Better Intersections data</title>
		<link>https://jakecoppinger.com/2024/07/preliminary-analysis-of-better-intersections-data/</link>
					<comments>https://jakecoppinger.com/2024/07/preliminary-analysis-of-better-intersections-data/#respond</comments>
		
		<dc:creator><![CDATA[Jake C]]></dc:creator>
		<pubDate>Sun, 30 Jun 2024 14:57:06 +0000</pubDate>
				<category><![CDATA[Australia]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Side project]]></category>
		<category><![CDATA[Sydney]]></category>
		<category><![CDATA[Urbanism]]></category>
		<category><![CDATA[better intersections]]></category>
		<category><![CDATA[city of sydney]]></category>
		<category><![CDATA[OSM]]></category>
		<category><![CDATA[sydney]]></category>
		<guid isPermaLink="false">https://jakecoppinger.com/?p=1161</guid>

					<description><![CDATA[<p>These are a collection of charts picking apart the Better Intersections dataset. They provide multiple avenues to find further patterns in complex and incomplete date, but also as a tool for communicating and demonstrating improvement over time (or perhaps lack thereof).</p>
<p>The post <a href="https://jakecoppinger.com/2024/07/preliminary-analysis-of-better-intersections-data/">Preliminary analysis of Better Intersections data</a> first appeared on <a href="https://jakecoppinger.com">Jake Coppinger</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Over the weekend I implemented a number of charts and graphs looking into the data contributed by Better Intersections volunteers.</p>



<p>It is a &#8220;living document&#8221; and will change (and hopefully improve!) over time.</p>



<p>See embed of the page at <a href="https://betterintersections.jakecoppinger.com/analysis">https://betterintersections.jakecoppinger.com/analysis</a> below. Please let me know if you spot any errors, bugs, or have suggestions on further charts!</p>



<iframe frameborder="0" src="https://betterintersections.jakecoppinger.com/analysis" class=" alignfull" allowfullscreen style="width:90vw;max-width:90vw;height:90vh"></iframe>



<p></p><p>The post <a href="https://jakecoppinger.com/2024/07/preliminary-analysis-of-better-intersections-data/">Preliminary analysis of Better Intersections data</a> first appeared on <a href="https://jakecoppinger.com">Jake Coppinger</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://jakecoppinger.com/2024/07/preliminary-analysis-of-better-intersections-data/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Which Australian councils are building the most cycleways?</title>
		<link>https://jakecoppinger.com/2024/01/which-australian-councils-are-building-the-most-cycleways/</link>
					<comments>https://jakecoppinger.com/2024/01/which-australian-councils-are-building-the-most-cycleways/#respond</comments>
		
		<dc:creator><![CDATA[Jake C]]></dc:creator>
		<pubDate>Tue, 16 Jan 2024 22:55:45 +0000</pubDate>
				<category><![CDATA[Cycling]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Maps]]></category>
		<category><![CDATA[Side project]]></category>
		<category><![CDATA[Streets]]></category>
		<category><![CDATA[Urbanism]]></category>
		<category><![CDATA[australian]]></category>
		<category><![CDATA[councils]]></category>
		<category><![CDATA[cycleways]]></category>
		<category><![CDATA[cycling]]></category>
		<category><![CDATA[openstreetmap]]></category>
		<category><![CDATA[OSM]]></category>
		<category><![CDATA[paths]]></category>
		<category><![CDATA[shared]]></category>
		<guid isPermaLink="false">https://jakecoppinger.com/?p=1082</guid>

					<description><![CDATA[<p>Australian Cycleway Stats is a dashboard that provides an in-depth look at the kilometres of cycleways and safe streets in every Australian council, encompassing current, under-construction, and proposed projects, as well as international benchmarks.</p>
<p>The post <a href="https://jakecoppinger.com/2024/01/which-australian-councils-are-building-the-most-cycleways/">Which Australian councils are building the most cycleways?</a> first appeared on <a href="https://jakecoppinger.com">Jake Coppinger</a>.</p>]]></description>
										<content:encoded><![CDATA[<p><a href="https://australiancyclewaystats.jakecoppinger.com/" target="_blank" rel="noopener" title="">Australian Cycleway Stats</a> is a dashboard that provides an in-depth look at the kilometres of cycleways and safe streets in every Australian council, encompassing current, under-construction, and proposed projects, as well as international benchmarks. It utilises <a href="https://www.openstreetmap.org/about" target="_blank" rel="noopener" title="">OpenStreetMap</a> data which has an <a href="https://wiki.openstreetmap.org/wiki/Key:cycleway" target="_blank" rel="noopener" title="">extremely detailed</a> specification for cycleway types to differentiate between separated cycleways, shared paths and on street &#8220;door zone&#8221; lanes.</p>



<figure class="wp-block-image size-large"><a href="https://australiancyclewaystats.jakecoppinger.com/"><img fetchpriority="high" decoding="async" width="1024" height="1010" src="https://jakecoppinger.com/wp-content/uploads/2024/01/cycleway-stats-top-1024x1010.png" alt="" class="wp-image-1084" srcset="https://jakecoppinger.com/wp-content/uploads/2024/01/cycleway-stats-top-1024x1010.png 1024w, https://jakecoppinger.com/wp-content/uploads/2024/01/cycleway-stats-top-300x296.png 300w, https://jakecoppinger.com/wp-content/uploads/2024/01/cycleway-stats-top-768x758.png 768w, https://jakecoppinger.com/wp-content/uploads/2024/01/cycleway-stats-top-1536x1515.png 1536w, https://jakecoppinger.com/wp-content/uploads/2024/01/cycleway-stats-top-2048x2020.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<figure class="wp-block-image alignwide size-large"><a href="https://australiancyclewaystats.jakecoppinger.com/"><img decoding="async" width="1024" height="687" src="https://jakecoppinger.com/wp-content/uploads/2024/01/cycleway-stats-aus-table-1024x687.png" alt="" class="wp-image-1085" srcset="https://jakecoppinger.com/wp-content/uploads/2024/01/cycleway-stats-aus-table-1024x687.png 1024w, https://jakecoppinger.com/wp-content/uploads/2024/01/cycleway-stats-aus-table-300x201.png 300w, https://jakecoppinger.com/wp-content/uploads/2024/01/cycleway-stats-aus-table-768x515.png 768w, https://jakecoppinger.com/wp-content/uploads/2024/01/cycleway-stats-aus-table-1536x1030.png 1536w, https://jakecoppinger.com/wp-content/uploads/2024/01/cycleway-stats-aus-table-2048x1373.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p>I built it to quickly compare and contrast Australian cities with their international counterparts. Clicking on any statistic opens an Overpass Turbo query displaying the relevant data.</p>



<figure class="wp-block-image alignwide size-large"><img decoding="async" width="1024" height="687" src="https://jakecoppinger.com/wp-content/uploads/2024/01/overpass-sydney-cycleways-1024x687.png" alt="" class="wp-image-1086" srcset="https://jakecoppinger.com/wp-content/uploads/2024/01/overpass-sydney-cycleways-1024x687.png 1024w, https://jakecoppinger.com/wp-content/uploads/2024/01/overpass-sydney-cycleways-300x201.png 300w, https://jakecoppinger.com/wp-content/uploads/2024/01/overpass-sydney-cycleways-768x515.png 768w, https://jakecoppinger.com/wp-content/uploads/2024/01/overpass-sydney-cycleways-1536x1030.png 1536w, https://jakecoppinger.com/wp-content/uploads/2024/01/overpass-sydney-cycleways-2048x1373.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Map displayed after clicking on the length of separated cycleways in the City of Sydney council</figcaption></figure>



<p>I previously wrote a blog post on turn-by-turn bicycle navigation apps that use this data at <a href="https://jakecoppinger.com/2020/07/the-best-apps-for-bicycle-directions/" target="_blank" rel="noopener" title="The Best Apps for Bicycle Directions (2020)">The Best Apps for Bicycle Directions (2020)</a>.</p>



<h1 class="wp-block-heading">Architecture</h1>



<p>The website is a simple frontend React Typescript app, however the data is statically compiled into a large JSON blob.</p>



<p>Generating the JSON blob requires thousands of Overpass Turbo requests. These requests are cached at build time on the filesystem using a hash of the query string as a key. This currently requires clearing the cache to completely regenerate data to fetch new updates from OpenStreetMap. When generating data for Australian councils I use a self-hosted Overpass server (also improving speed dramatically), while using overpass-api.de for the few international examples.</p>



<p>I could achieve a faster first paint by async loading this JSON blob at runtime but I haven&#8217;t yet implemented this.</p>



<p>Population counts are sourced from <a href="https://www.wikidata.org/wiki/Wikidata:Introduction" target="_blank" rel="noopener" title="">Wikidata</a> (and pregenerated in the JSON blob) based on the <code>wikidata</code> tag on OpenStreetMap relations.</p>



<p>When area names have a non-english name (identified by a <code>name:en</code> tag present), both English and local names are displayed.</p>



<h1 class="wp-block-heading">Overpass queries</h1>



<p>Overpass queries are written in <a href="https://github.com/jakecoppinger/australian-cycleway-stats/blob/main/static-backend/src/utils/overpass-queries.ts">https://github.com/jakecoppinger/australian-cycleway-stats/blob/main/static-backend/src/utils/overpass-queries.ts</a> and are somewhat complex. They contain some &#8220;opinionated&#8221; tradeoffs (informed by policy) in what roads are considered safe (&lt;= 30kmh) and what is considered a dedicated and shared cycle path. Improvements or questions are welcome!</p><p>The post <a href="https://jakecoppinger.com/2024/01/which-australian-councils-are-building-the-most-cycleways/">Which Australian councils are building the most cycleways?</a> first appeared on <a href="https://jakecoppinger.com">Jake Coppinger</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://jakecoppinger.com/2024/01/which-australian-councils-are-building-the-most-cycleways/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Contraflow streets in the City of Sydney</title>
		<link>https://jakecoppinger.com/2023/08/contraflow-streets-in-the-city-of-sydney/</link>
					<comments>https://jakecoppinger.com/2023/08/contraflow-streets-in-the-city-of-sydney/#comments</comments>
		
		<dc:creator><![CDATA[Jake C]]></dc:creator>
		<pubDate>Wed, 02 Aug 2023 07:52:17 +0000</pubDate>
				<category><![CDATA[Cycling]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Maps]]></category>
		<category><![CDATA[Streets]]></category>
		<category><![CDATA[Sydney]]></category>
		<category><![CDATA[Urbanism]]></category>
		<category><![CDATA[bicycles]]></category>
		<category><![CDATA[city of sydney]]></category>
		<category><![CDATA[contraflow]]></category>
		<category><![CDATA[cos]]></category>
		<category><![CDATA[cycling]]></category>
		<category><![CDATA[openstreetmap]]></category>
		<category><![CDATA[OSM]]></category>
		<category><![CDATA[sydney]]></category>
		<guid isPermaLink="false">https://jakecoppinger.com/?p=971</guid>

					<description><![CDATA[<p>The City of Sydney has recently approved 159 suitable streets across 24 suburbs, which will greatly improve the network of legal cycling routes in inner city Sydney.</p>
<p>This blog post is a proposal of additional streets which may be suitable for basic contraflow cycling infrastructure that the council could install in future, with a focus on the utility of OpenStreetMap for researching potential streets.</p>
<p>The post <a href="https://jakecoppinger.com/2023/08/contraflow-streets-in-the-city-of-sydney/">Contraflow streets in the City of Sydney</a> first appeared on <a href="https://jakecoppinger.com">Jake Coppinger</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>In traffic engineering, a contraflow lane is one running in the opposite direction to the surrounding lanes. Contraflow in the context of bicycle infrastructure can either be a purpose built, separated cycleway adjacent to a one way road or the mixed use of one-way streets between bicycles and vehicle traffic.</p>



<p>A street is defined as ‘contraflow’ or two-way for cyclists (and in some cases pedestrians) where people on bikes (or on foot) are legally able to travel in both directions on a street designated a one-way for motor vehicles. Suitable streets typically have low traffic volumes and low speeds, with one (or no lanes) marked, sufficient width and may already be designated as a <a href="https://en.wikipedia.org/wiki/Shared_Zone" target="_blank" rel="noopener" title="">shared zone</a> (the Australian term for a <a href="https://en.wikipedia.org/wiki/Living_street" target="_blank" rel="noopener" title="">living street</a>).</p>



<div class="wp-block-aioseo-table-of-contents"><ul><li><a href="#aioseo-new-contraflow-cycling-in-the-city-of-sydney">New contraflow cycling in the City of Sydney</a></li><li><a href="#aioseo-what-makes-a-safe-contraflow-street">What makes a safe contraflow street?</a></li><li><a href="#aioseo-streets-that-currently-allow-contraflow-cycling">Streets that currently allow contraflow cycling</a></li><li><a href="#aioseo-previously-approved-but-not-yet-built-contraflow-streets">Previously approved but not yet built contraflow streets</a></li><li><a href="#aioseo-potential-future-contraflow-streets">Potential future contraflow streets</a><ul><li><a href="#aioseo-a-proposal-of-streets-that-may-be-suitable-contraflow-streets">A proposal of streets that may be suitable contraflow streets</a></li><li><a href="#aioseo-other-notes">Other notes</a></li></ul></li><li><a href="#aioseo-appendix---all-the-overpass-turbo-queries">Appendix</a><ul><li><a href="#aioseo-more-maps">More maps</a><ul><li><a href="#aioseo-all-contraflow-permitting-streets">Contraflow permitting streets globally</a></li><li><a href="#aioseo-potential-future-contraflow-streets-outside-city-of-sydney">Potential future contraflow streets globally</a></li></ul></li><li><a href="#aioseo-appendix---all-the-overpass-turbo-queries">All the Overpass queries!</a><ul><li><a href="#aioseo-query-csv-of-possible">Query: CSV of candidates of contraflow lanes</a></li><li><a href="#aioseo-query-current-streets-allowing-bicycle-contraflow">Query: Current streets allowing bicycle contraflow</a></li><li><a href="#aioseo-query-streets-that-cos-will-turn-into-contraflow">Query: Streets that CoS will turn into contraflow</a></li><li><a href="#query-contraflow-candidates">Query: Potential future contraflow streets</a></li><li><a href="#aioseo-query-all-streets-with-bicycle-contraflow-allowed-including-outside-city-of-sydney-council">Query: All streets with bicycle contraflow allowed, including outside City of Sydney council</a></li></ul></li><li><a href="#aioseo-other-useful-data">Other useful data</a><ul><li><a href="#aioseo-ethans-sydney-bike-map">Ethan&#x27;s Sydney Bike Map</a></li></ul></li></ul></li><li><a href="#aioseo-further-work">Possible further work</a></li></ul></div>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="761" src="https://jakecoppinger.com/wp-content/uploads/2023/08/contraflow-signs-tfnsw-2-1024x761.jpg" alt="" class="wp-image-1021" srcset="https://jakecoppinger.com/wp-content/uploads/2023/08/contraflow-signs-tfnsw-2-1024x761.jpg 1024w, https://jakecoppinger.com/wp-content/uploads/2023/08/contraflow-signs-tfnsw-2-300x223.jpg 300w, https://jakecoppinger.com/wp-content/uploads/2023/08/contraflow-signs-tfnsw-2-768x570.jpg 768w, https://jakecoppinger.com/wp-content/uploads/2023/08/contraflow-signs-tfnsw-2.jpg 1388w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Example contraflow street for bicycles, marked with signs. From TfNSW Technical Direction.</figcaption></figure>



<p>In 2014, the state agency Transport for NSW issued a technical direction permitting contraflow bicycle travel on suitable streets if approved signs and markings are allowed. When provided on suitable roads, these simple street treatments create safe new routes for cyclists with an incredible value for taxpayer funds.</p>



<p>The TfNSW Technical Direction (<a href="https://roads-waterways.transport.nsw.gov.au/trafficinformation/downloads/td14-02.pdf" target="_blank" rel="noreferrer noopener">TTD 2014/002</a>) describes contraflow cycling facilities as “a cost-effective treatment that enhances the cycling experience by improving the permeability of neighbourhoods and by reducing bicycle trip lengths”.</p>



<p>This is by no means an argument against more substantial investment in separated cycleways. The <a href="https://www.tmr.qld.gov.au/travel-and-transport/cycling/cycling-investment-in-queensland" target="_blank" rel="noopener" title="">Queensland Government found</a> cycling infrastructure has a 5 to 1 return on investment, and the UK Government found with beneft-to-cost ratios in the in the range of <a href="https://assets.publishing.service.gov.uk/government/uploads/system/uploads/attachment_data/file/509587/value-of-cycling.pdf" target="_blank" rel="noopener" title="">5:1 to 19:1 – some as high as 35.5 to 1</a> (that is, a return on investment of up to 3550%). These benefits include improved public health, reduced emissions, reduced traffic, and reduction in expensive taxpayer funded road maintenance (road wear is <a href="https://en.wikipedia.org/wiki/Fourth_power_law" target="_blank" rel="noopener" title="">proportional to the 4th power</a> of axle weight). <a href="https://usa.streetsblog.org/2014/01/16/four-reasons-cities-cant-afford-not-to-invest-in-bike-infrastructure" target="_blank" rel="noopener" title="">We can&#8217;t afford not to</a> invest in dedicated cycling infrastructure.</p>


<div id="mc_embed_shell"><style type="text/css">
        #mc_embed_signup{background:#fff; false;clear:left; font:14px Helvetica,Arial,sans-serif; width: 600px;}<br />
        /* Add your own Mailchimp form style overrides in your site stylesheet or in this style block.<br />
           We recommend moving this block and the preceding CSS link to the HEAD of your HTML file. */<br />
</style>
<div id="mc_embed_signup"><form id="mc-embedded-subscribe-form" class="validate" action="https://jakecoppinger.us17.list-manage.com/subscribe/post?u=3c1bd4fc8fca6648af03e916a&amp;id=ad49243f2c&amp;f_id=00d3e4e3f0" method="post" name="mc-embedded-subscribe-form" target="_blank">
<div id="mc_embed_signup_scroll">
<h2><a href="http://eepurl.com/hemS9j" target="_blank" rel="noopener">Subscribe to Jake&#8217;s blog</a></h2>
Email notifications of new blog posts are infrequent, brief, and plain text.

</div>
</form></div>
</div>


<h2 class="wp-block-heading" id="aioseo-new-contraflow-cycling-in-the-city-of-sydney">New contraflow cycling in the City of Sydney</h2>



<p>The City of Sydney has recently <a href="https://www.cityofsydney.nsw.gov.au/proposed-works-maintenance/proposal-two-way-bike-traffic-one-way-streets" target="_blank" rel="noopener" title="">approved 159 suitable streets across 24 suburbs</a>, which will greatly improve the network of legal cycling routes in inner city Sydney. The implementation will proceed as soon as budget and works capacity allows.</p>



<p>This blog post is a proposal of additional streets which may be suitable for basic contraflow cycling infrastructure that the council could install in future, with a focus on the utility of OpenStreetMap for researching potential streets.</p>



<h2 class="wp-block-heading" id="aioseo-what-makes-a-safe-contraflow-street">What makes a safe contraflow street?</h2>



<p>Most streets can become contraflow streets with the right infrastructure (a separated cycleway), but this blog post focuses the extremely cost efficient cases where they are feasible with only a sign and/or painted markings.</p>



<p>The TfNSW technical direction specifies:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Contra-flow bicycle facilities should be assessed as a potential treatment on all local low speed, low volume one-way streets, including shared zones.<br><br>Ideally, all contra-flow bicycle movements will be delineated by a bicycle lane. A bicycle lane must be installed in locations where:<br><br>• Sight distances are restricted due to bends in the road or other features.<br>• Motor traffic volumes or speeds present a safety risk.<br>• Bicycle traffic volumes or speeds present a safety risk.<br>• The gradient and/or other road geometry increase the risk of collisions or unsafe driving or riding behaviours.<br>• The number or location of driveways present a safety risk.</p>



<p>Note: The NSW Road Rules prohibit parking in signposted bicycle lanes.<br><br>If the road space is too narrow to permit a marked bicycle lane and there is good sight distance, motor traffic volumes and speeds are low and the road geometry does not present an unacceptable safety risk, the contra- flow movement can be provided by signage alone.</p>
<cite><a href="https://roads-waterways.transport.nsw.gov.au/trafficinformation/downloads/td14-02.pdf" target="_blank" rel="noopener" title="">TTD 2014/002 Signposting for contra-flow bicycle facilities</a></cite></blockquote>



<p>With this in mind, OpenStreetMap does not include traffic volumes, however by<a href="https://jakecoppinger.com/?p=971&amp;preview=true#query-contraflow-candidates"> filtering out</a> multi lane roads, roads with high speed limits and roads that are designated as important to the motorway network we can remove from our query most high volume roads and identify further potential candidates for contraflow cycling facilities.</p>



<h1 class="wp-block-heading" id="aioseo-streets-that-currently-allow-contraflow-cycling">Streets that currently allow contraflow cycling</h1>



<p>Below is a map of current streets that permit contraflow cycling. All maps are generated <em>just for you</em> as you load this page &#8211; so it&#8217;s always up to date.</p>



<p>I make use of open source OpenStreetMap (OSM) data which is a rich data source of cycling and road infrastructure. OSM is collaborative &#8211; if you notice any errors <a href="https://www.openstreetmap.org/" target="_blank" rel="noreferrer noopener">you can edit the map</a>, and they will show up here. The dataset is heavily used (and improved) by <a href="https://wiki.openstreetmap.org/wiki/Major_OpenStreetMap_consumers" target="_blank" rel="noreferrer noopener">commercial entities</a> including Facebook, Amazon, Microsoft, TomTom, Uber, Strava, Citymapper and government entities such as the <a href="https://opendata.transport.nsw.gov.au/future-trip-planner-osm" target="_blank" rel="noopener" title="">Transport for NSW Trip Planner</a> and the Victorian Department of Transport and Planning (who <a href="https://lists.openstreetmap.org/pipermail/talk/2023-July/088336.html" target="_blank" rel="noreferrer noopener">recently made the strategic decision</a> to use OSM as their foundational mapping data source).</p>



<p>A technical note: these maps are using <a href="https://overpass-ultra.trailsta.sh/" target="_blank" rel="noopener" title="">Overpass Ultra</a> &#8211; a brilliant, open source, vector map powered OpenStreetMap query engine by Daniel Schep (<a href="https://urbanists.social/@daniel@schep.me" target="_blank" rel="noreferrer noopener">on Mastodon</a>), inspired by Overpass Turbo. Overpass Turbo shows dots for small details by default which are not possible to disable in a shared map.</p>



<p>You can click on highlighted streets to view more data, such as:</p>



<ul class="wp-block-list">
<li>name</li>



<li>lane count</li>



<li><a href="https://wiki.openstreetmap.org/wiki/Key:highway" target="_blank" rel="noopener" title="">road classification</a></li>



<li>whether it&#8217;s a <a href="https://wiki.openstreetmap.org/wiki/Tag:highway%3Dliving_street" target="_blank" rel="noopener" title="">shared zone / living street</a></li>
</ul>



<p><a href="https://overpass-ultra.trailsta.sh/#query=%5Bout:json%5D;%0A(%0A%20%20//%20Relation%201251066%20is%20COS%20boundary:%0A%20%20//%20https://www.openstreetmap.org/relation/1251066%0A%20%20rel(1251066);map_to_area-%3E.region;%0A%20%20way(area.region)%5B%22highway%22%5D%0A%20%20%5B%22oneway:bicycle%22=%22no%22%5D-%3E.ways;%0A);%0A.ways%20out%20geom;%0A&amp;map=13.134071779690379/-33.884461/151.188281&amp;mode=run&amp;style=./style.json&amp;server=https://overpass-api.de/api/" target="_blank" rel="noopener" title=""><em>View/edit query</em></a></p>



<p>(note: some of the map embeds are currently broken, please follow the &#8220;View/edit query&#8221; links)</p>



<iframe frameborder="0" src="https://overpass-ultra.us/#map&amp;m=12.97/-33.8853/151.2065&amp;q=NoewrgLgXAVgziAdgXQNwCgAU6AEOD0+OASgKYA2AhhAJZI4CMATAKwMAMAbJzjXDgGEA8gGUcAI3CIAJpQBOATyi4CRABYQIABzhRCAd0MA6EFtKI4EOaVIQAtpS0m5Ac3zWqtJPmZsunFQ9MXw5uAEpUBy0AfQgQaPlSSgBaAD4jaxc6RAw8fUoFTETKDNIspDDgACI1Ghc1fIUq5BVqpFJGqHEaAGMFHvJSKoBeKsQQZrSjRrgMCPRpgv5wCBwXUhA7DCA" class="" allowfullscreen style="width:80vw;max-width:80vw;height:70vh"></iframe>



<h1 class="wp-block-heading" id="aioseo-previously-approved-but-not-yet-built-contraflow-streets">Previously approved but not yet built contraflow streets</h1>



<p>Below is a map of streets where the contraflow infrastructure (signs and/or road markings) is approved but under construction, or not yet built (previously approved). I have mapped them on OSM with <code>oneway:bicycle=construction</code>.</p>



<p><a href="https://overpass-ultra.trailsta.sh/#query=%5Bout:json%5D%5Btimeout:25%5D;%0A(%0A%20%20//%20Relation%201251066%20is%20COS%20boundary:%0A%20%20//%20https://www.openstreetmap.org/relation/1251066%0A%20%20rel(1251066);map_to_area-%3E.region;%0A%20%20way(area.region)%5B%22highway%22%5D%0A%20%20%5B%22oneway:bicycle%22=%22construction%22%5D-%3E.ways;%0A);%0A.ways%20out%20geom;%0A&amp;map=12.806603160923745/-33.885193/151.190393&amp;mode=run&amp;style=./style.json&amp;server=https://overpass-api.de/api/" target="_blank" rel="noopener" title=""><em>View/edit query</em></a></p>



<iframe frameborder="0" src="https://overpass-ultra.us/#map&amp;m=12.93/-33.8861/151.2048&amp;q=NoewrgLgXAVgziAdgXWBAlgWwKbmgJgFZkBuAKAAoyACagejuoCVsAbAQwyWoEYieADADYh1dHGoBhAPIBlagCNwiACbsATgE8oNeowAWECAAc4UBgHcrAOhDHsiOBHXZsETO2O31AczouOLkQ6PkJBEV0AilDwoQBKEg9jAH0IEGSNbHYAWgA+axcfdCRyWgt2TQpM9gLsIqQ44AAifXQffXLNJuRdZqRsTqgFdABjTRHWbCaAXiaRpCd1MBGg7rzrTrhyBLINiok8ah9cTHIgA" class="" allowfullscreen style="width:80vw;max-width:80vw;height:70vh"></iframe>



<h1 class="wp-block-heading" id="aioseo-potential-future-contraflow-streets">Potential future contraflow streets</h1>



<p>Below is an automated query of streets that are potential contraflow street candidates. As the data is automated there may be streets not suitable, such as circular one-way service roads. The intention of this queried data is to provide a helpful starting point, from which to filter for potential candidates, through use of the easily accessible, open source data. You can run the query yourself <a href="https://overpass-ultra.trailsta.sh/#query=%5Bout:json%5D%5Btimeout:25%5D;%0A(%0A%20%20//%20Relation%201251066%20is%20COS%20boundary:%0A%20%20//%20https://www.openstreetmap.org/relation/1251066%0A%20%20rel(1251066);map_to_area-%3E.region;%0A%20%20%0A%20%20//%20Select%20roads%0A%20%20way(area.region)%5B%22highway%22%5D%0A%20%20%0A%20%20//%20Only%20roads%20which%20are%20marked%20one%20way,%0A%20%20//%20and%20don't%20allow%20bicycle%20contraflow%0A%20%20%5B%22oneway%22=%22yes%22%5D%0A%20%20%5B%22oneway:bicycle%22!=%22no%22%5D%0A%20%20%0A%20%20//%20Exclude%20already%20approved%20contraflow%20lanes%0A%20%20%5B%22oneway:bicycle%22!=%22construction%22%5D%0A%20%20%0A%20%20//%20Excluded%20roads%20under%20construction%0A%20%20%5B%22highway%22!=%22construction%22%5D%0A%20%20%0A%20%20//%20Excluded%20proposed%20roads%0A%20%20%5B%22highway%22!=%22proposed%22%5D%0A%0A%20%20//%20Exclude%20driveways%0A%20%20%5B%22service%22!=%22driveway%22%5D%0A%20%20%0A%20%20//%20Don't%20include%20roads%20that%20are%20bidirectional,%0A%20%20//%20but%20are%20separated%20(and%20appear%20to%20be%20one%20way)%0A%20%20%5B%22dual_carriageway%22!=%22yes%22%5D%0A%20%20%0A%20%20//%20Don't%20include%20if%20a%20cycleway%20is%20already%20mapped%20as%20separate%0A%20%20%5B%22cycleway%22!=%22separate%22%5D%0A%20%20%5B%22cycleway:left%22!=%22separate%22%5D%0A%20%20%5B%22cycleway:right%22!=%22separate%22%5D%0A%20%20%0A%20%20//%20Don't%20include%20if%20a%20cycleway%20already%20present%0A%20%20%5B%22highway%22!=%22cycleway%22%5D%0A%20%20%0A%20%20//%20If%20a%20road%20is%20customers%20only%20it's%20likely%0A%20%20//%20in%20a%20parking%20lot%0A%20%20%5B%22access%22!=%22customers%22%5D%0A%20%20%0A%20%20//%20Don't%20include%20roads%20where%20public%20access%20not%20allowed%0A%20%20%5B%22access%22!=%22no%22%5D%0A%20%20%0A%20%20//%20Don't%20include%20link%20roads%20(on%20ramps/slip%20roads)%0A%20%20%5B%22highway%22!=%22motorway_link%22%5D%0A%20%20%5B%22highway%22!=%22primary_link%22%5D%0A%20%20%5B%22highway%22!=%22secondary_link%22%5D%0A%20%20%5B%22highway%22!=%22tertiary_link%22%5D%0A%20%20%0A%20%20//%20Don't%20include%20major%20roads%0A%20%20%5B%22highway%22!=%22primary%22%5D%0A%20%20%5B%22highway%22!=%22secondary%22%5D%0A%20%20%0A%20%20%0A%20%20%5B%22lanes%22!=2%5D%0A%20%20%5B%22lanes%22!=3%5D%0A%20%20%5B%22lanes%22!=4%5D%0A%20%20%5B%22lanes%22!=5%5D%0A%20%20%5B%22lanes%22!=6%5D%0A%20%20%0A%20%20%5B%22access%22!=%22private%22%5D%0A%20%20%0A%20%20//%20Don't%20consider%20parking%20isles%0A%20%20%5B%22service%22!=%22parking_aisle%22%5D%0A%20%20%0A%20%20%0A%20%20%0A%0A%20%20-%3E.ways;%0A);%0A%0A.ways%20out%20geom;&amp;map=12.690002411118027/-33.885683/151.184179&amp;mode=run&amp;style=./style.json&amp;server=https://overpass-api.de/api/">here</a> and modify it if desired. See the <a href="https://wiki.openstreetmap.org/wiki/Bicycle">wiki</a> for the available OSM tags relevant to bicycles to filter by.</p>



<p>You can read the full query on which roads are shown in the <a href="#query-contraflow-candidates" title="">appendix below</a>.</p>



<p><a href="https://overpass-ultra.trailsta.sh/#query=%5Bout:json%5D%5Btimeout:25%5D;%0A(%0A%20%20//%20Relation%201251066%20is%20COS%20boundary:%0A%20%20//%20https://www.openstreetmap.org/relation/1251066%0A%20%20rel(1251066);map_to_area-%3E.region;%0A%20%20%0A%20%20//%20Select%20roads%0A%20%20way(area.region)%5B%22highway%22%5D%0A%20%20%0A%20%20//%20Only%20roads%20which%20are%20marked%20one%20way,%0A%20%20//%20and%20don't%20allow%20bicycle%20contraflow%0A%20%20%5B%22oneway%22=%22yes%22%5D%0A%20%20%5B%22oneway:bicycle%22!=%22no%22%5D%0A%20%20%0A%20%20//%20Exclude%20already%20approved%20contraflow%20lanes%0A%20%20%5B%22oneway:bicycle%22!=%22construction%22%5D%0A%20%20%0A%20%20//%20Excluded%20roads%20under%20construction%0A%20%20%5B%22highway%22!=%22construction%22%5D%0A%20%20%0A%20%20//%20Excluded%20proposed%20roads%0A%20%20%5B%22highway%22!=%22proposed%22%5D%0A%0A%20%20//%20Exclude%20driveways%0A%20%20%5B%22service%22!=%22driveway%22%5D%0A%20%20%0A%20%20//%20Don't%20include%20roads%20that%20are%20bidirectional,%0A%20%20//%20but%20are%20separated%20(and%20appear%20to%20be%20one%20way)%0A%20%20%5B%22dual_carriageway%22!=%22yes%22%5D%0A%20%20%0A%20%20//%20Don't%20include%20if%20a%20cycleway%20is%20already%20mapped%20as%20separate%0A%20%20%5B%22cycleway%22!=%22separate%22%5D%0A%20%20%5B%22cycleway:left%22!=%22separate%22%5D%0A%20%20%5B%22cycleway:right%22!=%22separate%22%5D%0A%20%20%0A%20%20//%20Don't%20include%20if%20a%20cycleway%20already%20present%0A%20%20%5B%22highway%22!=%22cycleway%22%5D%0A%20%20%0A%20%20//%20If%20a%20road%20is%20customers%20only%20it's%20likely%0A%20%20//%20in%20a%20parking%20lot%0A%20%20%5B%22access%22!=%22customers%22%5D%0A%20%20%0A%20%20//%20Don't%20include%20roads%20where%20public%20access%20not%20allowed%0A%20%20%5B%22access%22!=%22no%22%5D%0A%20%20%0A%20%20//%20Don't%20include%20link%20roads%20(on%20ramps/slip%20roads)%0A%20%20%5B%22highway%22!=%22motorway_link%22%5D%0A%20%20%5B%22highway%22!=%22primary_link%22%5D%0A%20%20%5B%22highway%22!=%22secondary_link%22%5D%0A%20%20%5B%22highway%22!=%22tertiary_link%22%5D%0A%20%20%0A%20%20//%20Don't%20include%20major%20roads%0A%20%20%5B%22highway%22!=%22primary%22%5D%0A%20%20%5B%22highway%22!=%22secondary%22%5D%0A%20%20%0A%20%20%0A%20%20%5B%22lanes%22!=2%5D%0A%20%20%5B%22lanes%22!=3%5D%0A%20%20%5B%22lanes%22!=4%5D%0A%20%20%5B%22lanes%22!=5%5D%0A%20%20%5B%22lanes%22!=6%5D%0A%20%20%0A%20%20%5B%22access%22!=%22private%22%5D%0A%20%20%0A%20%20//%20Don't%20consider%20parking%20isles%0A%20%20%5B%22service%22!=%22parking_aisle%22%5D%0A%20%20%0A%20%20%0A%20%20%0A%0A%20%20-%3E.ways;%0A);%0A%0A.ways%20out%20geom;&amp;map=12.697702773132516/-33.891710/151.205788&amp;mode=run&amp;style=./style.json&amp;server=https://overpass-api.de/api/" target="_blank" rel="noopener" title=""><em>View/edit query</em></a></p>



<iframe frameborder="0" src="https://overpass-ultra.us/#map&amp;m=12.66/-33.8883/151.2104&amp;q=NoewrgLgXAVgziAdgXWBAlgWwKbmgJgFZkBuAKAAoyACagejuoCVsAbAQwyWoEYieADADYh1dHGoBhAPIBlagCNwiACbsATgE8oNeowAWECAAc4UBgHcrAOhDHsiOBHXZsETO2O31AczouOLkQ6PkJBEV0AilDwoQBKEg9jAH0IEGSNbHYAWgA+axcfdCRyWl0Galk2bABjCGp1EHYVOF0Ldk0KTPYC7CKkOOAAIn10H312zSHkXXLGaURWTQamluoLUZr9akzqD3UAa2wVaiRsdY6AGjmd1WoVJAByevZWVhALRXQazRrWc5qSGc7AAZu8LLphmdJkMALxDTTYODTSFDaEdKAKb6-f5DACE8MQIBRZVoFQAogAPP5gFTnV4uZrLTzGRoAN2O1EBiGBYI+1A4iCRqPR2ixPz+2Hx8O5TnUYDqxUQJOoNypNLpJ0azQkYFU2HUXKQcoVQVRo3GMIJQ1lzlNSpVauprFpnNZdhAcE52pa5rGEw60qG7uMnuOKKdGvOKnU6A5k1atGGXvUbO+UutMbj2BhM1JemoABEnvV0IgoysddQIPpODsXF8VOgXIqkK9rmTGApIPXzl7jBpOJyuncWVlDWlFOczhdNHFUSowK9kjUNLH2D4c4HrYjkXnVZ2iyWxOWXXSxCCdlycVvluIdqxGSplkl7Cd2BJ+4OINhURL-la8JfuoQ4qsM-63lA-wghAQbAaB+7gTekxQLG4ywda8E-o6h7FogzwnhW6CXuw16SpMD5PssrJIg4EB+pa24yshgb7jcACSJGVic941GATggDg6gSEgSxiBAjwSKw6BHEsNxlleA6HGWPgCiA9FJkM7A1DUSLItafECUJe6zLhx5lhWPoSBsBrnMYYAKNJNQ7DpenUESLxvB8xyotpulwPphLEmxZn4aWp6utQFrbHA9jeqsibUMMHiUrFrgqEGhACGBQwpWl4bWkI2WIbl7CpXFGXWgA7MVqJ5RVQYABy1fmFR4QRFlnucEB6kKrCJcMPWIH1Qa7jhBbteFFbSYgBzcRIFDcCBmCmHQcDScY83zpp0WAbl6kgOokzJDNBw5btTHBrG+yaCdZZnSVF1TJhtRIGoWh3bN53+ntP7qBgGi3ad41teZEXnh4MCHfNDEBs98KslggPfYx8NDF63LvVMIUHklQyCki0r4CVBOBQAzCT7BCoFAAslPU9KxCoqT0pCDjwx+XpQaI2yCGmRNx6yugdKGkpBwqWI63CppKZprp3MaOLiA+Bk4i4vueTWAm5AJGQZBax0Ik9pugkkEAA" class="" allowfullscreen style="width:80vw;max-width:80vw;height:70vh"></iframe>



<h2 class="wp-block-heading" id="aioseo-a-proposal-of-streets-that-may-be-suitable-contraflow-streets">A proposal of streets that may be suitable contraflow streets</h2>



<p>These are a non-exhaustive manual selection of streets from the above query (in no particular order). Some I have taken width measurements using Lidar on an iPhone.</p>



<p>I&#8217;ve excluded lanes that appear to be very narrow and lanes where an alternative is very close (eg. <a href="https://www.openstreetmap.org/way/247983348" title="">William Ln</a> &amp; <a href="https://www.openstreetmap.org/way/173855755" target="_blank" rel="noopener" title="">Corfu St</a>).</p>



<p>There may be errors or other reasons they aren&#8217;t suitable &#8211; any feedback or corrections is welcome in the comments below!</p>



<figure class="wp-block-table"><table><tbody><tr><td>Street</td><td>Suburb</td><td>Road width if known</td><td>Notes</td></tr><tr><td><a href="https://www.openstreetmap.org/way/173737067" target="_blank" rel="noopener" title="">Terry Street</a></td><td>Surry Hills</td><td>4.61m</td><td>&#8211; Laneway behind Metro Woolworths near central<br>&#8211; Would provide access from south Surry Hills to the Belmore Park cycleway (and further north into the city)<br>&#8211; Already marked as cycle route on the <a href="https://www.cityofsydney.nsw.gov.au/-/media/corporate/files/publications/lists-maps-inventories/sydney-cycling-map-z-card-2023_maponly.pdf?download=true" target="_blank" rel="noopener" title="">official City of Sydney cycling map</a><br>&#8211; A proposal for a living street exists, but would provide utility in the short term</td></tr><tr><td><a href="https://www.openstreetmap.org/way/173802601" target="_blank" rel="noopener" title="">Sophia Street</a></td><td>Surry Hills</td><td>4.9m</td><td>&#8211; Long laneway with excellent visibility<br>&#8211; Gradient towards eastern end<br>&#8211; No parking, a number of infrequently used driveways<br>&#8211; Great link from Fitzroy St via Riley St to lower Surry Hills</td></tr><tr><td><a href="https://www.openstreetmap.org/way/247778953" target="_blank" rel="noopener" title="">Boronia Lane</a></td><td>Surry Hills</td><td>?</td><td>&#8211; Already has contraflow marking for pedestrians<br>&#8211; Though already close to Boronia Street<br>&#8211; Excellent visibility (completely straight)</td></tr><tr><td><a href="https://www.openstreetmap.org/way/173802566" target="_blank" rel="noopener" title="">Lansdown Street</a></td><td>Surry Hills</td><td>?</td><td>&#8211; Car parking both sides<br>&#8211; Connects to Crown St<br>&#8211; Excellent visibility (completely straight)</td></tr><tr><td><a href="https://www.openstreetmap.org/way/176345603" target="_blank" rel="noopener" title="">Richards Lane</a> &amp; <a href="https://www.openstreetmap.org/way/173486822" target="_blank" rel="noopener" title="">Collins Lane</a></td><td>Surry Hills</td><td>Collins lane 2.25m</td><td>&#8211; Collins lane very narrow &#8211; perhaps narrow enough to ban cars<br>&#8211; Several speed cushions<br>&#8211; Great north/south alternative to Crown St<br>&#8211; Richards lane very suitable, even has coffee shops</td></tr><tr><td><a href="https://www.openstreetmap.org/way/173486830" target="_blank" rel="noopener" title="">Collins St</a></td><td>Surry Hills</td><td>?</td><td>&#8211; Shared zone connector at corner of The Clock hotel<br>&#8211; Very wide</td></tr><tr><td><a href="https://www.openstreetmap.org/way/7891657">Beaconsfield Lane</a> (north)</td><td>Beaconsfield</td><td>?</td><td>&#8211; Contraflow approved further south<br>&#8211; Has traffic calming</td></tr><tr><td><a href="https://www.openstreetmap.org/way/1095408755" target="_blank" rel="noopener" title="">Wynyard Lane</a></td><td>Sydney</td><td>?</td><td>&#8211; The laneway just next to Wynyard Station<br>&#8211; Would provide a north -&gt; south route for bikes avoiding York St, Carrington St buses and George St pedestrians</td></tr><tr><td><a href="https://www.openstreetmap.org/way/173543260" target="_blank" rel="noopener" title="">Mullins Street</a></td><td>Sydney</td><td>?</td><td>&#8211; Shared zone, 10kmh<br>&#8211; Has a nearby coffee shop</td></tr><tr><td><a href="https://www.openstreetmap.org/way/173802576" target="_blank" rel="noopener" title="">High Holborn St north of Lansdown St</a></td><td>Sydney</td><td>?</td><td>&#8211; Car parking both sides, good visibility<br>&#8211; South of Lansdown likely too narrow</td></tr><tr><td><a href="https://www.openstreetmap.org/way/414910231" target="_blank" rel="noopener" title="">Belvoir Street (near Elizabeth St)</a></td><td>Sydney</td><td>?</td><td>&#8211; Only one lane<br>&#8211; Car parking one side<br>&#8211; Hill but good visibility<br>&#8211; Good candidate for dedicated contraflow lane in future<br>&#8211; Good route from Belvoir St west to Crown St &#8211; no curb cut at Clisdell to Devonshire St</td></tr><tr><td><a href="https://www.openstreetmap.org/way/175379774" target="_blank" rel="noopener" title="">Shepherd Lane</a></td><td>Darlington</td><td>?</td><td>&#8211; Possibly too narrow, but good connection to WIlson St cycleway<br>&#8211; Low traffic alternative to Ivy Street</td></tr><tr><td><a href="https://www.openstreetmap.org/way/2949895" target="_blank" rel="noopener" title="">Dick St</a></td><td>Chippendale</td><td>?</td><td>&#8211; Continuous footpath east end<br>&#8211; Narrow with parking but lots of no parking spaces</td></tr><tr><td><a href="https://www.openstreetmap.org/way/173833485" target="_blank" rel="noopener" title="">Womerah Avenue</a></td><td>Darlinghurst</td><td>?</td><td>&#8211; Appears perfect but perhaps missing from previous batch</td></tr><tr><td><a href="https://www.openstreetmap.org/way/727724935" target="_blank" rel="noopener" title="">Bulwara Road</a></td><td>Ultimo</td><td>?</td><td>&#8211; Right outside library which has bike parking<br>&#8211; Shared zone<br>&#8211; Where narrow there is amble space on the side to duck out (at Quarry St)</td></tr></tbody></table></figure>



<h2 class="wp-block-heading" id="aioseo-other-notes">Other notes</h2>



<ul class="wp-block-list">
<li>Devonshire St would be very useful, but a paint &amp; sign treatment likely not sufficient</li>



<li>There are plenty of one way segments on the pedestrianised George St which would be perfect for cycling &#8211; the cycling situation on George St likely needs it&#8217;s own blog post</li>
</ul>



<h1 class="wp-block-heading" id="aioseo-appendix---all-the-overpass-turbo-queries">Appendix</h1>



<h2 class="wp-block-heading" id="aioseo-more-maps">More maps</h2>



<h3 class="wp-block-heading" id="aioseo-all-contraflow-permitting-streets">Contraflow permitting streets globally</h3>



<iframe frameborder="0" src="https://overpass-ultra.us/#run&amp;m=12.66/-33.8882/151.2053&amp;q=NoewrgLgXAVgziAdgXWBAlgWwKbmgJgFZkBuAKAAoyACagdwEMBPYAIiW0aagCN0BjJvwA22VgF5WiEK2QUA3vJ48QADwC+6gJTkdZPNRUATJuQB85A3ADW2YdQCOEEkA" class="" allowfullscreen style="width:80vw;max-width:80vw;height:70vh"></iframe>



<h3 class="wp-block-heading" id="aioseo-potential-future-contraflow-streets-outside-city-of-sydney">Potential future contraflow streets globally</h3>



<iframe frameborder="0" src="https://overpass-ultra.us/#run&amp;m=12.95/-33.8821/151.2114&amp;q=NoewrgLgXAVgziAdgXWBAlgWwKbmgJgFZkBuAKAAoACMqqgdwEMBPYAIgAt0BzDp5tslo06AelFUA8ogA2zKgCcQjACZwGXAMYcqjBdiqY9Aa2wqqSA-wA0w8bsTmVSAOQRdMmSHpUARuk1mTRkDTSQIBUYAMy96YXZLfjYAXjZmbDhBeLZElih-QODsNgBCVMQQLLo7CQBRAA9gsBUDRhl9VXlGAAdupQA3MyowxAjo2KoZRkQM7NzmfICgkNLUkbgIsE0MJCqRKnsGppbzJVV1MEdsBWGkDYUtncRsrl4ksrZ1ze30XaFqsR1RoyZpDPogbogOBDM5qF48PgsVZscGQ6EqLI1KhHEEtKgqBToQb8ODZaEKfoBYofAlE7BJf77ewAEVc7nQiGOBlh6ggHEY7j0Bn8KnQ+h+SDatkBfkgun0VGh3T0AqGFGm5h63WweioEBAfgMlgYLAAlNkVGA2gB9TR6QmMbj0pEfdKZRlY1mINxUDlc31RXTDZbO+TodRtDoqeRGXpDRjqJUqiDYbKFELvVJJyIpvbsdOhqAhKIQZHZ1V5z4h-hQQm8Usfcu5j0yr0+v24gzoQOMYNFfgeKPyPoZbCjeFvF1ratIlsHCQASR7imU5nDwzAGxAOAU6iQcl9EBc6hk6FMcixHKDyoUxg53EmIAg2UYmk0GUyH00m-1O-dwk9NlfU5TsV3ODRrgMbowF8U9NF0N8PyoCpBU8bwzBfRC4E-cpKjnFkgI7UEqFeHQ4G1GFV1JOh2CMepyOwMxkUIAAGSs6IYpiPgANjYxlaMYeiKIxD4AHY+OyDjhORAAOCSAXnKg23ZEDiIgS4ZhkaiqHYdTEE05E3T2QDvRU-1T0QYwwLUKgKCQRRGEwbo4FEOBT26ay4HNGjOARTM2EwJ8QAUfhrQs4xK1I-y+iwPRmDCjkIv43zJwERtsBGFQ4oSyzIr8qc2BTBQMGy8LjNbQjVLxIwYGCzyJ0RNLUhiowFAEZKooK6FMri8r9nYKYZhw-BksGjJVgAZlG6ZxrKAAWaahtWYhsjGnDuLndhX3fbDkRi-oK3wiRlNuRA4HQFobhvO9EAfcMQm09hyUpd89pMe9rUYe7ikZCgAG8-t8XwQHqABfUHTXIapIbIPA-BAaNyAAPnIOG4HPKgAEcIBIIA" class="" allowfullscreen style="width:80vw;max-width:80vw;height:70vh"></iframe>



<p></p>



<h2 class="wp-block-heading" id="aioseo-appendix---all-the-overpass-turbo-queries">All the Overpass queries!</h2>



<h3 class="wp-block-heading" id="aioseo-query-csv-of-possible">Query: CSV of candidates of contraflow lanes</h3>



<p><a href="https://overpass-turbo.eu/s/1ytu">https://overpass-turbo.eu/s/1ytu</a></p>



<p>Note:</p>



<ul class="wp-block-list">
<li>See the <a href="https://wiki.openstreetmap.org/wiki/Main_Page">OSM Wiki</a> for what tags mean</li>



<li>This is an automated query of open source data &#8211; there may be errors</li>
</ul>



<h3 class="wp-block-heading" id="aioseo-query-current-streets-allowing-bicycle-contraflow">Query: Current streets allowing bicycle contraflow</h3>



<pre id="block-1cbbb417-55ed-4633-85c6-89cc6dc71d2e" class="wp-block-code"><code>&#91;out:json];
(
  // Relation 1251066 is COS boundary:
  // https://www.openstreetmap.org/relation/1251066
  rel(1251066);map_to_area-&gt;.region;
  way(area.region)&#91;"highway"]
  &#91;"oneway:bicycle"="no"]-&gt;.ways;
);
.ways out geom;
</code></pre>



<h3 class="wp-block-heading" id="aioseo-query-streets-that-cos-will-turn-into-contraflow">Query: Streets that CoS will turn into contraflow</h3>



<pre class="wp-block-code"><code>
&#91;out:json];
(
  // Relation 1251066 is COS boundary:
  // https://www.openstreetmap.org/relation/1251066
  rel(1251066);map_to_area-&gt;.region;
  way(area.region)&#91;"highway"]
  &#91;"oneway:bicycle"="construction"]-&gt;.ways;
);
.ways out geom;
</code></pre>



<p></p>



<h3 class="wp-block-heading" id="query-contraflow-candidates">Query: Potential future contraflow streets</h3>



<pre class="wp-block-code"><code>&#91;out:json]&#91;timeout:25];
(
  // Relation 1251066 is COS boundary:
  // https://www.openstreetmap.org/relation/1251066
  rel(1251066);map_to_area-&gt;.region;
  
  // Select roads
  way(area.region)&#91;"highway"]
  
  // Only roads which are marked one way,
  // and don't allow bicycle contraflow
  &#91;"oneway"="yes"]
  &#91;"oneway:bicycle"!="no"]
  
  // Exclude already approved contraflow lanes
  &#91;"oneway:bicycle"!="construction"]
  
  // Excluded roads under construction
  &#91;"highway"!="construction"]
  
  // Excluded proposed roads
  &#91;"highway"!="proposed"]

  // Exclude driveways
  &#91;"service"!="driveway"]
  
  // Don't include roads that are bidirectional,
  // but are separated (and appear to be one way)
  &#91;"dual_carriageway"!="yes"]
  
  // Don't include if a cycleway is already mapped as separate
  &#91;"cycleway"!="separate"]
  &#91;"cycleway:left"!="separate"]
  &#91;"cycleway:right"!="separate"]
  
  // Don't include if a cycleway already present
  &#91;"highway"!="cycleway"]
  
  // If a road is customers only it's likely
  // in a parking lot
  &#91;"access"!="customers"]
  
  // Don't include roads where public access not allowed
  &#91;"access"!="no"]
  
  // Don't include link roads (on ramps/slip roads)
  &#91;"highway"!="motorway_link"]
  &#91;"highway"!="primary_link"]
  &#91;"highway"!="secondary_link"]
  &#91;"highway"!="tertiary_link"]
  
  // Don't include major roads
  &#91;"highway"!="primary"]
  &#91;"highway"!="secondary"]
  
  
  &#91;"lanes"!=2]
  &#91;"lanes"!=3]
  &#91;"lanes"!=4]
  &#91;"lanes"!=5]
  &#91;"lanes"!=6]
  
  &#91;"access"!="private"]
  
  // Don't consider parking isles
  &#91;"service"!="parking_aisle"]
  
  
  

  -&gt;.ways;
);

.ways out geom;</code></pre>



<h3 class="wp-block-heading" id="aioseo-query-all-streets-with-bicycle-contraflow-allowed-including-outside-city-of-sydney-council">Query: All streets with bicycle contraflow allowed, including outside City of Sydney council</h3>



<pre class="wp-block-code"><code>&#91;out:json]&#91;timeout:25];
(
  way&#91;"highway"]
 
  &#91;"oneway:bicycle"="no"]
  
  ({{bbox}});
);
out body;
&gt;;
out skel qt;</code></pre>



<h2 class="wp-block-heading" id="aioseo-other-useful-data">Other useful data</h2>



<h3 class="wp-block-heading" id="aioseo-ethans-sydney-bike-map">Ethan&#8217;s Sydney Bike Map</h3>



<p>One of the best OpenStreetMap powered maps of cycling infrastrure, including proposed and under construction paths: <a href="https://sydneybikemap.ethan.link/#map=13.46/-33.88198/151.20113">https://sydneybikemap.ethan.link/</a></p>



<iframe frameborder="0" src="https://sydneybikemap.ethan.link/#map=13.46/-33.88198/151.20113" class="" style="width:100%;max-width:100%;height:70vh"></iframe>



<h1 class="wp-block-heading" id="aioseo-further-work">Possible further work</h1>



<ul class="wp-block-list">
<li>Categorising sightlines of road segments computationally to narrow down the list of possible candidates</li>



<li>Creating an Overpass Turbo query of manual candidates</li>
</ul>



<p></p>



<p></p>



<p></p>



<p></p>



<p></p><p>The post <a href="https://jakecoppinger.com/2023/08/contraflow-streets-in-the-city-of-sydney/">Contraflow streets in the City of Sydney</a> first appeared on <a href="https://jakecoppinger.com">Jake Coppinger</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://jakecoppinger.com/2023/08/contraflow-streets-in-the-city-of-sydney/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Mapping pedestrian traffic light timing in Sydney, Australia</title>
		<link>https://jakecoppinger.com/2023/06/mapping-pedestrian-traffic-light-timing-in-sydney-australia/</link>
					<comments>https://jakecoppinger.com/2023/06/mapping-pedestrian-traffic-light-timing-in-sydney-australia/#comments</comments>
		
		<dc:creator><![CDATA[Jake C]]></dc:creator>
		<pubDate>Mon, 12 Jun 2023 13:38:32 +0000</pubDate>
				<category><![CDATA[Cycling]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Maps]]></category>
		<category><![CDATA[Side project]]></category>
		<category><![CDATA[Sydney]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[Urbanism]]></category>
		<category><![CDATA[betterstreets]]></category>
		<category><![CDATA[city of sydney]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[maps]]></category>
		<category><![CDATA[measurement]]></category>
		<category><![CDATA[nsw]]></category>
		<category><![CDATA[openstreetmap]]></category>
		<category><![CDATA[OSM]]></category>
		<category><![CDATA[pedestrian]]></category>
		<category><![CDATA[sydney]]></category>
		<category><![CDATA[TfNSW]]></category>
		<category><![CDATA[traffic]]></category>
		<category><![CDATA[transport]]></category>
		<guid isPermaLink="false">https://jakecoppinger.com/?p=735</guid>

					<description><![CDATA[<p>Better Intersections is a tool to record and visualise timing details for pedestrian and bicycle signals. In the absence of traffic light timing data, and as we hold hope for it to become publicly available; the aim of Better Intersections is to crowdsource measurements and inform where positive changes could be made.</p>
<p>The post <a href="https://jakecoppinger.com/2023/06/mapping-pedestrian-traffic-light-timing-in-sydney-australia/">Mapping pedestrian traffic light timing in Sydney, Australia</a> first appeared on <a href="https://jakecoppinger.com">Jake Coppinger</a>.</p>]]></description>
										<content:encoded><![CDATA[<p><strong><em>See my follow up blog post, going into detail on previously unreleased maps, how it costs $200 to buy data on a single intersection from TfNSW, comparisons with best practice and more: <a href="https://jakecoppinger.com/2023/07/shining-a-light-on-the-traffic-signals-of-sydney/" target="_blank" rel="noopener" title="">Shining a Light on the Traffic Signals of Sydney (Jul 2023)</a></em></strong></p>



<p><em>See comments below, on <a href="https://aus.social/@jakecoppinger/110534074238406726" target="_blank" rel="noopener" title="">Mastodon</a>, <a href="https://news.ycombinator.com/item?id=36302303" target="_blank" rel="noopener" title="">Hacker News (51 comments)</a></em>, or <a href="https://www.linkedin.com/posts/jakecoppinger_mapping-pedestrian-traffic-light-timing-in-activity-7074143330825068544-V_ze" target="_blank" rel="noopener" title="">LinkedIn (22 comments, 278 likes, 32k views)</a></p>



<p><a href="https://en.wikipedia.org/wiki/Transport_for_NSW" target="_blank" rel="noreferrer noopener">Transport for NSW</a>, the government agency which controls traffic signal timing in Sydney and elsewhere in NSW, has an excellent <a href="https://www.future.transport.nsw.gov.au/future-transport-plans/active-transport-strategy" target="_blank" rel="noreferrer noopener">stated</a> goal of increasing walking and cycling trips &#8211; and reducing pedestrian wait times at intersections.</p>



<p>However, there is <em><strong>no public data on traffic light timing in Sydney or NSW</strong></em>.</p>



<p>In the absence of traffic light timing data, and as we hold hope for it to become publicly available; the aim of <a href="https://betterintersections.jakecoppinger.com/" target="_blank" rel="noopener" title="">Better Intersections</a> is to crowdsource measurements and inform where positive changes could be made. You can add data yourself via a <a href="https://betterintersections.jakecoppinger.com/about" target="_blank" rel="noopener" title="">simple Google Form</a>, and instructions are <a href="https://betterintersections.jakecoppinger.com/about" target="_blank" rel="noopener" title="">on the website about page</a>.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1776" height="1874" src="https://jakecoppinger.com/wp-content/uploads/2023/06/betterintersections-screenshot.png" alt="" class="wp-image-745" srcset="https://jakecoppinger.com/wp-content/uploads/2023/06/betterintersections-screenshot.png 1776w, https://jakecoppinger.com/wp-content/uploads/2023/06/betterintersections-screenshot-284x300.png 284w, https://jakecoppinger.com/wp-content/uploads/2023/06/betterintersections-screenshot-970x1024.png 970w, https://jakecoppinger.com/wp-content/uploads/2023/06/betterintersections-screenshot-768x810.png 768w, https://jakecoppinger.com/wp-content/uploads/2023/06/betterintersections-screenshot-1456x1536.png 1456w" sizes="auto, (max-width: 1776px) 100vw, 1776px" /><figcaption class="wp-element-caption">Screenshot of <a href="https://betterintersections.jakecoppinger.com" target="_blank" rel="noreferrer noopener">betterintersections.jakecoppinger.com</a></figcaption></figure>


<div id="mc_embed_shell"><style type="text/css">
        #mc_embed_signup{background:#fff; false;clear:left; font:14px Helvetica,Arial,sans-serif; width: 600px;}<br />
        /* Add your own Mailchimp form style overrides in your site stylesheet or in this style block.<br />
           We recommend moving this block and the preceding CSS link to the HEAD of your HTML file. */<br />
</style>
<div id="mc_embed_signup"><form id="mc-embedded-subscribe-form" class="validate" action="https://jakecoppinger.us17.list-manage.com/subscribe/post?u=3c1bd4fc8fca6648af03e916a&amp;id=ad49243f2c&amp;f_id=00d3e4e3f0" method="post" name="mc-embedded-subscribe-form" target="_blank">
<div id="mc_embed_signup_scroll">
<h2><a href="http://eepurl.com/hemS9j" target="_blank" rel="noopener">Subscribe to Jake&#8217;s blog</a></h2>
Email notifications of new blog posts are infrequent, brief, and plain text.

</div>
</form></div>
</div>


<h2 class="wp-block-heading">Table of Contents</h2>



<div class="wp-block-aioseo-table-of-contents"><ul><li><a href="#aioseo-why-does-the-timing-of-pedestrian-signals-matter">Why does the timing of pedestrian signals matter?</a></li><li><a href="#aioseo-but-isnt-traffic-light-timing-variable">But isn&#x27;t traffic light timing variable?</a></li><li><a href="#aioseo-technical-details">Technical details</a></li><li><a href="#aioseo-possible-further-work">Possible further work</a></li><li><a href="#aioseo-related-organisations">Related organisations</a></li></ul></div>



<p>Better Intersections is a tool to record and visualise timing details for pedestrian and bicycle signals. It&#8217;s focused on Sydney &amp; NSW, Australia, but is adaptable for anywhere in the world. This website is open source on <a href="https://github.com/jakecoppinger/better-intersections" target="_blank" rel="noreferrer noopener">Github</a> (contributions welcome!), and the <a href="https://docs.google.com/spreadsheets/d/1L08GNolPYjiRwLOL2d3lAZPqwCNe5vGr6SAOtH7hnNM/edit?usp=sharing" target="_blank" rel="noopener" title="">data</a> is under an open license (<a href="https://opendatacommons.org/licenses/odbl/">ODbL</a> license).</p>



<p>If you have ideas for improvements, please create a <a href="https://github.com/jakecoppinger/better-intersections" target="_blank" rel="noreferrer noopener">Github issue</a>, comment below, email me at <a href="mailto:jake@jakecoppinger.com">jake@jakecoppinger.com</a> or message me on <a href="https://aus.social/@jakecoppinger" target="_blank" rel="noreferrer noopener">Mastodon (@jakecoppinger@aus.social)</a>.</p>



<p>It&#8217;s a work in progress! I&#8217;ve tinkered on it for a few afternoons and started working on it about two weeks ago.</p>



<p>This website bridges the excellent TfNSW Active Transport policy guidelines and pedestrians on the street themselves, allowing people on foot (and bicycle) to see their experience represented.</p>



<figure class="wp-block-image alignwide size-full"><img loading="lazy" decoding="async" width="1906" height="2112" src="https://jakecoppinger.com/wp-content/uploads/2023/06/Screen-Shot-2023-06-07-at-22.14.29.png" alt="" class="wp-image-739" srcset="https://jakecoppinger.com/wp-content/uploads/2023/06/Screen-Shot-2023-06-07-at-22.14.29.png 1906w, https://jakecoppinger.com/wp-content/uploads/2023/06/Screen-Shot-2023-06-07-at-22.14.29-271x300.png 271w, https://jakecoppinger.com/wp-content/uploads/2023/06/Screen-Shot-2023-06-07-at-22.14.29-924x1024.png 924w, https://jakecoppinger.com/wp-content/uploads/2023/06/Screen-Shot-2023-06-07-at-22.14.29-768x851.png 768w, https://jakecoppinger.com/wp-content/uploads/2023/06/Screen-Shot-2023-06-07-at-22.14.29-1386x1536.png 1386w, https://jakecoppinger.com/wp-content/uploads/2023/06/Screen-Shot-2023-06-07-at-22.14.29-1848x2048.png 1848w" sizes="auto, (max-width: 1906px) 100vw, 1906px" /><figcaption class="wp-element-caption">Detailed view of intersection (<a href="https://betterintersections.jakecoppinger.com/intersection/node/4054127218" target="_blank" rel="noopener" title="">betterintersections.jakecoppinger.com/intersection/node/4054127218</a>)</figcaption></figure>



<h1 class="wp-block-heading" id="aioseo-why-does-the-timing-of-pedestrian-signals-matter">Why does the timing of pedestrian signals matter?</h1>



<p><a target="_blank" rel="noreferrer noopener" href="https://en.wikipedia.org/wiki/Transport_for_NSW">Transport for NSW</a>, the government agency which controls traffic signal timing in Sydney and elsewhere in NSW, has an excellent <a target="_blank" rel="noreferrer noopener" href="https://www.future.transport.nsw.gov.au/future-transport-plans/active-transport-strategy">stated</a> goal of increasing walking and cycling trips &#8211; and reducing pedestrian wait times at intersections.</p>



<p>However, there is <em><strong>no public data on traffic light timing in Sydney or NSW</strong></em>.</p>



<p>In the absence of traffic light timing data, and as we hold hope for it to become publicly available; the aim of this project is to crowdsource measurements and inform where positive changes could be made.</p>



<p>This website bridges the excellent TfNSW Active Transport policy guidelines and pedestrians on the street themselves, allowing people on foot (and bicycle) to see their experience represented.</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Increasing pedestrian priority and providing crossing opportunities at the right locations and along desire lines, reduces the risk of pedestrian injury at intersections by encouraging safer behaviours. Transport is currently rolling out measures at intersections to improve pedestrian priority in areas of high pedestrian activity. These measures may include automation of pedestrian crossings, <strong>reduced pedestrian wait times</strong>, provision of pedestrian crossings on missing legs and kerb ramps, where applicable.</p>
</blockquote>



<p>— <a target="_blank" rel="noreferrer noopener" href="https://www.future.transport.nsw.gov.au/sites/default/files/2022-12/Active_transport_strategy_0.pdf">TfNSW Active Transport Strategy, page 30.</a> Emphasis added.</p>



<p>Research has shown that 30 seconds is the longest a pedestrian will wait at a signalised crossings before attempting to cross against the &#8216;red man&#8217;. (<a target="_blank" rel="noreferrer noopener" href="http://content.tfl.gov.uk/factors-influencing-pedestrian-safety-literature-review.pdf">Martin, A., 2006. Factors influencing pedestrian safety: a literature review (No. PPR241). Wokingham, Berks: TRL (Transport for London.</a>)</p>



<p>From the above report:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Hunt, Lyons and Parker (2000) state that &#8216;Although no clear relationship has been established between pedestrian delay and casualties, <strong>a more balanced and responsive approach to the allocation of time at Pelican/Puffin crossings has the potential to make a substantial contribution to a decrease in pedestrian casualties as well as improving pedestrian amenity&#8217;.</strong> They point out that because pedestrians are more likely to become impatient when a red man continues to be shown during periods of low vehicle flow, the reduction of unnecessary delay for pedestrians should encourage pedestrians to use crossings correctly and reduce risk taking.</p>
</blockquote>



<p>In 2020, people driving vehicles killed 138 pedestrians on Australian roads (<a href="https://www.roadsafety.gov.au/nrss/fact-sheets/vulnerable-road-users">Department of Infrastructure, Transport, Regional Development and Communications (2021) Fact sheet: Vulnerable road users, National Road Safety Strategy.</a>)</p>



<h1 class="wp-block-heading" id="aioseo-but-isnt-traffic-light-timing-variable">But isn&#8217;t traffic light timing variable?</h1>



<p>Sydney uses a system called <a href="https://en.wikipedia.org/wiki/Sydney_Coordinated_Adaptive_Traffic_System">Sydney Coordinated Adaptive Traffic System (SCATS)</a> to control traffic signals, which makes use of many data feeds to control timing data.</p>



<p>Neither the inputs used, or the algorithm used to weigh the input data is public (as far as I know). This crowdsourced method of discrete measurements provides shows the output of the black box. In the case of outliers, multiple measurements (at different times of day/week) can be used to determine if the timing is variable.</p>



<p><a href="https://www.gehlpeople.com/" target="_blank" rel="noopener" title="">Gehl Architects</a> have a great methodology for measuring the overall impact of traffic light delays on pedestrians. At its most basic you walk along a street with two stopwatches;</p>



<ul class="wp-block-list">
<li>one you pause only when you&#8217;re walking;</li>



<li>one you pause only when you&#8217;re waiting at a traffic light.</li>
</ul>



<p>Divide one by the other at the end, and you have a single number that quantifies pedestrian delay walking along a street.</p>



<figure class="wp-block-image"><img decoding="async" src="https://betterintersections.jakecoppinger.com/img/gehl-methodology.png" alt=""/></figure>



<p>&#8211; <a target="_blank" rel="noreferrer noopener" href="https://www.cityofsydney.nsw.gov.au/surveys-case-studies-reports/public-spaces-public-life-studies">Public spaces &amp; public life: Sydney 2020, Gehl Architects, pg 142</a></p>



<p>The limitations of this method are that</p>



<ul class="wp-block-list">
<li>it cannot inform the exact problematic intersections;</li>



<li>paths must be long enough to gather a large enough sample size to be statistically significant.</li>
</ul>



<p>I&#8217;ve experimented with automating this method by recording a GPX (GPS) trace with a phone, uploading that file and getting a number instantly. Unfortunately the urban canyon effect (GPS signal loss caused by tall buildings) makes this method unreliable in cities, even with the remarkable sensor fusion on modern phones.</p>



<p>As with any of my projects, I am always open to collaboration. If you have any ideas, iterations or improvements, please drop me a line!</p>



<h1 class="wp-block-heading" id="aioseo-technical-details">Technical details</h1>



<p>This is a fairly simple Typescript app created using <code>Create React App</code> that I built in a few afternoons &#8211; please don&#8217;t consider it my finest code!</p>



<p>It is a static React app hosted on Cloudflare pages, and uses Mapbox GL JS to display the map (but could be easily updated to use Maplibre GL JS).</p>



<p>Google Sheets is treated as a backend (for simplicity using a Google Form for submissions), and the app makes use of OpenStreetMap node IDs as primary keys for intersections. This is definitely suboptimal but it&#8217;s quick to build &#8211; ideally I&#8217;d have a more custom form that is easier to use and doesn&#8217;t require a Google account &#8211; however using Google accounts for the form is a quick and easy method of minimising spam (and making it easy to identify) remove spam from a single person).</p>



<p>The OpenStreetMap API is used for looking up coordinates of OSM nodes and finding adjacent ways. There is currently one request per intersection made &#8211; this will not scale and I&#8217;ll likely need to cache the JSON (or hit an Overpass Turbo server instead).</p>



<p>The code is fully covered by Typescript types but doesn&#8217;t (yet?) have unit tests &#8211; it&#8217;s very easy to work with if you&#8217;re interested in tinkering with it!</p>



<h1 class="wp-block-heading" id="aioseo-possible-further-work">Possible further work</h1>



<ul class="wp-block-list">
<li>Adding a simplified version of the form</li>



<li>Support OSM ways as the primary key rather than just nodes (useful for crossings across divided carriageways with multiple traffic light nodes per crossing leg)</li>



<li>Tagging state roads and looking if these have longer wait times on average (probably)</li>



<li>Scatter plot of crossing times vs number of lanes (as rough proxy for traffic volume)</li>



<li>&#8220;sparkline&#8221; or other graphs of measurements for a given intersection</li>



<li>Thinking about how to record relationships between intersections (ie. green wave/lack of green wave for pedestrians)
<ul class="wp-block-list">
<li>Using YOLOv3 or another off the shelf commodity computer vision model for recognising green/flashing red/red traffic lights for algorithm measuring cycle times</li>
</ul>
</li>
</ul>



<h1 class="wp-block-heading" id="aioseo-related-organisations">Related organisations</h1>



<p>If you support better conditions for pedestrians and cyclists in Sydney/NSW, consider joining <a href="https://www.betterstreets.info/" target="_blank" rel="noopener" title="">BetterStreets</a> or <a href="https://30please.org/" target="_blank" rel="noopener" title="">30 Please</a>.</p>



<p></p><p>The post <a href="https://jakecoppinger.com/2023/06/mapping-pedestrian-traffic-light-timing-in-sydney-australia/">Mapping pedestrian traffic light timing in Sydney, Australia</a> first appeared on <a href="https://jakecoppinger.com">Jake Coppinger</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://jakecoppinger.com/2023/06/mapping-pedestrian-traffic-light-timing-in-sydney-australia/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>Generating aerial imagery with your iPhone&#8217;s LiDAR sensor</title>
		<link>https://jakecoppinger.com/2023/03/generating-aerial-imagery-with-your-iphones-lidar-sensor/</link>
					<comments>https://jakecoppinger.com/2023/03/generating-aerial-imagery-with-your-iphones-lidar-sensor/#comments</comments>
		
		<dc:creator><![CDATA[Jake C]]></dc:creator>
		<pubDate>Mon, 13 Mar 2023 21:00:00 +0000</pubDate>
				<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Maps]]></category>
		<category><![CDATA[Sydney]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[Urbanism]]></category>
		<category><![CDATA[3d scanner app]]></category>
		<category><![CDATA[geotiff]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[lidar]]></category>
		<category><![CDATA[odm]]></category>
		<category><![CDATA[openaerialmap]]></category>
		<category><![CDATA[opendronemap]]></category>
		<category><![CDATA[openstreetmap]]></category>
		<category><![CDATA[orthoimagery]]></category>
		<category><![CDATA[orthophoto]]></category>
		<category><![CDATA[OSM]]></category>
		<category><![CDATA[polycam]]></category>
		<category><![CDATA[qgis]]></category>
		<category><![CDATA[raster]]></category>
		<category><![CDATA[sydney]]></category>
		<guid isPermaLink="false">https://jakecoppinger.com/?p=495</guid>

					<description><![CDATA[<p>This technical guide details how you can create your own aerial imagery and 3D models of streets with the built in iPhone LiDAR sensor and open source tools in the OpenDroneMap package.</p>
<p>The post <a href="https://jakecoppinger.com/2023/03/generating-aerial-imagery-with-your-iphones-lidar-sensor/">Generating aerial imagery with your iPhone’s LiDAR sensor</a> first appeared on <a href="https://jakecoppinger.com">Jake Coppinger</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>This technical guide details how you can create your own aerial imagery (aka satellite view/<a href="https://twitter.com/btaylor/status/1099370126678253569" target="_blank" rel="noreferrer noopener">bird mode</a>/orthorectified imagery) and 3D models of streets with the built in iPhone LiDAR sensor (iPhone Pro 12 or later, 2020+ iPad Pro) and open source tools in the <a href="https://www.opendronemap.org/" target="_blank" rel="noopener" title="">OpenDroneMap</a> package. All you need to do to capture the model is walk around with your iPhone at ground level.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="683" src="https://jakecoppinger.com/wp-content/uploads/2023/03/id-editor-open-aerial-map-1024x683.jpg" alt="" class="wp-image-534" srcset="https://jakecoppinger.com/wp-content/uploads/2023/03/id-editor-open-aerial-map-1024x683.jpg 1024w, https://jakecoppinger.com/wp-content/uploads/2023/03/id-editor-open-aerial-map-300x200.jpg 300w, https://jakecoppinger.com/wp-content/uploads/2023/03/id-editor-open-aerial-map-768x513.jpg 768w, https://jakecoppinger.com/wp-content/uploads/2023/03/id-editor-open-aerial-map-1536x1025.jpg 1536w, https://jakecoppinger.com/wp-content/uploads/2023/03/id-editor-open-aerial-map-2048x1367.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>The pedestrianised Margaret Street, Sydney with temporary treatment. Imagery captured with a handheld iPhone 14 Pro. Imagery at <a href="https://map.openaerialmap.org/#/-18.6328125,18.562947442888312,3/latest/" target="_blank" rel="noopener" title="">https://map.openaerialmap.org/#/-18.6328125,18.562947442888312,3/latest/</a></figcaption></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="682" src="https://jakecoppinger.com/wp-content/uploads/2023/03/image-1024x682.png" alt="" class="wp-image-529" srcset="https://jakecoppinger.com/wp-content/uploads/2023/03/image-1024x682.png 1024w, https://jakecoppinger.com/wp-content/uploads/2023/03/image-300x200.png 300w, https://jakecoppinger.com/wp-content/uploads/2023/03/image-768x511.png 768w, https://jakecoppinger.com/wp-content/uploads/2023/03/image-1536x1022.png 1536w, https://jakecoppinger.com/wp-content/uploads/2023/03/image.png 1600w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Image by City of Sydney. The George Street Pride flag project is part of the NSW Government’s Streets as Shared Spaces program. <a href="https://www.cityofsydney.nsw.gov.au/improving-streets-public-spaces/closure-george-street-north" target="_blank" rel="noopener" title="">https://www.cityofsydney.nsw.gov.au/improving-streets-public-spaces/closure-george-street-north</a></figcaption></figure>



<div class="wp-block-aioseo-table-of-contents"><ul><li><a href="#aioseo-why-and-how">Why is this useful?</a></li><li><a href="#aioseo-overview">Process overview</a></li><li><a href="#aioseo-capturing-the-model">Capturing the model</a></li><li><a href="#aioseo-exporting-and-preparing-the-model">Exporting and preparing the model</a><ul><li><a href="#aioseo-rotating-the-model-into-the-correct-orientation">Rotating the model into the correct orientation (required for 3d Scanner App)</a></li></ul></li><li><a href="#aioseo-generating-the-raster-orthophoto">Generating the raster orthophoto</a><ul><li><a href="#aioseo-installing-webodm-locally">Installing WebODM locally</a></li><li><a href="#aioseo-copying-the-textured-object-into-the-odm-docker-container">Copying the object into the ODM Docker container</a></li><li><a href="#aioseo-running-odm_orthophoto">Running odm_orthophoto</a></li><li><a href="#aioseo-exporting-the-orthophoto-out-of-the-docker-container">Exporting the orthophoto out of the Docker container</a></li></ul></li><li><a href="#aioseo-georeferencing-the-orthophoto">Georeferencing the orthophoto</a><ul><li><a href="#aioseo-export-georeferenced-geotiff-without-worldfile">Export geo-referenced GeoTIFF (without worldfile)</a></li></ul></li><li><a href="#aioseo-uploading-to-openaerialmap">Uploading to OpenAerialMap</a></li><li><a href="#aioseo-limitations">Limitations</a></li><li><a href="#aioseo-future-work">Future work</a></li></ul></div>



<h1 class="wp-block-heading" id="aioseo-why-and-how">Why is this useful?</h1>



<p>Usually for such a task you would use a drone and process with <a href="https://opendronemap.org/webodm/" target="_blank" rel="noopener" title="">WebODM</a> (or <a href="https://www.pix4d.com/" target="_blank" rel="noopener" title="">Pix4D</a>), but there are areas that are unsafe or illegal to fly in. I&#8217;ve previously detailed how to generate imagery <a href="https://jakecoppinger.com/2022/12/creating-aerial-imagery-with-a-bike-helmet-camera-and-opendronemap/" target="_blank" rel="noopener" title="">using a bicycle helmet mounted GoPro camera</a>, however this can include artifacts where there are lots of people. The helmet camera method requires a decent GPS lock (unsuitable indoors, urban areas or under a bridge) and has relatively low detail.</p>



<p>Again, why might you want to do this? With your own high detail and up-to-date models and street imagery you could:</p>



<ul class="wp-block-list"><li>Map new street interventions, like bollards, modal filters or raised crossings</li><li>Record pothole locations (and their depth!)</li><li>Take measurements such as road and cycleway widths around crowds of people in urban centres</li><li>Measure footpath obstructions in 3D and rate pedestrian amenity</li><li>Survey features underneath large highways</li><li>Survey street parking using the new OSM spec: <a href="https://wiki.openstreetmap.org/wiki/Street_parking" target="_blank" rel="noreferrer noopener">wiki.openstreetmap.org/wiki/Street_parking</a></li><li>Map indoor pedestrian areas in OpenStreetMap for better pedestrian routing<ul><li>The Transport for NSW Connected Journeys Data team is currently doing a fair bit of this work: <a href="https://www.openstreetmap.org/changeset/133107592" target="_blank" rel="noopener" title="">https://www.openstreetmap.org/changeset/133107592</a></li></ul></li><li>Attach your iPhone to your bike and generate LiDAR point clouds of the kerb and cycleway infrastructure (it works, just go slow!)</li></ul>



<p>This method results in very high detail (5mm resolution if desired) 3D models and accurate orthoimagery. Manual georeferencing is required (which I also explain how to do) which limits the confidence in alignment. This is a proof of concept &#8211; if you have corrections/suggestions/ideas to improve the method, please comment below or on Mastodon!</p>



<p>Note: This method also provides a solution to <a href="https://community.opendronemap.org/t/creating-2-5d-oblique-orthophoto/13579">creating 2.5D oblique orthophotos</a> from drone imagery.</p>


<div id="mc_embed_shell"><style type="text/css">
        #mc_embed_signup{background:#fff; false;clear:left; font:14px Helvetica,Arial,sans-serif; width: 600px;}<br />
        /* Add your own Mailchimp form style overrides in your site stylesheet or in this style block.<br />
           We recommend moving this block and the preceding CSS link to the HEAD of your HTML file. */<br />
</style>
<div id="mc_embed_signup"><form id="mc-embedded-subscribe-form" class="validate" action="https://jakecoppinger.us17.list-manage.com/subscribe/post?u=3c1bd4fc8fca6648af03e916a&amp;id=ad49243f2c&amp;f_id=00d3e4e3f0" method="post" name="mc-embedded-subscribe-form" target="_blank">
<div id="mc_embed_signup_scroll">
<h2><a href="http://eepurl.com/hemS9j" target="_blank" rel="noopener">Subscribe to Jake&#8217;s blog</a></h2>
Email notifications of new blog posts are infrequent, brief, and plain text.

</div>
</form></div>
</div>


<h1 class="wp-block-heading" id="aioseo-overview">Process overview</h1>



<p>This guide covers how to:</p>



<ul class="wp-block-list"><li>Capture a 3D model using <a href="https://3dscannerapp.com/" target="_blank" rel="noopener" title="">3d Scanner App</a> (recommended) or <a href="https://poly.cam/" target="_blank" rel="noopener" title="">Polycam</a><ul><li>The iPhone LiDAR sensor has 5 metres max range, so you&#8217;ll need to walk around</li></ul></li><li>Export the model to an <code>.obj</code> file with textures</li><li>Rotating the model in Blender to the required orientation</li><li>Use the <code>odm_orthophoto</code> program inside the OpenDroneMap Docker container to generate a raster <code>.tiff</code></li><li>Georeference the tiff using QGIS</li><li>Uploading the Geotiff to OpenAerialMap to generate a tileset, viewable in the OpenStreetMap <a href="https://github.com/openstreetmap/iD" target="_blank" rel="noopener" title="">iD editor</a> or a Felt map with a custom layer</li></ul>



<h1 class="wp-block-heading" id="aioseo-capturing-the-model">Capturing the model</h1>



<p>Capturing a 3D model on an supported iPhone is easy. I recommend using the app titled <code>3d Scanner App</code> as it allows considerable customisation of the scan settings. It allows finishing a scan and extending later, though this can be buggy. I haven&#8217;t had a crash during capture &#8211; I&#8217;ve had Polycam crash halfway through a large scan losing all data.</p>



<p>Download 3d Scanner App and use the LiDAR Advanced mode. I recommend the following options for scanning streets:</p>



<ul class="wp-block-list"><li>Confidence to low. This extends the range of the LiDAR sensor readings used at the expense of more noise. You can clean up this noise in the processing settings or Blender.</li><li>Range to 5.0 metres</li><li>Masking to None</li><li>Resolution to 50mm (the lowest &#8211; for large models like streets)</li></ul>



<p>In the app settings, make sure to set:</p>



<ul class="wp-block-list"><li>GPS tag scans to ON</li><li>Units to metric</li></ul>



<p>When scanning a street, walk (or cycle) slowly with a sweeping motion to increase the width. If the area is wide enough to require a grid pattern, follow the same shape as a drone survey (an S-shape with considerable overlap). Not enough overlap or higher speeds mean the linear passes don&#8217;t connect correctly due to (I assume) inertial measurement unit drift. I&#8217;m unsure if the GPS information is used in the sensor fusion (<a href="https://developer.apple.com/augmented-reality/arkit/" target="_blank" rel="noopener" title="">via ARKit</a>), please comment if you know!</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="472" height="1024" src="https://jakecoppinger.com/wp-content/uploads/2023/03/3d-scanner-app-model-472x1024.jpg" alt="" class="wp-image-517" srcset="https://jakecoppinger.com/wp-content/uploads/2023/03/3d-scanner-app-model-472x1024.jpg 472w, https://jakecoppinger.com/wp-content/uploads/2023/03/3d-scanner-app-model-138x300.jpg 138w, https://jakecoppinger.com/wp-content/uploads/2023/03/3d-scanner-app-model-768x1665.jpg 768w, https://jakecoppinger.com/wp-content/uploads/2023/03/3d-scanner-app-model-709x1536.jpg 709w, https://jakecoppinger.com/wp-content/uploads/2023/03/3d-scanner-app-model-945x2048.jpg 945w, https://jakecoppinger.com/wp-content/uploads/2023/03/3d-scanner-app-model.jpg 1179w" sizes="auto, (max-width: 472px) 100vw, 472px" /><figcaption>View of the completed model</figcaption></figure>



<h1 class="wp-block-heading" id="aioseo-exporting-and-preparing-the-model">Exporting and preparing the model</h1>



<p>In the <code>3d Scanner App</code> use the Share button, then select the <code>.obj</code> file type. Send this to your computer (Airdrop works great if using macOS). <em>If using <a href="https://poly.cam/" target="_blank" rel="noopener" title="">Polycam</a>, set &#8220;Z axis up&#8221; in the mesh export settings</em>.</p>



<h2 class="wp-block-heading" id="aioseo-rotating-the-model-into-the-correct-orientation">Rotating the model into the correct orientation (required for 3d Scanner App)</h2>



<p>Unfortunately the <code>3d Scanner App</code> exports objects with the Z axis as &#8220;up&#8221;, while the <code>odm_orthophoto</code> program expects the Y axis to be &#8220;up&#8221;. <em>Confusingly, you can skip this step if using <a href="https://poly.cam/" target="_blank" rel="noopener" title="">Polycam</a> if exporting with &#8220;Z axis up&#8221; in the mesh export settings, though Blender shows the Y axis as up in this export. If you know why this is, please leave a comment!</em></p>



<p>To rotate the model, import it to Blender and rotate it 90 degrees.</p>



<ul class="wp-block-list"><li>First, install Blender via your preferred method (<a href="https://www.blender.org/download/" target="_blank" rel="noopener" title="">https://www.blender.org/download/</a>).</li><li>Open Blender, delete the initial default cube (right click -&gt; delete, or <code>x</code> hotkey)</li><li>Import the <code>.obj</code> file: File -&gt; Import -&gt; Wavefront (.obj)</li><li>(optional: you can view the pretty texture by selecting &#8220;viewport shading&#8221; in the top right (the horizontal list of sphere icons))</li></ul>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="934" height="468" src="https://jakecoppinger.com/wp-content/uploads/2023/03/Screen-Shot-2023-03-12-at-20.44.19.png" alt="" class="wp-image-518" srcset="https://jakecoppinger.com/wp-content/uploads/2023/03/Screen-Shot-2023-03-12-at-20.44.19.png 934w, https://jakecoppinger.com/wp-content/uploads/2023/03/Screen-Shot-2023-03-12-at-20.44.19-300x150.png 300w, https://jakecoppinger.com/wp-content/uploads/2023/03/Screen-Shot-2023-03-12-at-20.44.19-768x385.png 768w" sizes="auto, (max-width: 934px) 100vw, 934px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="661" src="https://jakecoppinger.com/wp-content/uploads/2023/03/model-in-blender-before-rotate-1024x661.jpg" alt="" class="wp-image-519" srcset="https://jakecoppinger.com/wp-content/uploads/2023/03/model-in-blender-before-rotate-1024x661.jpg 1024w, https://jakecoppinger.com/wp-content/uploads/2023/03/model-in-blender-before-rotate-300x194.jpg 300w, https://jakecoppinger.com/wp-content/uploads/2023/03/model-in-blender-before-rotate-768x496.jpg 768w, https://jakecoppinger.com/wp-content/uploads/2023/03/model-in-blender-before-rotate-1536x991.jpg 1536w, https://jakecoppinger.com/wp-content/uploads/2023/03/model-in-blender-before-rotate-2048x1321.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Model appearing in correct orientation in Blender, before rotating for export</figcaption></figure>



<ul class="wp-block-list"><li>To rotate<ul><li>Click the object and make sure it is selected (orange border)</li></ul><ul><li>Press hotkey&nbsp;<code>r</code>&nbsp;(from any view)</li><li>Press&nbsp;<code>x</code>&nbsp;to only allow rotation on X axis</li><li>Type&nbsp;<code>90</code>&nbsp;(or desired degrees to rotate)</li></ul></li><li>Optional: You can check if the rotation is correct by pressing numpad key 1. If you don&#8217;t have a numpad you will need to enable numpad emulation (see instructions at <a href="https://www.hack-computer.com/post/how-to-emulate-a-third-mouse-button-and-keypad-for-blender" target="_blank" rel="noopener" title="">https://www.hack-computer.com/post/how-to-emulate-a-third-mouse-button-and-keypad-for-blender</a>). <ul><li>The rotation is correct if you have a &#8220;birds eye view&#8221; in the numpad key 1 view, where the blue Z axis is towards the top of screen and the red X axis is towards the right of screen</li></ul></li></ul>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="661" src="https://jakecoppinger.com/wp-content/uploads/2023/03/blender-view-after-rotating-1024x661.jpg" alt="" class="wp-image-521" srcset="https://jakecoppinger.com/wp-content/uploads/2023/03/blender-view-after-rotating-1024x661.jpg 1024w, https://jakecoppinger.com/wp-content/uploads/2023/03/blender-view-after-rotating-300x194.jpg 300w, https://jakecoppinger.com/wp-content/uploads/2023/03/blender-view-after-rotating-768x496.jpg 768w, https://jakecoppinger.com/wp-content/uploads/2023/03/blender-view-after-rotating-1536x991.jpg 1536w, https://jakecoppinger.com/wp-content/uploads/2023/03/blender-view-after-rotating-2048x1321.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Correct orientation for export to <code>odm_orthophoto</code>. Not the axis display at the top right.</figcaption></figure>



<ul class="wp-block-list"><li>File -&gt; Export as an <code>.obj</code> <strong>to the same folder</strong> with a new name (eg. <code>blender_export.obj</code>)<ul><li>Note: Blender doesn&#8217;t create a new texture <code>.jpg</code>. If you export to a different folder the path to the <code>.jpg</code> in the <code>.mtl</code> file will need updating.</li></ul></li></ul>



<h1 class="wp-block-heading" id="aioseo-generating-the-raster-orthophoto">Generating the raster orthophoto</h1>



<p>Use the <code>odm_orthophoto</code> command line tool to generate a raster orthophoto from a <code>.obj</code> file. This tool is available at <a href="https://github.com/OpenDroneMap/odm_orthophoto" target="_blank" rel="noopener" title="">https://github.com/OpenDroneMap/odm_orthophoto</a> but has a considerable number of dependencies.</p>



<p>I believe the easiest method currently is to install WebODM locally, copy the <code>.obj</code> and texture files (<code>.mtl</code> and <code>.jpg</code>) into the Docker container and then run the program from inside the Docker container.</p>



<h2 class="wp-block-heading" id="aioseo-installing-webodm-locally">Installing WebODM locally</h2>



<p>Running the software using Docker is a breeze. Install Docker from <a href="https://www.docker.com/" target="_blank" rel="noreferrer noopener">https://www.docker.com/</a> (or your preferred method) and then:</p>



<pre class="wp-block-code"><code>git clone https://github.com/OpenDroneMap/WebODM --config core.autocrlf=input --depth 1
cd WebODM
./webodm.sh start </code></pre>



<p>See <a href="https://github.com/OpenDroneMap/WebODM#getting-started" target="_blank" rel="noreferrer noopener">https://github.com/OpenDroneMap/WebODM#getting-started</a> for more details. WebODM itself is excellent and great fun if you have a drone!</p>



<h2 class="wp-block-heading" id="aioseo-copying-the-textured-object-into-the-odm-docker-container">Copying the object into the ODM Docker container</h2>



<p>You can start a shell in the container with the following command:</p>



<pre class="wp-block-code"><code>docker exec -it webodm_node-odm_1 /bin/bash</code></pre>



<p>Make a new directory to keep your files in</p>



<pre class="wp-block-code"><code>mkdir /iphone_model
cd /iphone_model</code></pre>



<p>In another shell, copy the object and texture files from your local machine into the new Docker container folder. <code>docker cp</code> can only copy one file at a time.</p>



<pre class="wp-block-code"><code>cd path/to/your/model/
docker cp blender_export.obj webodm_node-odm_1:/iphone_model/
docker cp blender_export.mtl webodm_node-odm_1:/iphone_model/
# Note: The blender .obj export doesn't create a new texture .jpg
#   If your Blender export wasn't in the same directory, check
#   update the path in blender_export.mtl
docker cp textured_output.jpg webodm_node-odm_1:/iphone_model/</code></pre>



<h2 class="wp-block-heading" id="aioseo-running-odm_orthophoto">Running <code>odm_orthophoto</code></h2>



<p>In the shell you started in the docker container above, run the following command:</p>



<pre class="wp-block-code"><code>cd /iphone_model/
/code/SuperBuild/install/bin/odm_orthophoto -inputFiles blender_export.obj -logFile log.txt -outputFile orthophoto.tif -resolution 100.0 -outputCornerFile corners.txt</code></pre>



<p>The <code>resolution</code> argument is how many pixels per metre &#8211; this may require changing.</p>



<h2 class="wp-block-heading" id="aioseo-exporting-the-orthophoto-out-of-the-docker-container">Exporting the orthophoto out of the Docker container</h2>



<p>To copy the generated orthophoto out, from a shell on your local machine run:</p>



<pre class="wp-block-code"><code>docker cp webodm_node-odm_1:/iphone_model/orthophoto.tif .</code></pre>



<p>Use a similar command to extract the log file if required.</p>



<h1 class="wp-block-heading" id="aioseo-georeferencing-the-orthophoto">Georeferencing the orthophoto</h1>



<p>Georeferencing is the process of specifying the location and orientation of the image so it perfectly aligns with maps or GIS software. <em>While a rough location (with a moderately incorrect rotation) is stored in the model, it appears to be removed by the Blender rotation step. If you know how to fix this please comment below!</em></p>



<p>To do this:</p>



<ul class="wp-block-list"><li>Install QGIS by your preferred method: <a href="https://www.qgis.org/en/site/forusers/download.html" target="_blank" rel="noopener" title="">https://www.qgis.org/en/site/forusers/download.html</a></li><li>Install the plugins (via the Plugins -&gt; Manage &amp; Install plugins&#8230; menu)<ul><li>QuickMapServices (to pull in Bing satellite imagery easily)</li><li>Freehand raster georeferencer (a beginner friendly georeferencing tool)</li></ul></li><li>Add a Bing satellite base layer: Web -&gt; QuickMapServices -&gt; Bing -&gt; Bing Satellite<ul><li>Feel free to choose another satellite background of your chosing</li><li>If you&#8217;re in NSW: the NSW LPI Imagery is likely the most detailed, follow: <a href="https://www.spatial.nsw.gov.au/products_and_services/web_services/qgis" target="_blank" rel="noopener" title="">https://www.spatial.nsw.gov.au/products_and_services/web_services/qgis</a></li></ul></li><li>Zoom &amp; pan to the rough location of the 3d scan (the initial <code>.tif</code> location will be wherever you&#8217;re viewing)</li><li>Drag the <code>.tif</code> output by the previous step into the sidebar (it won&#8217;t be visible yet as it is not aligned)</li><li>Go to Raster-&gt; Freehand raster georeferencer -&gt; Add raster for freehand georeferencing and select the same <code>.tif</code></li><li>Use the Move, Rotate and scale buttons in the toolbar to align your orthophoto with the imagery background (tip. Hold Cmd or Ctrl <em>before</em> scaling to keep the aspect ratio)</li></ul>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="206" src="https://jakecoppinger.com/wp-content/uploads/2023/03/Screen-Shot-2023-03-11-at-14.14.48-1024x206.png" alt="" class="wp-image-512" srcset="https://jakecoppinger.com/wp-content/uploads/2023/03/Screen-Shot-2023-03-11-at-14.14.48-1024x206.png 1024w, https://jakecoppinger.com/wp-content/uploads/2023/03/Screen-Shot-2023-03-11-at-14.14.48-300x60.png 300w, https://jakecoppinger.com/wp-content/uploads/2023/03/Screen-Shot-2023-03-11-at-14.14.48-768x154.png 768w, https://jakecoppinger.com/wp-content/uploads/2023/03/Screen-Shot-2023-03-11-at-14.14.48.png 1046w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Buttons to move/scale/rotate</figcaption></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="791" src="https://jakecoppinger.com/wp-content/uploads/2023/03/aligning-tiff-1024x791.jpg" alt="" class="wp-image-522" srcset="https://jakecoppinger.com/wp-content/uploads/2023/03/aligning-tiff-1024x791.jpg 1024w, https://jakecoppinger.com/wp-content/uploads/2023/03/aligning-tiff-300x232.jpg 300w, https://jakecoppinger.com/wp-content/uploads/2023/03/aligning-tiff-768x593.jpg 768w, https://jakecoppinger.com/wp-content/uploads/2023/03/aligning-tiff-1536x1186.jpg 1536w, https://jakecoppinger.com/wp-content/uploads/2023/03/aligning-tiff-2048x1581.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Aligned to the nearby buildings</figcaption></figure>



<ul class="wp-block-list"><li>Click the &#8220;Export raster with world file&#8221; button (Green on the right with exclamation marks).</li><li>Check the &#8220;Only export world file for chosen raster&#8221; button. <strong>Make sure to do this before chosing the image path.</strong></li><li>Select the existing <code>.tif</code> image and press OK</li><li>Remove the orthophoto from the QGIS sidebar (right click -&gt; remove layer)</li><li>Drag the existing <code>.tif</code> image back into the sidebar. QGIS will now find the worldfiles next to it (<code>orthophoto.tif.aux.xml</code> and <code>orthophoto.tfw</code>) so it will be positioned in the right place</li></ul>



<h2 class="wp-block-heading" id="aioseo-export-georeferenced-geotiff-without-worldfile">Export geo-referenced GeoTIFF (without worldfile)</h2>



<p>If you would like to upload the GeoTIFF to OpenAerialMap or somewhere else, you will need to &#8220;bake in&#8221; the location into the GeoTIFF itself, rather than in the worldfile &#8211; OpenAerialMap can&#8217;t read the worldfile.</p>



<p>To do this:</p>



<ul class="wp-block-list"><li>right click your <code>orthophoto</code> layer (after the above steps) and click Export -&gt; Save As&#8230;</li><li>Set <code>CRS</code> to your desired coordinate system (if not yet in a coordinate system, <a href="https://gis.stackexchange.com/questions/48949/epsg-3857-or-4326-for-googlemaps-openstreetmap-and-leaflet" target="_blank" rel="noopener" title="">I assume you should use <strong><code>EPSG 3857</code></strong> if you want it to be aligned with OpenStreetMap tiles</a>, but this is the limit of my current understanding &#8211; I haven&#8217;t studied surveying yet!).</li><li>To avoid confusion, create a new subfolder and save it with the default settings (eg. make folder <code>qgis_export</code> and save as orthophoto.tif).</li><li>You now have a nice georeferenced GeoTIFF!</li></ul>



<h1 class="wp-block-heading" id="aioseo-uploading-to-openaerialmap">Uploading to OpenAerialMap</h1>



<p>If you want the imagery to be publicly viewable and accessible from the OpenStreetMap iD editor, OpenAerialMap is a free place to host your imagery.</p>



<p>This is the imagery from the above example: <a href="https://map.openaerialmap.org/#/-18.6328125,18.562947442888312,3/latest/" target="_blank" rel="noopener" title="">https://map.openaerialmap.org/#/-18.6328125,18.562947442888312,3/latest/</a></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="675" src="https://jakecoppinger.com/wp-content/uploads/2023/03/open-aerial-map-margaret-st-1024x675.jpg" alt="" class="wp-image-553" srcset="https://jakecoppinger.com/wp-content/uploads/2023/03/open-aerial-map-margaret-st-1024x675.jpg 1024w, https://jakecoppinger.com/wp-content/uploads/2023/03/open-aerial-map-margaret-st-300x198.jpg 300w, https://jakecoppinger.com/wp-content/uploads/2023/03/open-aerial-map-margaret-st-768x506.jpg 768w, https://jakecoppinger.com/wp-content/uploads/2023/03/open-aerial-map-margaret-st.jpg 1500w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>I&#8217;ve heard of plans for a relaunch of the website, but currently the upload form can be finicky.</p>



<ul class="wp-block-list"><li>Open the explore page: <a href="https://map.openaerialmap.org/" target="_blank" rel="noopener" title="">https://map.openaerialmap.org/</a></li><li>Sign in (only Google &amp; FB Oauth supported)</li><li>Press upload<ul><li>Currently uploading from local file doesn&#8217;t appear to work, see <a href="https://github.com/hotosm/OpenAerialMap/issues/158" target="_blank" rel="noopener" title="">https://github.com/hotosm/OpenAerialMap/issues/158</a> for updates</li><li>Uploading via Google Drive with my account (2fa enabled, Gsuite) fails with This app is blocked: This app tried to access sensitive info in your Google Account. To keep your account safe, Google blocked this access.<ul><li>Enabling less secure apps is not possible for 2fa accounts. Otherwise, if you&#8217;re comfortable turning it off you can do that here: <a href="https://myaccount.google.com/lesssecureapps" target="_blank" rel="noopener" title="">https://myaccount.google.com/lesssecureapps</a></li></ul></li><li>Using a URL is likely the only way. Creating an S3 bucket is one way. If you have a fast connection it would be faster to run a local webserver with Python and running <a href="https://ngrok.com/download" target="_blank" rel="noopener" title="">ngrok</a> to make it publicly available. I recommend not keeping this server running for longer than necessary. Eg:</li></ul></li></ul>



<pre class="wp-block-code"><code>cd qgis_export
python3 -m http.server 8080
ngrok http 8080
# Your file is now available at https://SOME_PATH.ngrok.io/orthophoto.tif</code></pre>



<p>Specify this url in the form and add other details, then press upload.</p>



<h1 class="wp-block-heading" id="aioseo-limitations">Limitations</h1>



<ul class="wp-block-list"><li>Manual alignment limits the real world accuracy of imagery</li><li>Drift during long model captures occurs. My understanding is drift occurs more when there are sudden or fast movements. The 3d Scanner App unfortunately doesn&#8217;t warn you when you&#8217;re moving to fast, but Polycam does. As far as I know, the iOS ARKit doesn&#8217;t attempt to reconcile drift when completing a loop/circuit.</li></ul>



<h1 class="wp-block-heading" id="aioseo-future-work">Future work</h1>



<ul class="wp-block-list"><li>Automation! This process is slow but it works.<ul><li>Adding a Makefile or other compile tooling to <a href="https://github.com/OpenDroneMap/odm_orthophoto" target="_blank" rel="noopener" title="">https://github.com/OpenDroneMap/odm_orthophoto</a> would skip the requirement to install WebODM and transfer files to/from the Docker container</li><li>Rotating the model could be added (behind a flag to be backwards compatible) to the odm_orthophoto script</li></ul></li><li>Generating pointclouds (supported by 3d Scanner App) and then exporting as a raster from CloudCompare. This might make larger captures possible.<ul><li>If there is a way of addressing drift of pointclouds for multiple captures &#8211; let me know how!</li></ul></li><li>Georeferencing using ground control points rather than a freehand referencer</li><li>Creating street facade montages and evaluating doors &amp; soft edges (Jan Gehl (1986) “Soft edges” in residential streets, Scandinavian Housing and Planning Research,3:2,89-102, DOI: <a href="https://doi.org/10.1080/02815738608730092">10.1080/02815738608730092</a>)</li></ul>



<p>Let me know if you have any corrections/suggestions/feedback!</p><p>The post <a href="https://jakecoppinger.com/2023/03/generating-aerial-imagery-with-your-iphones-lidar-sensor/">Generating aerial imagery with your iPhone’s LiDAR sensor</a> first appeared on <a href="https://jakecoppinger.com">Jake Coppinger</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://jakecoppinger.com/2023/03/generating-aerial-imagery-with-your-iphones-lidar-sensor/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title>Creating aerial imagery with a bike helmet camera (GoPro) and OpenDroneMap</title>
		<link>https://jakecoppinger.com/2022/12/creating-aerial-imagery-with-a-bike-helmet-camera-and-opendronemap/</link>
					<comments>https://jakecoppinger.com/2022/12/creating-aerial-imagery-with-a-bike-helmet-camera-and-opendronemap/#comments</comments>
		
		<dc:creator><![CDATA[Jake C]]></dc:creator>
		<pubDate>Sat, 10 Dec 2022 09:08:15 +0000</pubDate>
				<category><![CDATA[Cycling]]></category>
		<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Side project]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[Urbanism]]></category>
		<category><![CDATA[360 degree camera]]></category>
		<category><![CDATA[bike]]></category>
		<category><![CDATA[cycleways]]></category>
		<category><![CDATA[cycling]]></category>
		<category><![CDATA[gopro]]></category>
		<category><![CDATA[helmet]]></category>
		<category><![CDATA[openaerialmap]]></category>
		<category><![CDATA[opendronemap]]></category>
		<category><![CDATA[openstreetmap]]></category>
		<category><![CDATA[orthoimagery]]></category>
		<category><![CDATA[OSM]]></category>
		<category><![CDATA[photogrammetry]]></category>
		<category><![CDATA[spherical]]></category>
		<guid isPermaLink="false">https://jakecoppinger.com/?p=293</guid>

					<description><![CDATA[<p>This technical guide details how you can create your own orthorectified (aka satellite view/bird mode) imagery, point clouds and 3D models of streets with nothing but a 360 degree camera mounted on bicycle helmet, and the open source photogrammetry software OpenDroneMap.</p>
<p>The post <a href="https://jakecoppinger.com/2022/12/creating-aerial-imagery-with-a-bike-helmet-camera-and-opendronemap/">Creating aerial imagery with a bike helmet camera (GoPro) and OpenDroneMap</a> first appeared on <a href="https://jakecoppinger.com">Jake Coppinger</a>.</p>]]></description>
										<content:encoded><![CDATA[<p><em>See comments on <a href="https://news.ycombinator.com/item?id=33947618" target="_blank" rel="noopener" title="Hacker News (#3, 11 comments)">Hacker News (24 comments, 220 points)</a></em></p>



<p>This technical guide details how you can create your own orthorectified (aka satellite view/<a href="https://twitter.com/btaylor/status/1099370126678253569" target="_blank" rel="noopener" title="">bird mode</a>) imagery, point clouds and 3D models of streets with nothing but a 360 degree camera mounted on bicycle helmet, and the open source photogrammetry software <a href="https://opendronemap.org/" target="_blank" rel="noopener" title="">OpenDroneMap</a>.</p>



<figure class="wp-block-image alignwide size-large"><img loading="lazy" decoding="async" width="1024" height="772" src="https://jakecoppinger.com/wp-content/uploads/2022/12/blender-perspective-1024x772.jpg" alt="" class="wp-image-356" srcset="https://jakecoppinger.com/wp-content/uploads/2022/12/blender-perspective-1024x772.jpg 1024w, https://jakecoppinger.com/wp-content/uploads/2022/12/blender-perspective-300x226.jpg 300w, https://jakecoppinger.com/wp-content/uploads/2022/12/blender-perspective-768x579.jpg 768w, https://jakecoppinger.com/wp-content/uploads/2022/12/blender-perspective-1536x1158.jpg 1536w, https://jakecoppinger.com/wp-content/uploads/2022/12/blender-perspective-2048x1544.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Why might you want to do this? With your own up-to-date and highly detailed orthorectified imagery you could:</p>



<ul class="wp-block-list"><li>quantify and communicate inefficient road space allocation</li><li>record necessary infrastructure repairs</li><li>take measurements such as lane and cycleway widths</li><li>measure footpath obstructions in 3D and rate pedestrian amenity</li><li>map kerb features on OpenStreetMap</li><li>survey street parking using the new OSM spec: <a href="https://wiki.openstreetmap.org/wiki/Street_parking" target="_blank" rel="noopener" title="">wiki.openstreetmap.org/wiki/Street_parking</a></li><li>3D print a model of your home street!</li></ul>


<div id="mc_embed_shell"><style type="text/css">
        #mc_embed_signup{background:#fff; false;clear:left; font:14px Helvetica,Arial,sans-serif; width: 600px;}<br />
        /* Add your own Mailchimp form style overrides in your site stylesheet or in this style block.<br />
           We recommend moving this block and the preceding CSS link to the HEAD of your HTML file. */<br />
</style>
<div id="mc_embed_signup"><form id="mc-embedded-subscribe-form" class="validate" action="https://jakecoppinger.us17.list-manage.com/subscribe/post?u=3c1bd4fc8fca6648af03e916a&amp;id=ad49243f2c&amp;f_id=00d3e4e3f0" method="post" name="mc-embedded-subscribe-form" target="_blank">
<div id="mc_embed_signup_scroll">
<h2><a href="http://eepurl.com/hemS9j" target="_blank" rel="noopener">Subscribe to Jake&#8217;s blog</a></h2>
Email notifications of new blog posts are infrequent, brief, and plain text.

</div>
</form></div>
</div>


<iframe style="width:100%;max-width:100%;height:70vh" src="https://sketchfab.com/models/85937287d282425c86cd53ae85fbec35/embed?autostart=1" class=" alignfull" frameborder="0"></iframe>



<p></p>



<figure class="wp-block-image alignwide size-large"><img loading="lazy" decoding="async" width="1024" height="738" src="https://jakecoppinger.com/wp-content/uploads/2022/12/id-editor-portman-st-1024x738.png" alt="" class="wp-image-355" srcset="https://jakecoppinger.com/wp-content/uploads/2022/12/id-editor-portman-st-1024x738.png 1024w, https://jakecoppinger.com/wp-content/uploads/2022/12/id-editor-portman-st-300x216.png 300w, https://jakecoppinger.com/wp-content/uploads/2022/12/id-editor-portman-st-768x553.png 768w, https://jakecoppinger.com/wp-content/uploads/2022/12/id-editor-portman-st-1536x1107.png 1536w, https://jakecoppinger.com/wp-content/uploads/2022/12/id-editor-portman-st-2048x1476.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>Viewing orthoimagery generated with a GoPro in the OpenStreetMap ID editor</figcaption></figure>



<figure class="wp-block-video alignwide"><video controls src="https://jakecoppinger.com/wp-content/uploads/2022/12/measuring-cyclepath-v2.mp4"></video><figcaption>Making measurements in WebODM. Generating 2d elevation profiles is also possible.</figcaption></figure>



<p>Drones are great for surveying and mapping things on the kerb (parking/public space/road widths/building shadows) but there are a lot of places you can&#8217;t fly a drone.</p>



<p><a href="https://opendronemap.org/" target="_blank" rel="noopener" title="">OpenDroneMap</a> is usually used to combine a set of geotagged drone images into one coherent 3d model, but it can also be used with <em>any</em> geotagged images.</p>



<p>Roughly the process is as follows:</p>



<ul class="wp-block-list"><li>Take spherical images on a 360 degree camera</li><li>Import the files from the camera</li><li>Optional: Convert the photos into rectangular, spherical images (for GoPro: convert from the proprietary GoPro format to standard spherical images using GoPro Fusion v1.2)</li><li>Start/login to WebODM, upload the images <em>with fisheye lens setting</em> for 180 degree images or <em>spherical</em> for rectangular 360 degree images and generate imagery &amp; model</li></ul>



<p>Please comment any projects you make after reading this guide, or if you have any questions! There are certainly issues with this process with I&#8217;ve added under Limitations.</p>



<h1 class="wp-block-heading">Table of Contents</h1>



<div class="wp-block-aioseo-table-of-contents"><ul><li><a href="#aioseo-aquiring-a-camera">Buying a 360 degree camera</a></li><li><a href="#aioseo-gopro-fusion-specific-tips">GoPro Fusion specific tips</a></li><li><a href="#aioseo-downloading-the-images">Preprocessing the images</a></li><li><a href="#aioseo-generating-the-model-and-orthorectified-imagery-with-web-opendronemap">Generating the model and orthorectified imagery with Web OpenDroneMap</a><ul><li><a href="#aioseo-setting-up-webodm">Setting up WebODM locally</a></li><li><a href="#aioseo-optional-adding-webodm-lightening-as-a-processing-node">Optional: Adding WebODM lightening as a processing node</a></li><li><a href="#aioseo-generating-the-model">Generating the model &#038; selecting the correct options</a></li><li><a href="#aioseo-output-accuracy-taking-measurements">Output accuracy: taking measurements</a></li></ul></li><li><a href="#aioseo-optional-create-equirectangular-photos-rather-than">Alternative: Generating and processing equirectangular spherical images</a></li><li><a href="#aioseo-limitations">Limitations</a></li><li><a href="#aioseo-appendix-things-that-didnt-work">Appendix: Things that didn&#8217;t work</a><ul><li><a href="#aioseo-removing">Removing helmet artifacts by cropping</a></li><li><a href="#aioseo-removing-helmet-artifacts-by-adding-a-mask">Removing helmet artifacts by adding a mask</a></li></ul></li><li><a href="#aioseo-further-research-to-be-done">Further research/experimentation</a></li><li><a href="#aioseo-prior-art">Prior art</a></li></ul></div>



<h2 class="wp-block-heading" id="aioseo-aquiring-a-camera">Buying a 360 degree camera</h2>



<p>360 degree cameras can be very expensive (the ones mounted on Google Street View cars are <a href="https://www.quora.com/How-much-does-Google-Street-View-cost-Google-to-operate" target="_blank" rel="noopener" title="">possibly $45,000!</a>), but GoPro makes <em>relatively</em> affordable models. See <a href="https://help.mapillary.com/hc/en-us/articles/115001465989-About-360-cameras" target="_blank" rel="noopener" title="">https://help.mapillary.com/hc/en-us/articles/115001465989-About-360-cameras</a> for more suitable cameras. One common second hand (and now unsupported) model is the GoPro Fusion, which I&#8217;ll base this guide on.</p>



<p>Note: Seth Deegan has written a PowerShell script for using Insta360 cameras with ODM. I haven&#8217;t tried it but it seems worth a look: <a href="https://github.com/lectrician1/Insta360-2-ODM" target="_blank" rel="noopener" title="">https://github.com/lectrician1/Insta360-2-ODM</a></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="872" height="1024" src="https://jakecoppinger.com/wp-content/uploads/2022/11/Screen-Shot-2022-11-17-at-11.09.23-pm-872x1024.png" alt="" class="wp-image-303" srcset="https://jakecoppinger.com/wp-content/uploads/2022/11/Screen-Shot-2022-11-17-at-11.09.23-pm-872x1024.png 872w, https://jakecoppinger.com/wp-content/uploads/2022/11/Screen-Shot-2022-11-17-at-11.09.23-pm-255x300.png 255w, https://jakecoppinger.com/wp-content/uploads/2022/11/Screen-Shot-2022-11-17-at-11.09.23-pm-768x902.png 768w, https://jakecoppinger.com/wp-content/uploads/2022/11/Screen-Shot-2022-11-17-at-11.09.23-pm-1308x1536.png 1308w, https://jakecoppinger.com/wp-content/uploads/2022/11/Screen-Shot-2022-11-17-at-11.09.23-pm.png 1328w" sizes="auto, (max-width: 872px) 100vw, 872px" /></figure>



<p>To generate a detailed model you will need to capture enough images close together. You could mount it to the top of your car, but unless you bought an expensive elevated mount much of the image would just be your car roof!</p>



<p>Some advantages of taking imagery from a bicycle:</p>



<ul class="wp-block-list"><li>The unobstructed field of view is larger so ODM gets more data for a better model</li><li>The average speed is lower permitting more photos (the maximum self timer frequency of this camera is 2 shots/second)</li><li>You can capture images from different places in the street for more data, such as the road, footpath and bike lanes</li><li>If you&#8217;re putting in this much effort to study public space and urban planning you probably like bikes <img src="https://s.w.org/images/core/emoji/16.0.1/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></li></ul>



<p>You&#8217;ll need to buy a helmet mount for the GoPro or your chosen camera. GoPro makes a bicycle helmet mount: <a href="https://gopro.com/en/us/shop/mounts-accessories /vented-helmet-strap-mount/GVHS30.html" target="_blank" rel="noopener" title="">https://gopro.com/en/us/shop/mounts-accessories /vented-helmet-strap-mount/GVHS30.html</a> (though many non-branded mounts exist on eBay/Amazon too). Be aware a camera mounted on a bicycle helmet is possibly a safety risk to yourself if you crash &#8211; be careful.</p>



<p>If you have the ability to mount the camera on a long pole above your head, this will increase the unobstructed field of view and improve the perspective of the street which will improve the results. I imagine this would attract even more attention! If you have tips for building rigs like this please leave a comment. Andrew Harvey wrote an OpenStreetMap diary entry on his setup here: <a href="https://www.openstreetmap.org/user/aharvey/diary/42139" target="_blank" rel="noopener" title="">https://www.openstreetmap.org/user/aharvey/diary/42139</a></p>



<h2 class="wp-block-heading" id="aioseo-gopro-fusion-specific-tips">GoPro Fusion specific tips</h2>



<p>Set the camera to:</p>



<ul class="wp-block-list"><li>Timelapse photo mode (icon of camera &amp; timer circle)</li><li>Image frequency to 0.5 seconds</li><li>Enable GPS geotagging</li></ul>



<p>Mount the camera to the helmet, wait until the GPS location icon turns solid, and start capturing! Sometimes the first few shots don&#8217;t have any location in the EXIF data but this doesn&#8217;t seem to confuse WebODM, you can check this with <code>identify -verbose image</code> or your metadata viewer of choice.</p>



<h1 class="wp-block-heading" id="aioseo-downloading-the-images">Preprocessing the images</h1>



<p>The GoPro Fusion will output two 180 degree &#8220;fisheye&#8221; images to two separate SD cards. Copy all these images to a folder onto your computer.</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2560" height="2474" data-id="359" src="https://jakecoppinger.com/wp-content/uploads/2022/12/GB010277-scaled.jpg" alt="" class="wp-image-359" srcset="https://jakecoppinger.com/wp-content/uploads/2022/12/GB010277-scaled.jpg 2560w, https://jakecoppinger.com/wp-content/uploads/2022/12/GB010277-300x290.jpg 300w, https://jakecoppinger.com/wp-content/uploads/2022/12/GB010277-1024x990.jpg 1024w, https://jakecoppinger.com/wp-content/uploads/2022/12/GB010277-768x742.jpg 768w, https://jakecoppinger.com/wp-content/uploads/2022/12/GB010277-1536x1485.jpg 1536w, https://jakecoppinger.com/wp-content/uploads/2022/12/GB010277-2048x1979.jpg 2048w" sizes="auto, (max-width: 2560px) 100vw, 2560px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2560" height="2474" data-id="358" src="https://jakecoppinger.com/wp-content/uploads/2022/12/GF010277-scaled.jpg" alt="" class="wp-image-358" srcset="https://jakecoppinger.com/wp-content/uploads/2022/12/GF010277-scaled.jpg 2560w, https://jakecoppinger.com/wp-content/uploads/2022/12/GF010277-300x290.jpg 300w, https://jakecoppinger.com/wp-content/uploads/2022/12/GF010277-1024x990.jpg 1024w, https://jakecoppinger.com/wp-content/uploads/2022/12/GF010277-768x742.jpg 768w, https://jakecoppinger.com/wp-content/uploads/2022/12/GF010277-1536x1485.jpg 1536w, https://jakecoppinger.com/wp-content/uploads/2022/12/GF010277-2048x1979.jpg 2048w" sizes="auto, (max-width: 2560px) 100vw, 2560px" /></figure>
<figcaption class="blocks-gallery-caption">Front and back images</figcaption></figure>



<p>For an alternate method, see instructions under the generating equirectangular image heading.</p>



<p>Unfortunately, only the &#8220;front&#8221; images have geotagged information, so you&#8217;ll need to copy the exif data from each &#8220;back&#8221; image to each similarly named &#8220;front&#8221; image.</p>



<p>A quick and dirty way of doing this is generating a list of terminal commands, that copies all exif tags from each &#8220;front&#8221; to each &#8220;back&#8221; photo:</p>



<p><code>ls -l | grep "GF" | sed -E "s/^.* GF(.*).JPG*/exiftool −overwrite_original_in_place -gps:all -tagsFromFile GF\1.JPG GB\1.JPG/g" &gt; script.sh</code></p>



<p>I&#8217;m sure there are better and easier ways of doing this, please let me know if you come up with one.</p>



<h1 class="wp-block-heading" id="aioseo-generating-the-model-and-orthorectified-imagery-with-web-opendronemap">Generating the model and orthorectified imagery with Web OpenDroneMap</h1>



<p>WebODM (<a href="https://opendronemap.org/" target="_blank" rel="noreferrer noopener">https://opendronemap.org</a>) is an absolute marvel of open source engineering. Unfortunately, generating 3D models takes some serious computing horsepower. You can either use the paid cloud version (WebODM Lightening) at <a href="https://webodm.net/" target="_blank" rel="noopener" title="">https://webodm.net/</a> (fast) or run the software on your own computer (a few hours/overnight/days depending on the number of images).</p>



<p>You can directly upload images to WebODM Lightening to process, however you don&#8217;t get some friendly/useful features like a browsable map and 3d model viewer. I recommend setting up WebODM locally and adding WebODM Lightening as a &#8220;processing node&#8221;, so you get the power of the cloud and the extra features of WebODM.</p>



<h2 class="wp-block-heading" id="aioseo-setting-up-webodm">Setting up WebODM locally</h2>



<p>Running the software using Docker is a breeze. Install Docker from <a href="https://www.docker.com/" target="_blank" rel="noopener" title="">https://www.docker.com/</a> (or your preferred method), allocate as much memory &amp; CPUs as you can, and then:</p>



<pre class="wp-block-code"><code>git clone https://github.com/OpenDroneMap/WebODM --config core.autocrlf=input --depth 1
cd WebODM
./webodm.sh start </code></pre>



<p>See <a href="https://github.com/OpenDroneMap/WebODM#getting-started" target="_blank" rel="noopener" title="">https://github.com/OpenDroneMap/WebODM#getting-started</a> more more details including GPU acceleration.</p>



<p>You&#8217;ll now be able to open WebODM on <a href="http://localhost:8000" target="_blank" rel="noopener" title="">http://localhost:8000</a></p>



<h2 class="wp-block-heading" id="aioseo-optional-adding-webodm-lightening-as-a-processing-node">Optional: Adding WebODM lightening as a processing node</h2>



<p>Click lightening network in your WebODM sidebar and login.</p>



<h2 class="wp-block-heading" id="aioseo-generating-the-model">Generating the model &amp; selecting the correct options</h2>



<p>Add a new project, click &#8220;Select images &amp; GCP&#8221;, select your images, then you will see options for processing your imagery. If you&#8217;re using WebODM Lightening, make sure to set the Processing Node appropriately.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="421" src="https://jakecoppinger.com/wp-content/uploads/2022/11/Screen-Shot-2022-11-17-at-10.30.39-pm-1024x421.png" alt="" class="wp-image-296" srcset="https://jakecoppinger.com/wp-content/uploads/2022/11/Screen-Shot-2022-11-17-at-10.30.39-pm-1024x421.png 1024w, https://jakecoppinger.com/wp-content/uploads/2022/11/Screen-Shot-2022-11-17-at-10.30.39-pm-300x123.png 300w, https://jakecoppinger.com/wp-content/uploads/2022/11/Screen-Shot-2022-11-17-at-10.30.39-pm-768x316.png 768w, https://jakecoppinger.com/wp-content/uploads/2022/11/Screen-Shot-2022-11-17-at-10.30.39-pm.png 1368w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="759" src="https://jakecoppinger.com/wp-content/uploads/2022/11/Screen-Shot-2022-11-17-at-10.47.37-pm-1024x759.png" alt="" class="wp-image-300" srcset="https://jakecoppinger.com/wp-content/uploads/2022/11/Screen-Shot-2022-11-17-at-10.47.37-pm-1024x759.png 1024w, https://jakecoppinger.com/wp-content/uploads/2022/11/Screen-Shot-2022-11-17-at-10.47.37-pm-300x222.png 300w, https://jakecoppinger.com/wp-content/uploads/2022/11/Screen-Shot-2022-11-17-at-10.47.37-pm-768x569.png 768w, https://jakecoppinger.com/wp-content/uploads/2022/11/Screen-Shot-2022-11-17-at-10.47.37-pm-1536x1139.png 1536w, https://jakecoppinger.com/wp-content/uploads/2022/11/Screen-Shot-2022-11-17-at-10.47.37-pm.png 1538w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Some options I&#8217;ve found are required:</p>



<p>If you are using the raw 180 degree &#8220;fisheye&#8221; images straight out of the GoPro Fusion, set <code>camera-lens</code> to <strong>fisheye</strong> (this is critical). If you are using equirectangular images set to <code><strong>spherical</strong></code>. WebODM seems to be unable to auto-identify the lens type in both cases.</p>



<ul class="wp-block-list"><li>enable <code>sky removal</code> &#8211; this uses AI to mask out the sky in each frame so that there are less artifacts in the final model</li><li>enable <code>auto-boundary</code></li><li>enable <code>bg-removal</code></li></ul>



<p>This is just from my trial and error, there may be better option configurations.</p>



<p>You will likely need to enable &#8220;resize images&#8221; to 2000px or it is very easy to run out of memory.</p>



<p>Though it is out of scope for this article, you can also set up a VPS instance to speed up the process if you don&#8217;t want to use the hosted cloud processing tool. Ive tried this, but it&#8217;s probably more effort than it&#8217;s worth unless you&#8217;re making a business out of this.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="619" src="https://jakecoppinger.com/wp-content/uploads/2022/11/Screen-Shot-2022-11-17-at-10.33.27-pm-1024x619.png" alt="" class="wp-image-297" srcset="https://jakecoppinger.com/wp-content/uploads/2022/11/Screen-Shot-2022-11-17-at-10.33.27-pm-1024x619.png 1024w, https://jakecoppinger.com/wp-content/uploads/2022/11/Screen-Shot-2022-11-17-at-10.33.27-pm-300x181.png 300w, https://jakecoppinger.com/wp-content/uploads/2022/11/Screen-Shot-2022-11-17-at-10.33.27-pm-768x464.png 768w, https://jakecoppinger.com/wp-content/uploads/2022/11/Screen-Shot-2022-11-17-at-10.33.27-pm-1536x929.png 1536w, https://jakecoppinger.com/wp-content/uploads/2022/11/Screen-Shot-2022-11-17-at-10.33.27-pm-2048x1238.png 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption>64 cores and 124GB of RAM!</figcaption></figure>



<p>Even with an EC2 instance with 124GB of RAM and 324 images at 5760 × 2180 pixels I ran out of memory &#8211; remember to enable some swap space if you want to run at full size: <a href="https://www.digitalocean.com/community/tutorials/how-to-add-swap-space-on-ubuntu-18-04" target="_blank" rel="noopener" title="">https://www.digitalocean.com/community/tutorials/how-to-add-swap-space-on-ubuntu-18-04</a></p>



<h2 class="wp-block-heading" id="aioseo-output-accuracy-taking-measurements">Output accuracy: taking measurements</h2>



<p>OpenDroneMap can make measurements of the 3D model. I&#8217;ve found these are usually quite accurate; they may have small &#8220;measurement&#8221; errors due to artifacts or distortion but will tend towards the correct value &#8211; GPS coordinates ensure the scale is correct.</p>



<p>For example, measuring the width of the green paint of the cycle path:</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="699" src="https://jakecoppinger.com/wp-content/uploads/2022/12/measuring-cycle-path-compressed-1024x699.jpg" alt="" class="wp-image-378" srcset="https://jakecoppinger.com/wp-content/uploads/2022/12/measuring-cycle-path-compressed-1024x699.jpg 1024w, https://jakecoppinger.com/wp-content/uploads/2022/12/measuring-cycle-path-compressed-300x205.jpg 300w, https://jakecoppinger.com/wp-content/uploads/2022/12/measuring-cycle-path-compressed-768x524.jpg 768w, https://jakecoppinger.com/wp-content/uploads/2022/12/measuring-cycle-path-compressed-1536x1049.jpg 1536w, https://jakecoppinger.com/wp-content/uploads/2022/12/measuring-cycle-path-compressed-2048x1399.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p></p>



<figure class="wp-block-gallery alignwide has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="857" data-id="381" src="https://jakecoppinger.com/wp-content/uploads/2022/12/large-path-1-1024x857.jpg" alt="" class="wp-image-381" srcset="https://jakecoppinger.com/wp-content/uploads/2022/12/large-path-1-1024x857.jpg 1024w, https://jakecoppinger.com/wp-content/uploads/2022/12/large-path-1-300x251.jpg 300w, https://jakecoppinger.com/wp-content/uploads/2022/12/large-path-1-768x643.jpg 768w, https://jakecoppinger.com/wp-content/uploads/2022/12/large-path-1-1536x1286.jpg 1536w, https://jakecoppinger.com/wp-content/uploads/2022/12/large-path-1.jpg 2000w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="768" data-id="380" src="https://jakecoppinger.com/wp-content/uploads/2022/12/small-path-1024x768.jpg" alt="" class="wp-image-380" srcset="https://jakecoppinger.com/wp-content/uploads/2022/12/small-path-1024x768.jpg 1024w, https://jakecoppinger.com/wp-content/uploads/2022/12/small-path-300x225.jpg 300w, https://jakecoppinger.com/wp-content/uploads/2022/12/small-path-768x576.jpg 768w, https://jakecoppinger.com/wp-content/uploads/2022/12/small-path-1536x1152.jpg 1536w, https://jakecoppinger.com/wp-content/uploads/2022/12/small-path.jpg 2000w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</figure>



<p>Large path:</p>



<ul class="wp-block-list"><li>OpenDroneMap: 4.54 metres</li><li>Tape measure: 4.56 metres</li></ul>



<p>Small path:</p>



<ul class="wp-block-list"><li>OpenDroneMap: 1.89 metres (though this varies slightly due to distortions)</li><li>Tape measure: 1.89 metres</li></ul>



<p></p>



<h1 class="wp-block-heading" id="aioseo-optional-create-equirectangular-photos-rather-than">Alternative: Generating and processing equirectangular spherical images</h1>



<p>I&#8217;m currently unclear whether this method is faster or produces better results than the raw 180 degree images. I&#8217;m very interested to hear if you have experience (and I&#8217;ll update this if I get more evidence). I believe the GroPro Max generates these images <em>in camera</em>, so this won&#8217;t be required.</p>



<p>If you use the GoPro Fusion, unfortunately because this camera is no longer supported GoPro discontinued the software: <a href="https://gopro.com/en/au/news/fusion-end-of-life" target="_blank" rel="noopener" title="">https://gopro.com/en/au/news/fusion-end-of-life</a></p>



<p>You&#8217;ll (unfortunately) need to use the proprietary GoPro Fusion software to generate spherical images. I&#8217;ve found on an M1 Mac (Monterey) the only version that still runs is 1.2, 1.4 just crashes. The least dodgy download I can find is <a href="https://macdownload.informer.com/fusion-studio/1.2/" target="_blank" rel="noopener" title="">https://macdownload.informer.com/fusion-studio/1.2/</a>.</p>



<p>If you make an open source solution (maybe building from <a href="https://stackoverflow.com/questions/37796911/is-there-a-fisheye-or-dual-fisheye-to-equirectangular-filter-for-ffmpeg" target="_blank" rel="noopener" title="">https://stackoverflow.com/questions/37796911/is-there-a-fisheye-or-dual-fisheye-to-equirectangular-filter-for-ffmpeg</a>) please let me know! Edit: Looks like this repo will do it. <a href="https://github.com/trek-view/fusion2sphere" target="_blank" rel="noopener" title="">https://github.com/trek-view/fusion2sphere</a></p>



<p>This camera has two SD card slots &#8211; one for the front facing camera, and one for the back facing camera. Sometimes only one camera works for part of the shoot and the proprietary software refuses to stitch any of the photos at all! The only way I&#8217;ve found to combat this is to format the card in camera before each shoot. Spending more on a GoPro Max may solve a lot of headaches!</p>



<h1 class="wp-block-heading" id="aioseo-limitations">Limitations</h1>



<p>Little helmets appear! I&#8217;ve tried some techniques but haven&#8217;t found a proper solution that doesn&#8217;t degrade the model/orthophoto structure.</p>



<h1 class="wp-block-heading" id="aioseo-appendix-things-that-didnt-work">Appendix: Things that didn&#8217;t work</h1>



<h2 class="wp-block-heading" id="aioseo-removing">Removing helmet artifacts by cropping</h2>



<p>I tried using the <code>convert</code> and <code>mogrify</code> tools (part of the amazing open source <code>ImageMagick</code> suite) can crop the spherical photos <em>and retain the geographical information!</em> The cropping works great, but OpenDroneMap doesn&#8217;t seem to be able to understand a cropped equirectangular image. If you&#8217;d like to try to get this working, here are the steps I took.</p>



<p>First install ImageMagick (<code>sudo apt-get install imagemagick</code> on Linux/<code>brew install imagemagick</code> on macOS).</p>



<p>The general syntax is:<br><code>convert -crop {x_size}x{y_size}+{x_offset}+{y_offset} inputfile outputfile</code></p>



<p>See <a href="https://deparkes.co.uk/2015/04/30/batch-crop-images-with-imagemagick/" target="_blank" rel="noopener" title="">https://deparkes.co.uk/2015/04/30/batch-crop-images-with-imagemagick/</a> for more detail and helpful diagrams.</p>



<p>Helpfully, the helmet artifact is always at the bottom of frame, so the x offset and y offset will be zero.</p>



<p>To crop 700 pixels off the bottom of a spherical image, you can use</p>



<p><code>convert -crop 5760x"$((2880-700))"+0+0 inputfile output</code>file</p>



<p>To batch convert a number of files, where the input files are in <code>./input/</code>, and you have made an output directory <code>./output/</code>, you can use:</p>



<p><code>mogrify -monitor -crop 5760x"$((2880-700))"+0+0 -path ./output ./input/*</code></p>



<h2 class="wp-block-heading" id="aioseo-removing-helmet-artifacts-by-adding-a-mask">Removing helmet artifacts by adding a mask</h2>



<p>Adding custom drawn masks, either covering just the helmet or also the surrounding black &#8220;void&#8221; either:</p>



<ul class="wp-block-list"><li>removed the helments but caused extra &#8220;holes&#8221;/missing segments in the ground</li><li>didn&#8217;t remove the helmets</li></ul>



<p>I think this may be due to clashing behaviour of the <code>bg-removal</code> and <code>sky-removal</code> flags with manual masks.</p>



<p>ODM requires a mask image for every image with <code>_mask.{EXT}</code> as a suffix (where <code>EXT</code> replaces the original extension).</p>



<p>The two mask types I tried:</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-3 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2560" height="2474" data-id="360" src="https://jakecoppinger.com/wp-content/uploads/2022/12/GB010284_mask-scaled.jpg" alt="" class="wp-image-360" srcset="https://jakecoppinger.com/wp-content/uploads/2022/12/GB010284_mask-scaled.jpg 2560w, https://jakecoppinger.com/wp-content/uploads/2022/12/GB010284_mask-300x290.jpg 300w, https://jakecoppinger.com/wp-content/uploads/2022/12/GB010284_mask-1024x990.jpg 1024w, https://jakecoppinger.com/wp-content/uploads/2022/12/GB010284_mask-768x742.jpg 768w, https://jakecoppinger.com/wp-content/uploads/2022/12/GB010284_mask-1536x1485.jpg 1536w, https://jakecoppinger.com/wp-content/uploads/2022/12/GB010284_mask-2048x1979.jpg 2048w" sizes="auto, (max-width: 2560px) 100vw, 2560px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2560" height="2474" data-id="361" src="https://jakecoppinger.com/wp-content/uploads/2022/12/GB010277_mask-scaled.jpg" alt="" class="wp-image-361" srcset="https://jakecoppinger.com/wp-content/uploads/2022/12/GB010277_mask-scaled.jpg 2560w, https://jakecoppinger.com/wp-content/uploads/2022/12/GB010277_mask-300x290.jpg 300w, https://jakecoppinger.com/wp-content/uploads/2022/12/GB010277_mask-1024x990.jpg 1024w, https://jakecoppinger.com/wp-content/uploads/2022/12/GB010277_mask-768x742.jpg 768w, https://jakecoppinger.com/wp-content/uploads/2022/12/GB010277_mask-1536x1485.jpg 1536w, https://jakecoppinger.com/wp-content/uploads/2022/12/GB010277_mask-2048x1979.jpg 2048w" sizes="auto, (max-width: 2560px) 100vw, 2560px" /></figure>
</figure>



<p>If you know what may be happening please let me know!</p>



<h1 class="wp-block-heading" id="aioseo-further-research-to-be-done">Further research/experimentation</h1>



<ul class="wp-block-list"><li>How many &#8220;capture lines&#8221; per street are necessary to make a decent model? I didn&#8217;t have any luck with one but it may have been my settings. I used ~4 for the above model.</li><li>How much better are models when the camera is on a stick?</li><li>Improved WebODM settings for generation</li></ul>



<h1 class="wp-block-heading" id="aioseo-prior-art">Prior art</h1>



<ul class="wp-block-list"><li>&#8220;A Satellite in Your Pocket: Ground Based Action Cameras to Create Aerial Perspective for OSM Editing&#8221;. This was recorded at OpenStreetMap US: Connect 2020 by Sean Gorman. The company Pixel8 doesn&#8217;t appear to exist any more.<br><a href="https://www.youtube.com/watch?v=tfab-iuWlsQ" target="_blank" rel="noopener" title="">https://www.youtube.com/watch?v=tfab-iuWlsQ</a></li><li>Twitter thread by <a href="https://twitter.com/klaskarlsson">@klaskarlsson</a> (@klaskarlsson@fosstodon.org on Mastodon) on creating a model of his house using a &#8220;GoPro on a stick&#8221;: https://twitter.com/klaskarlsson/status/1583401741386936320</li><li>&#8220;<a href="https://community.opendronemap.org/t/create-aerial-imagery-base-on-360-pictures/12339">Create aerial imagery base on 360° pictures</a>&#8221; &#8211; discussion in the OpenDroneMap community: <a href="https://community.opendronemap.org/t/create-aerial-imagery-base-on-360-pictures/12339" target="_blank" rel="noopener" title="">https://community.opendronemap.org/t/create-aerial-imagery-base-on-360-pictures/12339</a></li></ul>



<p></p><p>The post <a href="https://jakecoppinger.com/2022/12/creating-aerial-imagery-with-a-bike-helmet-camera-and-opendronemap/">Creating aerial imagery with a bike helmet camera (GoPro) and OpenDroneMap</a> first appeared on <a href="https://jakecoppinger.com">Jake Coppinger</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://jakecoppinger.com/2022/12/creating-aerial-imagery-with-a-bike-helmet-camera-and-opendronemap/feed/</wfw:commentRss>
			<slash:comments>17</slash:comments>
		
		<enclosure url="https://jakecoppinger.com/wp-content/uploads/2022/12/measuring-cyclepath-v2.mp4" length="3108898" type="video/mp4" />

			</item>
	</channel>
</rss>
