2017-08-10 1 views
0

Durch den Versuch, ein Schnittpunktergebnis von einem einzigen Punkt und einem einzigen Polygon zu erhalten habe ich was ich glaube, kann nur ein Fehler im R-Raster sein Paketschnittfunktion.Sehr wahrscheinlich Fehler in der R-Paket-Schnittpunkt-Funktion beim Schneiden von 1 Polygon mit 1 Punkt

Ich habe 1 Polygon und 1 Punkt, und verwenden Sie schneiden sich wie folgt zusammen:

intersect(a_point, a_polygon) 

Wo a_point ein id-Attribut enthält. Dies schlägt mit dem Fehler:

Error in j[, 2] : incorrect number of dimensions

Allerdings, wenn ich die Argumente umkehren und zu tun:

intersect(a_polygon, a_point) 

Es funktioniert gut, aber die ID von dem Punkt Shape-Datei als Teil der nicht zurück Ergebnis, das ich benötige. Das ist erwartetes Verhalten, so gut, aber ich brauche es anders herum zu arbeiten.

Um auszuschließen, dass meine Polygon- oder Punktdaten eine Besonderheit aufweisen, habe ich ein einzelnes Polygon- und Einzelpunkt-Geo-Objekt erstellt und dieselbe Hypothese getestet, und mit diesen "rohen" Objekten ist das gleiche Ergebnis wie oben aufgetreten.

Im Folgenden ist der Code für diese beiden ‚fake‘ Objekte auf Vollständigkeit zu erzeugen und so, dass sie wiedergegeben werden können:

test_list_x = list(530124, 530125) #For when I use 2 points 
test_list_y = list(176949, 176950) #For when I use 2 points 

data_frame_object = data.frame(530124, 176950) 
names(data_frame_object) = c("Longitude", "Latitude") 
coordinates(data_frame_object)=~Longitude+Latitude 
proj4string(data_frame_object)=CRS("+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +datum=OSGB36 +units=m +no_defs +ellps=airy +towgs84=446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894") 
fake_point_shape_object=SpatialPointsDataFrame(data_frame_object, data.frame(id=1:length(data_frame_object))) 


coords = matrix( nrow=5, ncol=2) 
coords[1,1] = 530106.8 
coords[1,2] = 176953.3 
coords[2,1] = 530127.5 
coords[2,2] = 176953.3 
coords[3,1] = 530127.5 
coords[3,2] = 176933.3 
coords[4,1] = 530106.8 
coords[4,2] = 176933.3 
coords[5,1] = 530106.8 
coords[5,2] = 176953.3 
my_fake_polygon = Polygon(coords) 

polygon_list = list(my_fake_polygon) 

polygon_set <- lapply(seq_along(polygon_list), function(i) Polygons(list(polygon_list[[i]]), i )) 

new_polygons <- SpatialPolygons(polygon_set) 
[email protected] = CRS("+proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +datum=OSGB36 +units=m +no_defs +ellps=airy +towgs84=446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894") 

df <- data.frame("1") 
names(df) = "id" 

my_fake_polygon <- SpatialPolygonsDataFrame(new_polygons,df) 

Jetzt hier ist die Sache, wenn ich 2 Punkte erstellen nebeneinander (so sie sind beide innerhalb des Polygons) anstatt nur eines, es funktioniert gut, kein Fehler. Es wird vorgeschlagen, dass es einen Fehler gibt, der mit der Schnittmenge zwischen 1 Punkt und 1 Polygon verbunden ist, WENN der Punkt ein Attribut enthält, das im Schnittpunktprozess zurückgegeben werden soll.

Sie könnten fragen, warum Sie das Attribut tatsächlich zurückgeben müssen, wenn es nur einen Punkt gibt, weil es sich um einen iterativen Prozess handelt, bei dem es sich möglicherweise nicht um einen einzigen Punkt handelt, sondern um keinen oder viele.

Ich würde jemanden schätzen, der diesen Fehler erklärt oder meine Entdeckungen bestätigt.

Antwort

0

Leider kann ich nicht Ihre intersect Fehler Frage beantworten, aber es könnte einfacher sein, für jetzt sp zu verwenden :: über zurückzukehren Polygon

# dummy polygon 
xym <- as.matrix(data.frame(x=c(16.48438,17.49512,24.74609,22.59277,16.48438), 
y=c(59.73633,55.12207,55.03418,61.14258,59.73633))) 

# make into SpatialPolygon 
p = Polygon(xym) 
ps = Polygons(list(p),1) 
sps = SpatialPolygons(list(ps)) 

# Promote to SPDF and give an attribute 
SPDF = SpatialPolygonsDataFrame(sps, data.frame(N = "hello", row.names = 1)) 

# make 2 points, one inside the polygon and one outside 
p <- data.frame(x=c(16,18),y=c(58,58)) 
coordinates(p) <- ~x + y 

# plot to check 
plot(sps) 
plot(p,add=T) 

# perform the over, returns a named vector for every point in the SpatialPoints 
res <- unname(over(p,SPDF)) 

# promote points to SpatialPointsDataFrame and put in new polygon attribute 
data <- data.frame(ID=row.names(p),pol=res) 
sp <- SpatialPointsDataFrame(p, data) 
+0

Vielen Dank, ich habe tatsächlich eine Arbeit für den Fehler entwickelt, es ist ziemlich unangenehm, dass es den Fehler fängt, wenn es passiert, und definiert den Punkt-Index, der von der Schnittpunkt-Funktion manuell kommen sollte. Ich bin sicher, dass jemand Ihren Kommentar nützlich finden wird! –

1

Hier sind Ihre Beispieldaten in einem prägnanten zu den Punkten Attribute Weg.

library(raster) 

pnt <- SpatialPoints(cbind(530124, 176950)) 
pol <- spPolygons(matrix(c(530106.8, 530127.5, 530127.5, 530106.8, 530106.8, 176953.3, 176953.3, 176933.3, 176933.3, 176953.3), ncol=2)) 

Jetzt das Problem veranschaulichen.

intersect(pol, pnt) 
#class  : SpatialPolygons 
#features : 1 
#extent  : 530106.8, 530127.5, 176933.3, 176953.3 (xmin, xmax, ymin, ymax) 
#coord. ref. : NA 

# this fails 
intersect(pnt, pol) 
#Loading required namespace: rgeos 
#Error in j[, 2] : incorrect number of dimensions 

# but it works with two points! 
intersect(bind(pnt, pnt), pol) 
#class  : SpatialPoints 
#features : 2 
#extent  : 530124, 530124, 176950, 176950 (xmin, xmax, ymin, ymax) 
#coord. ref. : NA 

Dies waren ein weiterer drop=TRUE durch die R Verzug „dropping“ Matrizen Vektoren verursacht Fehler, wenn eine einzige Zeile ausgewählt ist. Dies wurde in der Raster-Version 2.6-11 behoben (noch nicht bei CRAN).

Verwandte Themen