[R-sig-Geo] Calculate shortest distance between points belonging to different polygons
Ivan Palmegiani
pan.sapiens.it at gmail.com
Wed Feb 18 15:11:40 CET 2015
Dear Adrian,
Thanks for your explanation.
My goal is measuring the minimum distance from each data point to its
nearest neighbor belonging to a different polygon (a pair of point then).
In fact, this distance is in the matrix resulting from
> nn.pol<-nndist(randp.df[,c(2,3)], by=factor(randp.df$Polygon_ID)
The polygons I'm considering are relatively small and distant each other
so, in my case, the distance between data points belonging to the same
polygon is certainly shorter that the distance to data points belonging
to other polygons. Thus, the smallest value of each row is the distance
from a data point to its nearest neighbor within the same polygon, while
the second smallest value of each row is the distance from a data point
and its nearest neighbor belonging to another polygon.
The latter value is the distance I want and I extracted it from the
matrix using the following /for/ loop:
> min.dist<-NULL
> for(i in 1:nrow(nn.pol)){
+ min.dist.temp<-min(nn.pol[i,] [nn.pol[i,] != min(nn.pol[i,])])
+ min.dist<-as.vector(c(min.dist,min.dist.temp))
+ }
Maybe not the most elegant way to do it...but it worked. The result is a
vector whose length is equal to the number of data point.
> head(nn.dist.hs)
[1] 26370.49 15070.99 27587.33 15722.28 15186.39 31147.84
If the polygons were large and tangential or overlapping, I could not
know which value I should have extracted because the distance between
two points belonging to the same polygon might be larger than the
distance between two points belonging to different polygons.
Thus, my question: is there a way to calculate the distance from each
data point and its nearest neighbor (only one) belonging to a different
polygon?
Regards,
Ivan
On 18-Feb-15 13:02, Adrian Baddeley wrote:
> After you do
> > nn.within.pol<-nndist(randp.df[,c(2,3)], by=factor(randp.df$Polygon_ID))
>
> the result nn.within.pol is a matrix with one row for each data point, and
> one column for each polygon. The entry on row i, column j is the distance
> from the i-th data point to its nearest neighbour in polygon j.
>
> It's still not clear to me what you wanted to calculate.
>
> Do you want the minimum distance between any two points in different polygons?
> For each possible pair of polygons? or... ?
>
> The command
>
> > aggregate(nn.within.pol, by=list(from=factor(randp.df$PolygonID)), min)
>
> would yield a matrix, with one row and column for each polygon,
> in which the [i,j] entry is the minimum distance between any point in polygon i
> and any point in polygon j. On the diagonal the [i,i] entry would give the minimum
> nearest-neighbour distance for the pattern of points within polygon i.
>
>
> Prof Adrian Baddeley FAA
> Curtin University
> ________________________________________
> From: Ivan Palmegiani [pan.sapiens.it at gmail.com]
> Sent: Wednesday, 18 February 2015 12:32 PM
> To: Adrian Baddeley
> Cc: r-sig-geo at r-project.org
> Subject: Re: [R-sig-Geo] Calculate shortest distance between points belonging to different polygons
>
> Dear Adrian,
>
> Thank you very much!
>
> I made the change you suggested and the outcome is not exactly the one I wanted...but it's very close to it!
>
>> library(spatstat)
>> nn.within.pol<-nndist(randp.df[,c(2,3)], by=factor(randp.df$Polygon_ID))
>> nn.within.pol
> 1 2 3 4 5 6 7 8 9 10 11 12 13
> [1,] 77758.488 71978.036 33715.961 62236.2421 84528.6758 47206.9703 26370.4913 39448.7910 40198.916 68559.0147 67769.69 39298.45411 2579.422
> [2,] 63404.130 93535.612 64780.940 21597.4530 32485.1889 1391.8891 38473.2915 69642.7457 24374.408 15070.9926 70237.22 35217.62792 49217.807
> [3,] 37861.018 53839.721 27587.333 59658.5379 58107.6351 35133.6718 48282.9013 75710.3428 48898.652 52273.7298 33882.71 59.85628 36756.945
> ...
> [98,] 114435.572 111577.598 73735.852 65518.7127 102369.5236 65629.7084 29330.3308 955.2648 39271.208 81234.4457 107270.98 74005.63912 30371.918
> [99,] 32283.616 52705.045 28666.796 61665.1649 55854.9164 36094.8633 53239.2478 81208.2781 52669.590 52158.4953 30242.29 3166.00894 42467.270
> [100,] 38187.593 53418.183 27001.456 60050.0374 58795.8736 35555.5710 48200.6059 75445.7086 49047.448 52858.1932 33791.42 705.25663 36323.229
>
> In fact, I realized that I do not need to make recourse to aggregate() because in the matrix above I already have the information I need. I just need to extract it.
> Is there any way to prevent the function to calculate the distance between a point and its nn within the same group (i.e. distance [1, 13]; [2, 6]; [3, 12]; etc.)?
>
> If not, I will just extract the second shortest distance per point (the shortest one is certainly within the same group) and I will get exactly the information I need.
>
> Thanks again!
>
> Sincerely,
>
> Ivan
>
>
> On 17-Feb-15 16:01, Adrian Baddeley wrote:
>
> Ivan Palmegiani <pan.sapiens.it at gmail.com><mailto:pan.sapiens.it at gmail.com> writes:
>
>
>
> I'm handling a SpatialPointsDataFrame with 100 ramdom points distributed
> within 13 different polygons.
>
>
>
> > randp
>
>
> coordinates Point_ID Polygon_ ID
> 0 (690926.8, 7522595) 1_hs 13
> 1 (696727.1, 7576122) 2_hs 6
>
>
>
>
>
> I need to calculate the shortest distance between points belonging to
> different polygons. Basically I'd like to do what nndist {spatstat} does.
> The difference is that the distance should be calculated between
> groups of points instead of within a group of points.
>
>
>
> Well, nndist {spatstat} does that too.
>
>
>
> I tried to use "aggregate" as suggested below but it didn't work out for me.
> http://www.inside-r.org/packages/cran/spatstat/docs/nndist
>
>
>
>
>
> Please find my try below:
>
>
>
>
>
> > randp.df<-data.frame(randp)
> > randp.hs.df
> Point_ID coords.x1 coords.x2 Polygon_ ID
> 0 1_hs 690926.8 7522595 13
> 1 2_hs 696727.1 7576122 6
> 2 3_hs 723480.7 7546594 12
>
>
>
>
>
> library(spatstat)
>
>
>
>
>
> # Calculate nearest neighbors within a polygon
> > nn.within.pol<-nndist(randp.df[,c(2,3)],by=marks(randp.df$Polygon_ID))
>
>
>
> 'marks' is not appropriate here.
> marks() is a function that extracts the marks from a marked point pattern (class 'ppp')
> but you are applying it to a numeric vector. The result is NULL.
>
> The argument 'by' should be a factor that determines the grouping.
>
> Just change 'marks' to 'factor' so that the numeric polygon ID will be treated as a factor,
>
> nn.within.pol<-nndist(randp.df[,c(2,3)],by=factor(randp.df$Polygon_ID))
>
> and proceed as before (also changing the other instances of 'marks' to 'factor')
>
>
>
> Adrian Baddeley
> spatstat author
>
>
>
>
[[alternative HTML version deleted]]
More information about the R-sig-Geo
mailing list