<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Blog | Michael Branion-Calles</title><link>https://mbcalles.github.io/post/</link><atom:link href="https://mbcalles.github.io/post/index.xml" rel="self" type="application/rss+xml"/><description>Blog</description><generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Fri, 22 Jan 2021 00:00:00 +0000</lastBuildDate><image><url>https://mbcalles.github.io/media/icon_hu_cc610732c99915fd.png</url><title>Blog</title><link>https://mbcalles.github.io/post/</link></image><item><title>Kernel Density Estimation of Point Processes in Network Space in R</title><link>https://mbcalles.github.io/post/kernel-density-estimation-in-network-space/</link><pubDate>Fri, 22 Jan 2021 00:00:00 +0000</pubDate><guid>https://mbcalles.github.io/post/kernel-density-estimation-in-network-space/</guid><description>&lt;h1 id="kernel-density-estimation-of-point-processes-in-network-space-in-r">Kernel Density Estimation of Point Processes in Network Space in R&lt;/h1>
&lt;ul>
&lt;li>
&lt;/li>
&lt;li>
&lt;/li>
&lt;li>
&lt;ul>
&lt;li>
&lt;/li>
&lt;li>
&lt;/li>
&lt;li>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;/li>
&lt;li>
&lt;ul>
&lt;li>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;/li>
&lt;li>
&lt;/li>
&lt;li>
&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Update (September 2025):&lt;/strong> This was a blog post originally from January 2021 where I implemented a network-based KDE in R based on the algorithm outlined in
. At the time there was not a ton of R functionality for network analysis; packages like &lt;code>sfnetworks&lt;/code> did not yet exist and neither did &lt;code>spNetwork&lt;/code> to conduct network-based KDE. A much more thorough examination of network-based KDEs and their implementation in R (current as of 2025) can be found here:
. I have updated this post slightly (including code for extracting police data and using &lt;code>stplanr&lt;/code> for network cleaning). Most of the code still holds up as it relied on igraph and tidygraph directly. While likely not of particular use anymore given the advanced functionality found in &lt;code>spNetwork&lt;/code>, this little post can stand as a relic of its time.&lt;/p>
&lt;p>The network KDE is a 1-D version of the planar kernel density estimator, with $\tau$ (bandwidth) based on network distances rather than Euclidean distances, and the output is based on &lt;em>lixels&lt;/em> (a 1-D version of pixels) rather than pixels across 2-D Euclidean space.&lt;/p>
&lt;p>To produce kernel density estimates (KDE) of point processes in a linear network:&lt;/p>
$$
\lambda(z)= \sum_{i=1}^{n} \frac{1}{\tau}\, k\!\left(\frac{d_{iz}}{\tau}\right) y_i
$$&lt;p>Where,&lt;/p>
&lt;ul>
&lt;li>$\lambda(z)$ is the density at location $z$;&lt;/li>
&lt;li>$\tau$ is the bandwidth (linear network distance);&lt;/li>
&lt;li>$k$ is the kernel function, typically a function of the ratio of $d_{iz}$ to $\tau$;&lt;/li>
&lt;li>$d_{iz}$ is the linear network distance from event $i$ to location $z$.&lt;/li>
&lt;/ul>
&lt;p>I wanted to implement a network-based KDE in R based on the algorithm outlined in
. The network KDE is a 1-D version of the planar kernel density estimator, with $\tau$ (bandwidth) based on network distances rather than Euclidean distances, and the output is based on &lt;em>lixels&lt;/em> (a 1-D version of pixels) rather than pixels across 2-D Euclidean space.&lt;/p>
&lt;p>In this post I use data from Vancouver, BC as a case study for implementing a network kernel density estimator of points in a network in R.&lt;/p>
&lt;h1 id="set-up">Set Up&lt;/h1>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tidygraph&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">igraph&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">stplanr&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cancensus&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">osmdata&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dplyr&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sf&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sfnetworks&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">ggplot2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">stringr&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="getting-the-example-data">Getting the example data&lt;/h1>
&lt;p>The first step is to load example data.&lt;/p>
&lt;h2 id="study-area-extent">Study Area Extent&lt;/h2>
&lt;p>I use the &lt;code>get_census&lt;/code> function from the
package to extract a &lt;code>sf&lt;/code> object with &lt;code>POLYGON&lt;/code> geometries, representing the study extent: the City of Vancouver.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">study_area&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">get_census&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dataset&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#39;CA16&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">regions&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">CSD&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;5915&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">level&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#39;CSD&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">use_cache&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">FALSE&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">geo_format&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;sf&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">filter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="o">==&lt;/span>&lt;span class="s">&amp;#34;Vancouver (CY)&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">st_transform&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">crs&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">26910&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ggplot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">study_area&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">geom_sf&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">coord_sf&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">theme_void&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>
&lt;figure >
&lt;div class="flex justify-center ">
&lt;div class="w-full" >&lt;img src="kde_files/figure-commonmark/unnamed-chunk-3-1.png" alt="" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;h2 id="road-network-data">Road Network Data&lt;/h2>
&lt;p>Next I use the &lt;code>osmdata&lt;/code> package to download street network files for the City of Vancouver. The &lt;code>getbb()&lt;/code> function defines a bounding box for the City of Vancouver.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">bbx&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">getbb&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Vancouver, BC&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Next we use the &lt;code>opq()&lt;/code> and &lt;code>add_osm_feature&lt;/code> functions to obtain open street map road network data. The &lt;code>osmdata_sf()&lt;/code>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">streets&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">bbx&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">opq&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">add_osm_feature&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">key&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;highway&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">value&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;residential&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;living_street&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">&amp;#34;service&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;unclassified&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">&amp;#34;pedestrian&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;footway&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">&amp;#34;track&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;path&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;motorway&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;trunk&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">&amp;#34;primary&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;secondary&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">&amp;#34;tertiary&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;motorway_link&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">&amp;#34;trunk_link&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;primary_link&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">&amp;#34;secondary_link&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s">&amp;#34;tertiary_link&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">osmdata_sf&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">streets_sf&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">st_transform&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">streets&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">osm_lines&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">crs&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">26910&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">st_intersection&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">.,st_geometry&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">study_area&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">|&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">st_cast&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">to&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;MULTILINESTRING&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">|&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">st_cast&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">to&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;LINESTRING&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ggplot&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">geom_sf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">streets_sf&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">aes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">color&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">highway&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">size&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">.4&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">alpha&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">.65&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">theme_void&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>
&lt;figure >
&lt;div class="flex justify-center ">
&lt;div class="w-full" >&lt;img src="kde_files/figure-commonmark/unnamed-chunk-5-1.png" alt="" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;h2 id="police-report-data">Police Report Data&lt;/h2>
&lt;p>Finally I get point data of police reports in Vancouver from the City of Vancouver. I subset the data to only include vehicle collisions reported to police in 2018 (last full year of data available).&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># core base + tidy read&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">url&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="s">&amp;#34;https://geodash.vpd.ca/opendata/crimedata_download/crimedata_csv_all_years.zip&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">zipf&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">tempfile&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fileext&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;.zip&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">csvd&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">tempfile&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fileext&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;.csv&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">download.file&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">url&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">destfile&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">zipf&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">mode&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;wb&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">csv_name&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">unzip&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">zipf&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">list&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">TRUE&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">Name&lt;/span>&lt;span class="nf">[grepl&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;\\.csv$&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nf">unzip&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">zipf&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">list&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">TRUE&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">Name&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">unzip&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">zipf&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">files&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">csv_name&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">exdir&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">dirname&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">csvd&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">file.rename&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">file.path&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">dirname&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">csvd&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">csv_name&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">csvd&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;pre>&lt;code>[1] TRUE
&lt;/code>&lt;/pre>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># fast, friendly read&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nf">library&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">readr&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">crime&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">readr&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="nf">read_csv&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">csvd&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">show_col_types&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">FALSE&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">dplyr&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="nf">glimpse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">crime&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;pre>&lt;code>Rows: 925,938
Columns: 10
$ TYPE &amp;lt;chr&amp;gt; &amp;quot;Break and Enter Commercial&amp;quot;, &amp;quot;Break and Enter Commercia…
$ YEAR &amp;lt;dbl&amp;gt; 2022, 2022, 2023, 2022, 2022, 2022, 2022, 2022, 2022, 20…
$ MONTH &amp;lt;dbl&amp;gt; 1, 1, 9, 6, 3, 3, 2, 2, 4, 8, 9, 2, 4, 4, 5, 2, 4, 10, 8…
$ DAY &amp;lt;dbl&amp;gt; 5, 3, 14, 17, 15, 19, 23, 25, 30, 2, 11, 24, 1, 28, 11, …
$ HOUR &amp;lt;dbl&amp;gt; 7, 16, 3, 5, 5, 6, 23, 10, 22, 15, 0, 4, 4, 12, 18, 22, …
$ MINUTE &amp;lt;dbl&amp;gt; 34, 19, 30, 16, 14, 42, 0, 15, 45, 31, 5, 8, 7, 5, 0, 5,…
$ HUNDRED_BLOCK &amp;lt;chr&amp;gt; &amp;quot;10XX ALBERNI ST&amp;quot;, &amp;quot;10XX ALBERNI ST&amp;quot;, &amp;quot;10XX ALBERNI ST&amp;quot;,…
$ NEIGHBOURHOOD &amp;lt;chr&amp;gt; &amp;quot;West End&amp;quot;, &amp;quot;West End&amp;quot;, &amp;quot;West End&amp;quot;, &amp;quot;West End&amp;quot;, &amp;quot;West En…
$ X &amp;lt;dbl&amp;gt; 491015.9, 491036.1, 491065.3, 491067.3, 491102.2, 491102…
$ Y &amp;lt;dbl&amp;gt; 5459166, 5459146, 5459130, 5459115, 5459092, 5459092, 54…
&lt;/code>&lt;/pre>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">collisions&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">crime&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">filter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">YEAR&lt;/span>&lt;span class="o">==&lt;/span>&lt;span class="m">2025&lt;/span> &lt;span class="o">&amp;amp;&lt;/span> &lt;span class="nf">str_detect&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">TYPE&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;Vehicle Collision&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">filter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">X&lt;/span>&lt;span class="o">!=&lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">st_as_sf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">.,coords&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;X&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;Y&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="n">crs&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">26910&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Locations of police reported vehicle collisions are below.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ggplot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">collisions&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">geom_sf&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">coord_sf&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">theme_void&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>
&lt;figure >
&lt;div class="flex justify-center ">
&lt;div class="w-full" >&lt;img src="kde_files/figure-commonmark/unnamed-chunk-7-1.png" alt="" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;p>Now we have the data we need to try and estimate the density of police-reported collisions or “hotspots” in the City of Vancouver.&lt;/p>
&lt;p>NOTE: These data do not differentiate between different types of collisions between road users, and police road collision data consistently miss out on the majority of crashes that occur to active transport users (bicyclists and pedestrians).&lt;/p>
&lt;h1 id="prepare-the-network-data">Prepare the network data&lt;/h1>
&lt;p>In the algorithm outlined in
the resulting density estimates on a network are based on a spatial unit of analysis they term a &lt;em>lixel&lt;/em>. &lt;em>Lixels&lt;/em> are basically the 1-D version of a pixel, and refer to how long the segments in our network are from which we calculate densities of events.&lt;/p>
&lt;p>To create a &lt;em>lixelized&lt;/em> network I combine the &lt;code>split_lines()&lt;/code> and the &lt;code>lixelize network()&lt;/code> functions.&lt;/p>
&lt;p>The &lt;code>split_lines()&lt;/code> function has three arguments:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>input_lines&lt;/strong>: &lt;code>sf&lt;/code> object with &lt;code>LINSETRING&lt;/code> or &lt;code>MULTILINESTRING&lt;/code> geometry&lt;/li>
&lt;li>&lt;strong>max_length&lt;/strong>: the &lt;em>lixel&lt;/em> size, defined by the maximum length of an individual linestring in the data.&lt;/li>
&lt;li>&lt;strong>id&lt;/strong>: a unique id for each line segment in the &lt;code>sf&lt;/code> object&lt;/li>
&lt;/ul>
&lt;p>The &lt;code>split_lines()&lt;/code> function is given below:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">split_lines&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">max_length&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">id&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">input_lines&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">input_lines&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span> &lt;span class="nf">ungroup&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">geom_column&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">attr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;sf_column&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">input_crs&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">sf&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="nf">st_crs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">input_lines[[&lt;/span>&lt;span class="s">&amp;#34;geom_len&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">sf&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="nf">st_length&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines[[geom_column]]&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">attr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines[[&lt;/span>&lt;span class="s">&amp;#34;geom_len&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;units&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kc">NULL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">input_lines[[&lt;/span>&lt;span class="s">&amp;#34;geom_len&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">as.numeric&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines[[&lt;/span>&lt;span class="s">&amp;#34;geom_len&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">too_short&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">filter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">all_of&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="nf">all_of&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nf">all_of&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">geom_column&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">geom_len&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">geom_len&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="n">max_length&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span> &lt;span class="nf">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">geom_len&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">too_long&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">filter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">all_of&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="nf">all_of&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nf">all_of&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">geom_column&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">geom_len&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">geom_len&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="n">max_length&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">rm&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># just to control memory usage in case this is big.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">too_long&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">too_long&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pieces&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">ceiling&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">geom_len&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">max_length&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">fID&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="nf">nrow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">too_long&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">geom_len&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">split_points&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">sf&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="nf">st_set_geometry&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">too_long&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kc">NULL&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="nf">[rep&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">seq_len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">nrow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">too_long&lt;/span>&lt;span class="p">)),&lt;/span> &lt;span class="n">too_long[[&lt;/span>&lt;span class="s">&amp;#34;pieces&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="n">]&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">pieces&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">split_points&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">split_points&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">split_fID&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">row.names&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">split_points&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">group_by&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fID&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">piece&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="nf">n&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">start&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">piece&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="nf">n&lt;/span>&lt;span class="p">(),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">end&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">piece&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="nf">n&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">ungroup&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">new_line&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lwgeom&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="nf">st_linesubstring&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">too_long[[geom_column]][i]&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">from&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">to&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">[[1]]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">split_lines&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">apply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">split_points&lt;/span>&lt;span class="nf">[c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;fID&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;start&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;end&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">]&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">new_line&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">x[[&lt;/span>&lt;span class="s">&amp;#34;fID&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">f&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">x[[&lt;/span>&lt;span class="s">&amp;#34;start&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">t&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">x[[&lt;/span>&lt;span class="s">&amp;#34;end&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">rm&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">too_long&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">split_lines&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">st_sf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">split_points&lt;/span>&lt;span class="nf">[c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">]&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">geometry&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">st_sfc&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">split_lines&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">crs&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">input_crs&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lixel&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">rbind&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">split_lines&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">too_short&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LIXID&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">row_number&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">return&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">lixel&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The second function needed to prepare the network data is the &lt;code>lixelize_network&lt;/code> function. This takes two arguments, an &lt;code>sf&lt;/code> object with &lt;code>LINESTRING&lt;/code> or &lt;code>MULTILINESTRING&lt;/code> geometry and the lixel_length argument. This function will create two lixelized networks: 1) the output network where the line data are &lt;em>lixelized&lt;/em> and no segment is larger than the a given pixel size and 2) a shortest distance network which will be used to calculate road network lengths in our network kernel density estimates that we will dive into shortly.&lt;/p>
&lt;p>The lixelize network function is given below:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">lixelize_network&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sf_network&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">max_lixel_length&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">uid&lt;/span>&lt;span class="p">){&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Splitting input spatial lines by lixel length...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">target_lixel&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">split_lines&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">sf_network&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">max_length&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">max_lixel_length&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">id&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">uid&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Create corresponding shortest distance network...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shortest_distance_network&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">split_lines&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">target_lixel&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">max_length&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">max_lixel_length&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="m">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">id&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">uid&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">return&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">target_lixel&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">target_lixel&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">shortest_distance_network&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">shortest_distance_network&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Our approach varies from Xie and Yan (2008) in that we define a “maximum” length for lixels based on the &lt;code>split_lines()&lt;/code> function, and segments that are larger than the specified length are split into equal sized lixels. Instead of having $n$ lixels with 1 extra “residual lixel” we instead have $n$+1 lixels of equal length, under the lixel limit. For example a 45m segment with a maximum lixel length of 10m would be split into 5 segments of 9m instead of 4 lixels of 10m and a residual lixel of 5m.&lt;/p>
&lt;p>Now we have the data we need to try and estimate the density of police-reported collisions or “hotspots” in the City of Vancouver.&lt;/p>
&lt;p>NOTE: These data do not differentiate between different types of collisions between road users, and police road collision data consistently miss out on the majority of crashes that occur to active transport users (bicyclists and pedestrians).&lt;/p>
&lt;h1 id="prepare-the-network-data-1">Prepare the network data&lt;/h1>
&lt;p>In the algorithm outlined in
the resulting density estimates on a network are based on a spatial unit of analysis they term a &lt;em>lixel&lt;/em>. &lt;em>Lixels&lt;/em> are basically the 1-D version of a pixel, and refer to how long the segments in our network are from which we calculate densities of events.&lt;/p>
&lt;p>To create a &lt;em>lixelized&lt;/em> network I combine the &lt;code>split_lines()&lt;/code> and the &lt;code>lixelize network()&lt;/code> functions.&lt;/p>
&lt;p>The &lt;code>split_lines()&lt;/code> function has three arguments:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>input_lines&lt;/strong>: &lt;code>sf&lt;/code> object with &lt;code>LINSETRING&lt;/code> or &lt;code>MULTILINESTRING&lt;/code> geometry&lt;/li>
&lt;li>&lt;strong>max_length&lt;/strong>: the &lt;em>lixel&lt;/em> size, defined by the maximum length of an individual linestring in the data.&lt;/li>
&lt;li>&lt;strong>id&lt;/strong>: a unique id for each line segment in the &lt;code>sf&lt;/code> object&lt;/li>
&lt;/ul>
&lt;p>The &lt;code>split_lines()&lt;/code> function is given below:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">split_lines&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">max_length&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">id&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">input_lines&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">input_lines&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span> &lt;span class="nf">ungroup&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">geom_column&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">attr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;sf_column&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">input_crs&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">sf&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="nf">st_crs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">input_lines[[&lt;/span>&lt;span class="s">&amp;#34;geom_len&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">sf&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="nf">st_length&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines[[geom_column]]&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">attr&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines[[&lt;/span>&lt;span class="s">&amp;#34;geom_len&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;units&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kc">NULL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">input_lines[[&lt;/span>&lt;span class="s">&amp;#34;geom_len&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">as.numeric&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines[[&lt;/span>&lt;span class="s">&amp;#34;geom_len&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">too_short&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">filter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="nf">all_of&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nf">all_of&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">geom_column&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">geom_len&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">geom_len&lt;/span> &lt;span class="o">&amp;lt;&lt;/span> &lt;span class="n">max_length&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span> &lt;span class="nf">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">geom_len&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">too_long&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">filter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="nf">all_of&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="nf">all_of&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">geom_column&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">geom_len&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">geom_len&lt;/span> &lt;span class="o">&amp;gt;=&lt;/span> &lt;span class="n">max_length&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">rm&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1"># just to control memory usage in case this is big.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">too_long&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">too_long&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pieces&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">ceiling&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">geom_len&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="n">max_length&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">fID&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="nf">nrow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">too_long&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">geom_len&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">split_points&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">sf&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="nf">st_set_geometry&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">too_long&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kc">NULL&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="nf">[rep&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">seq_len&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">nrow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">too_long&lt;/span>&lt;span class="p">)),&lt;/span> &lt;span class="n">too_long[[&lt;/span>&lt;span class="s">&amp;#34;pieces&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="n">]&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">pieces&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">split_points&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">split_points&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">split_fID&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">row.names&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">split_points&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">group_by&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fID&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">piece&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="nf">n&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">start&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">piece&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="nf">n&lt;/span>&lt;span class="p">(),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">end&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">piece&lt;/span> &lt;span class="o">/&lt;/span> &lt;span class="nf">n&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">ungroup&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">new_line&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lwgeom&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="nf">st_linesubstring&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">too_long[[geom_column]][i]&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">from&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">f&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">to&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">t&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">[[1]]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">split_lines&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">apply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">split_points&lt;/span>&lt;span class="nf">[c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;fID&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;start&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;end&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">]&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">new_line&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">x[[&lt;/span>&lt;span class="s">&amp;#34;fID&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">f&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">x[[&lt;/span>&lt;span class="s">&amp;#34;start&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">t&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">x[[&lt;/span>&lt;span class="s">&amp;#34;end&amp;#34;&lt;/span>&lt;span class="n">]]&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">rm&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">too_long&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">split_lines&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">st_sf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">split_points&lt;/span>&lt;span class="nf">[c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">]&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">geometry&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">st_sfc&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">split_lines&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">crs&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">input_crs&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lixel&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">rbind&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">split_lines&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">too_short&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LIXID&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">row_number&lt;/span>&lt;span class="p">())&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">return&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">lixel&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>The second function needed to prepare the network data is the &lt;code>lixelize_network&lt;/code> function. This takes two arguments, an &lt;code>sf&lt;/code> object with &lt;code>LINESTRING&lt;/code> or &lt;code>MULTILINESTRING&lt;/code> geometry and the lixel_length argument. This function will create two lixelized networks: 1) the output network where the line data are &lt;em>lixelized&lt;/em> and no segment is larger than the a given pixel size and 2) a shortest distance network which will be used to calculate road network lengths in our network kernel density estimates that we will dive into shortly.&lt;/p>
&lt;p>The lixelize network function is given below:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">lixelize_network&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sf_network&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">max_lixel_length&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">uid&lt;/span>&lt;span class="p">){&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Splitting input spatial lines by lixel length...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">target_lixel&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">split_lines&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">sf_network&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">max_length&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">max_lixel_length&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">id&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">uid&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Create corresponding shortest distance network...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">shortest_distance_network&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">split_lines&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">input_lines&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">target_lixel&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">max_length&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">max_lixel_length&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="m">2&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">id&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">uid&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">return&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">target_lixel&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">target_lixel&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">shortest_distance_network&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">shortest_distance_network&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Our approach varies from Xie and Yan (2008) in that we define a “maximum” length for lixels based on the &lt;code>split_lines()&lt;/code> function, and segments that are larger than the specified length are split into equal sized lixels. Instead of having $n$ lixels with 1 extra “residual lixel” we instead have $n$+1 lixels of equal length, under the lixel limit. For example a 45m segment with a maximum lixel length of 10m would be split into 5 segments of 9m instead of 4 lixels of 10m and a residual lixel of 5m.&lt;/p>
&lt;h2 id="lixelize-the-cleaned-network">Lixelize the cleaned network&lt;/h2>
&lt;p>Next step is to lixelize the cleaned network. I choose a 25m maximum lixel length (e.g. every linear segment in the network will be 25m or under. This function may take some time to run.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">lixel_list_25m&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">lixelize_network&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">sf_network&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">streets_sf&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">max_lixel_length&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">25&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">uid&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;osm_id&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;pre>&lt;code>[1] &amp;quot;Splitting input spatial lines by lixel length...&amp;quot;
[1] &amp;quot;Create corresponding shortest distance network...&amp;quot;
&lt;/code>&lt;/pre>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">str&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">lixel_list_25m&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;pre>&lt;code>List of 2
$ target_lixel : sf [224,904 × 3] (S3: sf/tbl_df/tbl/data.frame)
..$ osm_id : chr [1:224904] &amp;quot;4231647&amp;quot; &amp;quot;4231647&amp;quot; &amp;quot;4231647&amp;quot; &amp;quot;4231647&amp;quot; ...
..$ geometry:sfc_LINESTRING of length 224904; first list element: 'XY' num [1:2, 1:2] 487849 487873 5455038 5455039
..$ LIXID : int [1:224904] 1 2 3 4 5 6 7 8 9 10 ...
..- attr(*, &amp;quot;sf_column&amp;quot;)= chr &amp;quot;geometry&amp;quot;
..- attr(*, &amp;quot;agr&amp;quot;)= Factor w/ 3 levels &amp;quot;constant&amp;quot;,&amp;quot;aggregate&amp;quot;,..: NA NA
.. ..- attr(*, &amp;quot;names&amp;quot;)= chr [1:2] &amp;quot;osm_id&amp;quot; &amp;quot;LIXID&amp;quot;
$ shortest_distance_network: sf [436,612 × 3] (S3: sf/tbl_df/tbl/data.frame)
..$ osm_id : chr [1:436612] &amp;quot;4231647&amp;quot; &amp;quot;4231647&amp;quot; &amp;quot;4231647&amp;quot; &amp;quot;4231647&amp;quot; ...
..$ geometry:sfc_LINESTRING of length 436612; first list element: 'XY' num [1:2, 1:2] 487849 487861 5455038 5455039
..$ LIXID : int [1:436612] 1 2 3 4 5 6 7 8 9 10 ...
..- attr(*, &amp;quot;sf_column&amp;quot;)= chr &amp;quot;geometry&amp;quot;
..- attr(*, &amp;quot;agr&amp;quot;)= Factor w/ 3 levels &amp;quot;constant&amp;quot;,&amp;quot;aggregate&amp;quot;,..: NA NA
.. ..- attr(*, &amp;quot;names&amp;quot;)= chr [1:2] &amp;quot;osm_id&amp;quot; &amp;quot;LIXID&amp;quot;
&lt;/code>&lt;/pre>
&lt;h1 id="prepare-the-point-data">Prepare the point data&lt;/h1>
&lt;p>Here I need to ensure that the point data are lined up with the cleaned network data. I use a function called &lt;code>st_snap_points&lt;/code> which “snaps” the points to the location of the nearest road segment within a specified distance tolerance. The function is given below:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">st_snap_points&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">max_dist&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">1000&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nf">inherits&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;sf&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">nrow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nf">inherits&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;sfc&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="n">n&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">length&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">out&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">do.call&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">c&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">lapply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">seq&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">nrst&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">st_nearest_points&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">st_geometry&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">[i]&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">nrst_len&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">st_length&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">nrst&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">nrst_mn&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">which.min&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">nrst_len&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">if&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nf">as.vector&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">nrst_len[nrst_mn]&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">max_dist&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="kr">return&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">st_geometry&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">[i]&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">return&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">st_cast&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">nrst[nrst_mn]&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#34;POINT&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">[2]&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">return&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">out&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>We snap the points to our road network with a 20m tolerance:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">coll_snp&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">st_snap_points&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">collisions&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">streets_sf&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">max_dist&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">20&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">#this only returns the geometry - doesn&amp;#39;t preserve attributes&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">coll_snp&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">st_sf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">collisions&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">st_drop_geometry&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">geom&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">coll_snp&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="c1">#rerturn the attributes to the snapped locations&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h1 id="calculate-network-kernel-density">Calculate Network Kernel Density&lt;/h1>
&lt;p>The function I have created here for calculating density of events on a network follows the algorithm outline in Xie and Yan (2008) and takes advantage of functionality from &lt;code>sf&lt;/code>, &lt;code>igraph&lt;/code> and &lt;code>tidygraph&lt;/code> to to calculate shortest distances from each lixel in our network to the point processes we specify. Much of the code in this function is adapted from an excellent resource on using these packages for network analysis:
&lt;/p>
&lt;p>The &lt;code>network_kde()&lt;/code> function is defined below:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="c1">#function for calculating the centre of &lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">st_line_midpoints&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sf_lines&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">NULL&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">g&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">st_geometry&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sf_lines&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">g_mids&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">lapply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">g&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">coords&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">as.matrix&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># this is just a copypaste of maptools:::getMidpoints()):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">get_mids&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">coords&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dist&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">sqrt&lt;/span>&lt;span class="p">((&lt;/span>&lt;span class="nf">diff&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">coords[&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="n">]&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">^2&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="nf">diff&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">coords[&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">2&lt;/span>&lt;span class="n">]&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="n">^2&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dist_mid&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">sum&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dist&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="m">2&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dist_cum&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nf">cumsum&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dist&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">end_index&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">which&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dist_cum&lt;/span> &lt;span class="o">&amp;gt;&lt;/span> &lt;span class="n">dist_mid&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">[1]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">start_index&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">end_index&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="m">1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">start&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">coords[start_index&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">end&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">coords[end_index&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dist_remaining&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">dist_mid&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">dist_cum[start_index]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">mid&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">start&lt;/span> &lt;span class="o">+&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">end&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">start&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">*&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">dist_remaining&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">dist[start_index]&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">return&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">mid&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">mids&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">st_point&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">get_mids&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">coords&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">out&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">st_sfc&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">g_mids&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">crs&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">st_crs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sf_lines&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">out&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">st_sf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">out&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">out&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">bind_cols&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">out&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">sf_lines&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span> &lt;span class="nf">st_drop_geometry&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span> &lt;span class="nf">rename&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">geom&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">out&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">network_kde&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">lixel_list&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">point_process&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">bandwidth&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">100&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">n_cores&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">attribute&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">point_process_is_lixel_midpoint&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">FALSE&lt;/span>&lt;span class="p">){&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#3. Create a network of lixels by establishing the network topology between lixels as well as between lixels and lxnodes.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#Define topology for calculating shortest distances by converting lixel with half the length to calculate distances&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#The shorter the lixel length the more accurate the calculation of network distance from nearest node of source lixel to nearest node of target lixel&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Defining network topology...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">parallel&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">doParallel&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">igraph&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">tidygraph&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">sf&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">require&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">dplyr&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Create nodes at the start and end point of each edge&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">nodes&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">lixel_list&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">shortest_distance_network&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">st_coordinates&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">as_tibble&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">rename&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LIXID&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">L1&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">group_by&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LIXID&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">slice&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="nf">n&lt;/span>&lt;span class="p">()))&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">ungroup&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">start_end&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">rep&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#39;start&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#39;end&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">times&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">n&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="m">2&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Give each node a unique index&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">nodes&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">nodes&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">xy&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">paste&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">.$X&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">.$Y&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">xy&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">factor&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">xy&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">levels&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">unique&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">xy&lt;/span>&lt;span class="p">)))&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">group_by&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">xy&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">nodeID&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">cur_group_id&lt;/span>&lt;span class="p">())&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">ungroup&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">xy&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Combine the node indices with the edges&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">start_nodes&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">nodes&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">filter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">start_end&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s">&amp;#39;start&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">pull&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">nodeID&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">end_nodes&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">nodes&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">filter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">start_end&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s">&amp;#39;end&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">pull&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">nodeID&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lixel_list&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">shortest_distance_network&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">lixel_list&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">shortest_distance_network&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">from&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">start_nodes&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">to&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">end_nodes&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Remove duplicate nodes&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">nodes&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">nodes&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">distinct&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">nodeID&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">.keep_all&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">TRUE&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">select&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LIXID&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">start_end&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">st_as_sf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">coords&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#39;X&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#39;Y&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">st_set_crs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">st_crs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">lixel_list&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">shortest_distance_network&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># Convert to tbl_graph&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">graph&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">tbl_graph&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">nodes&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">nodes&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">edges&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">as_tibble&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">lixel_list&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">shortest_distance_network&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="n">directed&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">FALSE&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">graph&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">graph&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">activate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">edges&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">length&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">st_length&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">geometry&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lixel_list&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">shortest_distance_network&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="kc">NULL&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#4. Create the center points of all the lixels for the target lixel (lxcenters)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Calculating lixel midpoints (lxcenters)...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">lxcenters&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">st_line_midpoints&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">lixel_list&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">target_lixel&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#5. Select a point process occurring within the road network&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#input as function parameter&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#6. For each point find its nearest lixel. Count the number of points nearest to a lixel and assigned as property of lixel.&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#Points should be snapped to network within some distance threshold prior to&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">point_process_is_lixel_midpoint&lt;/span>&lt;span class="o">==&lt;/span>&lt;span class="kc">FALSE&lt;/span>&lt;span class="p">){&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Counting number of events on each lixel...&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">point_process&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">st_join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">point_process&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">lixel_list&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">target_lixel[&lt;/span>&lt;span class="s">&amp;#34;LIXID&amp;#34;&lt;/span>&lt;span class="n">]&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">join&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">st_is_within_distance&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">dist&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">0.001&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">#for each point assign the LIXID that it falls on&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">source_lixels&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">point_process&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span> &lt;span class="c1">#summarize the number of points by LIXID (e.g. count the points for each LIXID)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">filter&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">!&lt;/span>&lt;span class="nf">is.na&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LIXID&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">group_by&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LIXID&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">summarise&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n_events&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">n&lt;/span>&lt;span class="p">(),&lt;/span>&lt;span class="n">`.groups`&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;drop&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">st_drop_geometry&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">source_lixels&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">inner_join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">lxcenters&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">source_lixels&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">by&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;LIXID&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">#define geometry for source lixels&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">if&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">point_process_is_lixel_midpoint&lt;/span>&lt;span class="o">==&lt;/span>&lt;span class="kc">TRUE&lt;/span>&lt;span class="p">){&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">source_lixels&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">lxcenters&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n_events&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">paste0&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">sum&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">source_lixels&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">n_events&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="s">&amp;#34; events on &amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="nf">nrow&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">source_lixels&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="s">&amp;#34; source lixels&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#7. Define a search bandwidth, measured with the short path network distance&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#input as function parameter&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#8. Calculate the shortest-path network distance from each source lixel to lxcenter of all its neighouring lixels within the seach bandwidth&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">nearest_node_to_source_lixel&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">st_nearest_feature&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">source_lixels&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">nodes&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="c1">#find nodes from shortest distance network associated with each source lixel&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">nearest_node_to_lxcentre&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">st_nearest_feature&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">lxcenters&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">nodes&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="c1">#find nodes from shortest distance network associated with each lxcenters&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Calculating distances from each source lixel to all other lixel centers... &amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">cl&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">makeCluster&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">n_cores&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">registerDoParallel&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cores&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">cl&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">#parallel computing&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">distances&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">foreach&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="nf">foreach&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="nf">length&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">nearest_node_to_source_lixel&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="n">.packages&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;magrittr&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;igraph&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;tidygraph&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;sf&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span> &lt;span class="o">%dopar%&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">temp&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">distances&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">graph&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">graph&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">weights&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">graph&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span> &lt;span class="nf">activate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">edges&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span> &lt;span class="nf">pull&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">length&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">v&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">nearest_node_to_source_lixel[i]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">)&lt;/span>&lt;span class="n">[&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">nearest_node_to_lxcentre]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">data.frame&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LIXID&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">lxcenters[temp&lt;/span>&lt;span class="o">&amp;lt;=&lt;/span>&lt;span class="nf">max&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">bandwidth&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="n">]&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">LIXID&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">dist&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">temp[temp&lt;/span>&lt;span class="o">&amp;lt;=&lt;/span>&lt;span class="nf">max&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">bandwidth&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="n">]&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">stopCluster&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cl&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">rm&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;graph&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># gauss &amp;lt;-function(x) {&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># t1 &amp;lt;- 1/(sqrt(2*pi))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># t2 &amp;lt;- exp(-((x^2)/(2*bandwidth^2)))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># n &amp;lt;- (1/bandwidth)*(t1*t2)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># n &amp;lt;- ifelse(x&amp;gt;bandwidth,0,n)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># return(n)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># }&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># plot(gauss(0:(bandwidth*2)))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">quartic&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span>&lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">K&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="m">3&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="kc">pi&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">t1&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x^2&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">r^2&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">q&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">ifelse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="o">&amp;gt;&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="m">0&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">K&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="n">t1&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">q&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">r&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="n">q&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">return&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">q&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">LIXID&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">unlist&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">lapply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">lapply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">distances&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">`[`&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;LIXID&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">pull&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">distances_list&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">lapply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">lapply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">distances&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">`[`&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;dist&amp;#34;&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">pull&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">d_list&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">list&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">for&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">i&lt;/span> &lt;span class="kr">in&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="o">:&lt;/span>&lt;span class="nf">length&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">bandwidth&lt;/span>&lt;span class="p">)){&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">paste0&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Applying kernel density estimator with bandwidth of &amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">bandwidth[i]&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="s">&amp;#34;m ... &amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">d&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">lapply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">distances_list&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="kr">function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="nf">quartic&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">x&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">bandwidth[i]&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">d&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">mapply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">`*`&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">attribute&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">#multiply by attribute of source lixel&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">d&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">mapply&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">`*`&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">source_lixels&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">n_events&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="c1">#sum over number of events that occured on the source lixel&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">d_list[[i]]&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">data.frame&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">unlist&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">d&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">d_cols&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">as.data.frame&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">do.call&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">cbind&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">d_list&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">names&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">d_cols&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">paste0&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;kde_bw_&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">bandwidth&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">#sum densities over all lixels&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">density&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">cbind&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LIXID&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">d_cols&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">group_by&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LIXID&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">summarise&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">across&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">everything&lt;/span>&lt;span class="p">(),&lt;/span>&lt;span class="n">sum&lt;/span>&lt;span class="p">),&lt;/span>&lt;span class="n">`.groups`&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;drop&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">network_kde&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">left_join&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">lixel_list&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">target_lixel&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">density&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">by&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;LIXID&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">mutate&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">length&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">st_length&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">.)&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">%&amp;gt;%&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">replace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">.,&lt;/span> &lt;span class="nf">is.na&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">.)&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="m">0&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="kr">return&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="nf">list&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">network_kde&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">network_kde&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">neighbours&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">distances&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>As of now I have only set up the algorithm to use a quartic kernel.&lt;/p>
&lt;p>Next step is to compute the density of points on a network! The &lt;code>network_kde()&lt;/code> function implements parallel computing functionality using the &lt;code>parallel&lt;/code> and &lt;code>doParallel&lt;/code> packages so we need to specify how many cores are on the computer being used:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="n">n_cores&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="n">bigstatsr&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="nf">nb_cores&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Finally we specify the lixelized network we are working with, the point process from which we estimate densities of events, the bandwidths we wish to use in our density estimates and the number of cores for parallel computation. The last argument can be ignored for now and set to FALSE as it is something I’m working on to speed up computation if your point process is already associated with the segment (e.g. volumes of road users on a segment).&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">system.time&lt;/span>&lt;span class="p">({&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">collisions_network_kde&lt;/span> &lt;span class="o">&amp;lt;-&lt;/span> &lt;span class="nf">network_kde&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">lixel_list&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">lixel_list_25m&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">point_process&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">coll_snp&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">bandwidth&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">50&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="m">100&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="m">150&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="m">250&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">n_cores&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">n_cores&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">point_process_is_lixel_midpoint&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">FALSE&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">})&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;pre>&lt;code>[1] &amp;quot;Defining network topology...&amp;quot;
[1] &amp;quot;Calculating lixel midpoints (lxcenters)...&amp;quot;
[1] &amp;quot;Counting number of events on each lixel...&amp;quot;
[1] &amp;quot;733 events on 623 source lixels&amp;quot;
[1] &amp;quot;Calculating distances from each source lixel to all other lixel centers... &amp;quot;
[1] &amp;quot;Applying kernel density estimator with bandwidth of 50m ... &amp;quot;
[1] &amp;quot;Applying kernel density estimator with bandwidth of 100m ... &amp;quot;
[1] &amp;quot;Applying kernel density estimator with bandwidth of 150m ... &amp;quot;
[1] &amp;quot;Applying kernel density estimator with bandwidth of 250m ... &amp;quot;
user system elapsed
105.76 2.36 182.16
&lt;/code>&lt;/pre>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">glimpse&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">collisions_network_kde&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">network_kde&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;pre>&lt;code>Rows: 224,904
Columns: 8
$ osm_id &amp;lt;chr&amp;gt; &amp;quot;4231647&amp;quot;, &amp;quot;4231647&amp;quot;, &amp;quot;4231647&amp;quot;, &amp;quot;4231647&amp;quot;, &amp;quot;4231647&amp;quot;, &amp;quot;423…
$ geometry &amp;lt;LINESTRING [m]&amp;gt; LINESTRING (487848.5 545503..., LINESTRING (4878…
$ LIXID &amp;lt;int&amp;gt; 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, …
$ kde_bw_50 &amp;lt;dbl&amp;gt; 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
$ kde_bw_100 &amp;lt;dbl&amp;gt; 0.000000000, 0.000000000, 0.000000000, 0.000000000, 0.00000…
$ kde_bw_150 &amp;lt;dbl&amp;gt; 0.000000000, 0.000000000, 0.000000000, 0.000000000, 0.00000…
$ kde_bw_250 &amp;lt;dbl&amp;gt; 0.000000000, 0.000000000, 0.000000000, 0.000000000, 0.00000…
$ length [m] 24.40429 [m], 24.40429 [m], 24.40429 [m], 24.40429 [m], 24.40…
&lt;/code>&lt;/pre>
&lt;p>The output of the &lt;code>network_kde()&lt;/code> is an &lt;code>sf&lt;/code> object with &lt;code>LINESTRING&lt;/code> geometry, where each line segment is a lixel and the columns refer to density of events in network space for the specified bandwidths.&lt;/p>
&lt;h1 id="mapping-out-the-results">Mapping out the results&lt;/h1>
&lt;p>Below we can then map out the results. We will use the 150m bandwidth in this example:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ggplot&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">geom_sf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">study_area&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">color&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">NA&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">fill&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;gray5&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">geom_sf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collisions_network_kde&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">network_kde&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="nf">aes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">color&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">kde_bw_150&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">scale_color_viridis_c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">option&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;C&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">direction&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;Density&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1"># geom_sf(data=mask,color=NA,fill=&amp;#34;white&amp;#34;)+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">theme_void&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">theme&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">panel.background&lt;/span>&lt;span class="o">=&lt;/span> &lt;span class="nf">element_rect&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fill&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">NA&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">color&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">NA&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">legend.position&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;top&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">legend.title.align&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">0&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">legend.key.size&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">unit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#39;cm&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="c1">#change legend key size&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">legend.key.height&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">unit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">0.5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#39;cm&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="c1">#change legend key height&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">legend.key.width&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">unit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">1.5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#39;cm&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">coord_sf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">xlim&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">483690.9&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="m">499329.2&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ylim&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">5450534.8&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="m">5463381.0&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>
&lt;figure >
&lt;div class="flex justify-center ">
&lt;div class="w-full" >&lt;img src="kde_files/figure-commonmark/unnamed-chunk-18-1.png" alt="" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;p>Zooming into downtown:&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-r" data-lang="r">&lt;span class="line">&lt;span class="cl">&lt;span class="nf">ggplot&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">geom_sf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">study_area&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">color&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">NA&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">fill&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;gray5&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">geom_sf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">collisions_network_kde&lt;/span>&lt;span class="o">$&lt;/span>&lt;span class="n">network_kde&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="nf">aes&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">color&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">kde_bw_150&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">scale_color_viridis_c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">option&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;C&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">direction&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">&amp;#34;Density&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">theme_void&lt;/span>&lt;span class="p">()&lt;/span>&lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">theme&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">panel.background&lt;/span>&lt;span class="o">=&lt;/span> &lt;span class="nf">element_rect&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">fill&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kc">NA&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="n">color&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="kc">NA&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">legend.position&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="s">&amp;#34;top&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">legend.title.align&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="m">0&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">legend.key.size&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">unit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#39;cm&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="c1">#change legend key size&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">legend.key.height&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">unit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">0.5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#39;cm&amp;#39;&lt;/span>&lt;span class="p">),&lt;/span> &lt;span class="c1">#change legend key height&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">legend.key.width&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">unit&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">1.5&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s">&amp;#39;cm&amp;#39;&lt;/span>&lt;span class="p">))&lt;/span>&lt;span class="o">+&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nf">coord_sf&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">xlim&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">491321.39853389-1000&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="m">491321.39853389+1100&lt;/span>&lt;span class="p">),&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ylim&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="nf">c&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="m">5459015.689874-1000&lt;/span>&lt;span class="p">,&lt;/span>&lt;span class="m">5459015.689874+1000&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>
&lt;figure >
&lt;div class="flex justify-center ">
&lt;div class="w-full" >&lt;img src="kde_files/figure-commonmark/unnamed-chunk-19-1.png" alt="" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;p>That’s the network KDE function as it is for now. Some challenges going forward are computation time for higher resolution pixels and implementing different kernels other than quartic.&lt;/p>
&lt;details>
&lt;summary>
Reproducibility receipt
&lt;/summary>
&lt;pre>&lt;code>[1] &amp;quot;2025-09-03 16:15:49 PDT&amp;quot;
Local: main C:/Users/micha/Documents/GitHub/mbcalles.github.io
Remote: main @ origin (https://github.com/mbcalles/mbcalles.github.io)
Head: [2a60de6] 2025-09-03: publication
R version 4.4.1 (2024-06-14 ucrt)
Platform: x86_64-w64-mingw32/x64
Running under: Windows 11 x64 (build 26100)
Matrix products: default
locale:
[1] LC_COLLATE=English_Canada.utf8 LC_CTYPE=English_Canada.utf8
[3] LC_MONETARY=English_Canada.utf8 LC_NUMERIC=C
[5] LC_TIME=English_Canada.utf8
time zone: America/Vancouver
tzcode source: internal
attached base packages:
[1] parallel stats graphics grDevices utils datasets methods
[8] base
other attached packages:
[1] doParallel_1.0.17 iterators_1.0.14 foreach_1.5.2 readr_2.1.5
[5] stringr_1.5.1 ggplot2_3.5.1 sfnetworks_0.6.4 sf_1.0-18
[9] dplyr_1.1.4 osmdata_0.2.5 cancensus_0.5.7 stplanr_1.2.2
[13] igraph_2.1.1 tidygraph_1.3.1
loaded via a namespace (and not attached):
[1] tidyselect_1.2.1 viridisLite_0.4.2 farver_2.1.2
[4] fastmap_1.2.0 spatstat.geom_3.3-3 spatstat.explore_3.3-3
[7] bigassertr_0.1.7 flock_0.7 digest_0.6.37
[10] rpart_4.1.23 timechange_0.3.0 lifecycle_1.0.4
[13] spatstat.data_3.1-2 magrittr_2.0.3 compiler_4.4.1
[16] rlang_1.1.4 tools_4.4.1 utf8_1.2.4
[19] yaml_2.3.10 knitr_1.48 labeling_0.4.3
[22] bit_4.5.0 classInt_0.4-10 curl_5.2.3
[25] xml2_1.3.6 rmio_0.4.0 abind_1.4-8
[28] KernSmooth_2.23-24 bigstatsr_1.6.2 withr_3.0.2
[31] purrr_1.0.2 grid_4.4.1 polyclip_1.10-7
[34] fansi_1.0.6 git2r_0.35.0 e1071_1.7-16
[37] colorspace_2.1-1 scales_1.3.0 spatstat.utils_3.1-0
[40] cli_3.6.3 rmarkdown_2.28 crayon_1.5.3
[43] generics_0.1.3 rstudioapi_0.17.1 httr_1.4.7
[46] tzdb_0.4.0 DBI_1.2.3 proxy_0.4-27
[49] splines_4.4.1 spatstat.model_3.3-2 vctrs_0.6.5
[52] Matrix_1.7-0 jsonlite_1.8.9 geojsonsf_2.0.3
[55] hms_1.1.3 bit64_4.5.2 tensor_1.5
[58] bigparallelr_0.3.2 spatstat.univar_3.0-1 tidyr_1.3.1
[61] units_0.8-5 goftest_1.2-3 parallelly_1.45.1
[64] glue_1.8.0 spatstat.random_3.3-2 lwgeom_0.2-14
[67] codetools_0.2-20 cowplot_1.1.3 lubridate_1.9.3
[70] stringi_1.8.4 gtable_0.3.6 deldir_2.0-4
[73] munsell_0.5.1 tibble_3.2.1 pillar_1.9.0
[76] rappdirs_0.3.3 htmltools_0.5.8.1 R6_2.5.1
[79] httr2_1.0.5 sfheaders_0.4.4 vroom_1.6.5
[82] evaluate_1.0.1 lattice_0.22-6 class_7.3-22
[85] Rcpp_1.0.13 spatstat.linnet_3.2-2 nlme_3.1-164
[88] spatstat.sparse_3.1-0 mgcv_1.9-1 xfun_0.48
[91] pkgconfig_2.0.3
&lt;/code>&lt;/pre>
&lt;/details></description></item></channel></rss>