JeremyGelb / spNetwork

An R package to perform spatial analysis on networks.
GNU General Public License v2.0
34 stars 2 forks source link

Error in K-function Estimation #8

Closed Janjua1991 closed 2 years ago

Janjua1991 commented 2 years ago

Hi Jeremy. Thank you for updating and improving the spNetwork package.

I am facing some issues while running the k-function code. I am using projected coordinates for both line and point shapefiles. The error I am getting is :

Error in coordsLines[[nearest_line_index[x]]] : attempt to select less than one element in get1index

Can you please help me to resolve this error? Thanks

JeremyGelb commented 2 years ago

Hello There!

First of all, thank you for your interest in spNetwork! Could you send me a minimal sample of the data your are using and some code to replicate the bug?

Janjua1991 commented 2 years ago

I have reduced the network size and when i run the code again, this time i got different error.

I was running following Code:

library(spNetwork) library(tmap) library(rgdal) library(sf)

Lines<- read_sf('D:/Data for jeremy/Sample Data/Sample_lines.shp') Points <- read_sf('D:/Data for jeremy/Sample Data/Sample_Points.shp')

tm_shape(Lines) + tm_lines("black") + tm_shape(Points) + tm_dots(col = "red", size = 0.1)

k_Incidents <- kfunctions(Lines, Points, start = 1, end = 5000, step = 50, width = 1000, nsim = 10, resolution = 50, verbose = FALSE, conf_int = 0.05)

This is the error i got this time: Error in data.frame(obs_k = k_vals, lower_k = k_stats[1, ], upper_k = k_stats[2, : arguments imply differing number of rows: 101, 100

In another attempt, I tried to fix network topology issues. but again in the end I got an issue. this was the error message I received when I was using the whole network and full point data set. Error: cannot allocate vector of size 783.2 Mb

Sample Data.zip

JeremyGelb commented 2 years ago

Ok, I verified your example and indeed you found a bug! Thank you for sending me the data to reproduce it. It is very appreciated.

I will correct it as soon as possible. If you need your results quickly, a slight modification in your code would do the trick : replace the value of start by 0:

library(spNetwork)
library(tmap)
library(sf)

Lines<- st_read('C:/Users/Gelb/Desktop/TEMP/test_error/Sample.Data/Sample_lines.shp')
Points <- st_read('C:/Users/Gelb/Desktop/TEMP/test_error/Sample.Data/Sample_Points.shp')

tm_shape(Lines) +
  tm_lines("black") +
  tm_shape(Points) +
  tm_dots(col = "red", size = 0.1)

k_Incidents <- kfunctions(Lines, Points,
                          start = 0, end = 5000, step = 50,
                          width = 1000, nsim = 10, resolution = 50,
                          verbose = TRUE, conf_int = 0.05)

I will close this issue when the bug will be properly corrected.

Janjua1991 commented 2 years ago

Thank you for your quick response and guidance. I am facing another error as well, please guide me on this too: Error in igraph::distances(graph, v = snapped_events$vertex_id, to = snapped_events$vertex_id) : At core/paths/dijkstra.c:148 : Duplicate vertices in `to', this is not allowed, Invalid value

Janjua1991 commented 2 years ago

I am providing here a complete code with data to replicate the results. I am also sharing the outcome showing the error:

Code

library(spNetwork)
library(tmap)
library(sf)

Lines<- st_read('D:/Data for jeremy/Datafile/Lines.shp')
Points<- st_read('D:/Data for jeremy/Datafile/Points.shp')

tm_shape(Lines) +
  tm_lines("black") +
  tm_shape(Points) +
  tm_dots(col = "red", size = 0.1)

k_results <- kfunctions(Lines, Points,
                          start = 0, end = 500, step = 10,
                          width = 20, nsim = 50, resolution = 50,
                          verbose = TRUE, conf_int = 0.05)

Outcome with error in last line

> library(spNetwork)
> library(tmap)
> library(sf)
> 
> Lines<- st_read('D:/Data for jeremy/Datafile/Lines.shp')
Reading layer `Lines' from data source `D:\Data for jeremy\Datafile\Lines.shp' using driver `ESRI Shapefile'
Simple feature collection with 19155 features and 10 fields
Geometry type: LINESTRING
Dimension:     XY
Bounding box:  xmin: -2125768 ymin: 4605261 xmax: -2112230 ymax: 4618447
Projected CRS: WGS 84 / UTM zone 15N
> Points<- st_read('D:/Data for jeremy/Datafile/Points.shp')
Reading layer `Points' from data source `D:\Data for jeremy\Datafile\Points.shp' using driver `ESRI Shapefile'
Simple feature collection with 5688 features and 2 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: -2125460 ymin: 4605663 xmax: -2112540 ymax: 4618229
Projected CRS: WGS 84 / UTM zone 15N
> 
> tm_shape(Lines) +
+   tm_lines("black") +
+   tm_shape(Points) +
+   tm_dots(col = "red", size = 0.1)
> 
> 
> k_results <- kfunctions(Lines, Points,
+                           start = 0, end = 500, step = 10,
+                           width = 20, nsim = 50, resolution = 50,
+                           verbose = TRUE, conf_int = 0.05)
[1] "Preparing data ..."
[1] "Snapping points on lines ..."
[1] "Building graph ..."
Error in igraph::distances(graph, v = snapped_events$vertex_id, to = snapped_events$vertex_id) : 
  At core/paths/dijkstra.c:148 : Duplicate vertices in `to', this is not allowed, Invalid value
>
JeremyGelb commented 2 years ago

Thank you again for the detailed problem description! It is really appreciated.

The error is caused by points that share the same location when they are snapped on the network. I will provide an error message about this case in the next version. Currently, you could just set the parameter agg to a small value like 2 (meters) so that points in a two meters radius will be merged (and their weights added). This should be a reasonable approximation and the function will work.

Again, thank you very much for your participation in spNetwork's bugs resolving!

JeremyGelb commented 2 years ago

This has been corrected in the new dev version. I am closing the issue. Feel free to open a new one if you find another bug