Page 1 of 1

How to create a Donut Polygon

PostPosted: Tue Dec 04, 2018 7:49 pm
by Didier Renard
This post addresses the problem of selecting samples which lie:
- inside a large polygon
- outside a small polygon (included in the large one).
An example is a polygon delineating a part of the ocean [large polygon], excluding the islands [small polygon].

This would be solved by attaching an attribute (HOLE or NOT HOLE) to each polyset defining the polygon. But this is not yet available.

In the mean time, the following example gives a possible solution:

Let us create a data set constituted of 100 samples uniformly spread within a square of 1km side:

Code: Select all
db = db.create(x1=runif(100), x2=runif(100), z1=rnorm(100))


Let us create the two polygon: P1 for the large polygon and P2 for the small polygon. These two polygons are created as squares.

Code: Select all
P1 = polygon.create(x=c(0.2,0.8,0.8,0.2,0.2),y=c(0.2,0.2,0.8,0.8,0.2))
P2 = polygon.create(x=c(0.3,0.7,0.7,0.3,0.3),y=c(0.3,0.3,0.7,0.7,0.3))


In the following figure, we can see the data set, together with the large polygon (P1 in blue) and the small polygon (P2 in red).
Code: Select all
plot(db)
plot(P1,col="blue",add=TRUE)
plot(P2,col="red",add=TRUE)


a1.png
a1.png (29.95 KiB) Viewed 29049 times


We now select the samples belonging to P1 (using db.polygon). Then we run this same function to exclude samples belonging to P2. And we combine these two selections:
Code: Select all
db = db.polygon(db,P1,flag.out=FALSE)
db = db.polygon(db,P2,flag.out=TRUE,combine="and")


Now we can produce the same graphic as before again, adding the active samples as black bullets.

Code: Select all
plot(db.sel(db))
plot(P1,add=TRUE,col="blue")
plot(P2,add=TRUE,col="red")
plot(db,add=TRUE,col="black",pch=19)

a2.png
a2.png (30.89 KiB) Viewed 29049 times