Dear list:

I encountered some problems using the function point.in.polygon() of the sp 
package, when trying to determine whether some points lye inside, outside, on 
the border or on a vertice of a polygon.

I have a list of point I know should lye right on the border of a polygon, but 
some of them are not classified as such by point.in.polygon() (see the example 
code below).

To make a long story short I am working on ternary variables that sum to 100% 
(soil texture data), that can be plotted on a ternary diagram (soil texture 
diagram) & classified according to subdivisions of the diagram (soil texture 
class). For a given data point, when one or more of the the 3 variable is equal 
to 0, and when their sum is 100%, I know the point lies on the border of the 
ternary diagram. Here I got a case where some of these points are NOT 
classified as "on the border" of the polygon that defines the limits of my 
diagram (by point.in.polygon).

The example below shows a simple example with one polygon with a right angle 
(easy to plot).

I suspect this is a problem of accuracy (as I already got similar problems with 
a code I made, that proved to be due to accuracy problems arising from from 
trigonometric calculations), but I would like to know if I am right or if this 
is another problem (maybe in my own code)... I must say that with 'real & 
uncertain soil data', I don't really care to know if a point is right on the 
border of a polygon, but it is good to know what cause the problem!

Thanks for any help

Julien

# --- --- --- ---
require(sp)

# Dummy ternary data to be plotted & classified as in or out a polygon
# All should be on the border
test.bug <- data.frame(
    #              1      2      3      4      5      6      7      8
    "CLAY" = c(10.50, 11.05, 20.91, 20.95, 20.00, 00.00, 01.96, 01.24),
    "SILT" = c(00.00, 00.00, 79.09, 79.05, 80.00, 02.00, 00.00, 00.00),
    "SAND" = c(89.50, 88.95, 00.00, 00.00, 00.00, 98.00, 98.04, 98.76)
)   #

# ACoordinates of the polygon
my.pol <- data.frame( "x" = c(0,0,100), "y" = c(0,100,0) )

# Set up plot scene
plot( x = my.pol$"x", y = my.pol$"y" )

# Draw the polygon
polygon(
    x      = my.pol$"x",
    y      = my.pol$"y",
    border = "red",
    col    = "lightgray"
)   #

# Draw the point
points(
    x   = test.bug[,"SILT"],
    y   = test.bug[,"CLAY"],
    pch = 2
)   #

# Classify the points
point.in.polygon(
    point.x = test.bug[,"SILT"],
    point.y = test.bug[,"CLAY"],
    pol.x   = my.pol$"x",
    pol.y   = my.pol$"y"
)   #
# [1] 2 2 0 1 2 2 2 2
# All the points should be 2


        [[alternative HTML version deleted]]

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to