[R-sig-Geo] library(shapefiles): write PolyLineZ or PolygonZ shapes?
Albrecht Gebhardt
albrecht.gebhardt at uni-klu.ac.at
Tue Jul 10 16:09:15 CEST 2007
hi,
I'm trying to write some 3D polygoins as ESRI shapefile.
While write.shp() has some code for type==13 or 15 (which is PolyLineZ
and PolygonZ), there is no such part in convert.to.shapefile().
example:
first generate some X,Y,Z data and triangulate it (only X and Y):
library(tripack)
xyz<-as.data.frame(cbind(runif(5),runif(5),rnorm(5)))
colnames(xyz)<-c("x","y","z")
t<-tri.mesh(xyz$x,xyz$y)
tr<-triangles(t)
# generate one polyline per triangle:
Id <- NULL; X <- NULL; Y <- NULL; Z <- NULL
for(i in 1:dim(tr)[1]) {
Id <- c(Id,rep(i,3))
X <- c(X, xyz$x[tr[i,1]], xyz$x[tr[i,2]], xyz$x[tr[i,3]])
Y <- c(Y, xyz$y[tr[i,1]], xyz$y[tr[i,2]], xyz$y[tr[i,3]])
Z <- c(Z, xyz$z[tr[i,1]], xyz$z[tr[i,2]], xyz$z[tr[i,3]])
}
dd <- data.frame(Id=Id,X=X,Y=Y, Z=Z)
dd contains now something like (three triangles):
Id X Y Z
1 1 0.47578460 0.7062264 1.7720352
2 1 0.07356501 0.6989611 -0.3850338
3 1 0.24476600 0.2560522 0.5450287
4 2 0.47578460 0.7062264 1.7720352
5 2 0.24476600 0.2560522 0.5450287
6 2 0.47912981 0.2355883 -0.2675531
7 3 0.47578460 0.7062264 1.7720352
8 3 0.47912981 0.2355883 -0.2675531
9 3 0.78672806 0.3244467 0.8620736
If I now try (in analogy to the write.shapefile PolyLine example)
library(shapefiles)
ddTable <- data.frame(Id=1:dim(tr)[1], Name=as.character(1:dim(tr)[1]))
ddShapefile <- convert.to.shapefile(dd, ddTable, "Id", 13)
write.shapefile(ddShapefile, "~/test/tri", arcgis=TRUE)
I get an error:
Fehler in "dimnames<-.data.frame"(`*tmp*`, value = list(c("1", "2", "3", :
ungültige 'dimnames' für data frame gegeben # invalid dimnames
Now I tried to modify convert.to.shapefile() (see attachement) so that
it somehow handles the type==13/15 case (but it contains some blind
guesses regarding the content.sizes, I should read
http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf more
precisely) and then at least it runs:
ddShapefile <- my.convert.to.shapefile(dd, ddTable, "Id", 13)
write.shapefile(ddShapefile, "~/test/tri", arcgis=TRUE)
I can even re-read this file with
f <- read.shapefile("~/test/tri")
and "f" looks identical (but I didnt compare it bit by bit) to
"ddShapefile"
But GRASS doesn't like it, it only reads the first triangle:
GRASS 6.0.1 (import_xy):~ > v.in.ogr dsn=~/test/tri.shp
output=tri_import min_area=0.0001 snap=-1 -z
Projection of input dataset and current location appear to match.
Proceeding with import...
Layer: tri
WARNING: 2 features without geometry.
-----------------------------------------------------
Building topology ...
1 primitives registered
Building areas: 100%
0 areas built
0 isles built
Attaching islands:
Attaching centroids: 100%
Topology was built.
Number of nodes : 2
Number of primitives: 1
Number of points : 0
Number of lines : 1
Number of boundaries: 0
Number of centroids : 0
Number of areas : 0
Number of isles : 0
So my question is:
Is it really necessary to extend functionality of convert.to.shapefile()
to be able to write 3D polygons/polylines or am I simply missing the
correct function?
Thanks
Albrecht
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: my.convert.to.shapefile.R
URL: <https://stat.ethz.ch/pipermail/r-sig-geo/attachments/20070710/02383d65/attachment.pl>
More information about the R-sig-Geo
mailing list