[R-sig-Geo] Polygon width

Barry Rowlingson b.rowlingson at lancaster.ac.uk
Wed Apr 25 22:02:44 CEST 2018


Growing a data frame is usually a bad idea, and R can get slow as the
system may have to create a fresh data frame each time. If you want to use
a for-loop, make a vector or data frame of the right size beforehand and
then fill it element-by-element - sketch:

n = nrow(data)
result = rep(NA, n)
for(i in 1:n){
  result[i] = something(i)
}




On Wed, Apr 25, 2018 at 6:31 PM, Paulo Flores Ribeiro <
paulo.flores.mail at gmail.com> wrote:

> Thank you, Barry! In the meanwhile, I've been exploring other paths and
> I think I found another solution, using loop. For a
> SpatialPolygonsDataFrame named "map4" the code was:
>
> dmax <- data.frame()
> for (i in 1:nrow(map4)) {
>    poly = map4 at polygons[[i]]@Polygons[[1]]@coords
>    dmax <- rbind.data.frame(dmax, max(dist(cbind(poly[,1],poly[,2]))))
> }
> print(dmax)
>
> Anyway, I'll certainly try out your alternative solution, based on the
> (s)apply function, to see which one is most efficient.
>
> Thank you so much again,
>
> PauloFR
>
>
> Às 18:16 de 25-04-2018, Barry Rowlingson escreveu:
> > Loop over the row indexes of an sf-class object `pctest`, applying a
> > function given the row index which returns the distance:
> >
> >  > ppa =
> > sapply(1:nrow(pctest),function(i){max(st_distance(
> st_cast(st_geometry(pctest[i,]),"POINT")))})
> >  > ppa
> >   [1] 172.55598 360.77081 107.53889 137.17785  51.66645 132.82052
> > 113.00875
> >   [8] 161.02432 141.13909  88.67002
> >
> > If you want to make that a new column, do `pctest$maxdist = ppa`
> >
> > And test on a simple example - make sure a unit square returns
> > approximately sqrt(2)!
> >
> > Barry
> >
> >
> >
> >
> > On Wed, Apr 25, 2018 at 5:24 PM, Paulo Flores Ribeiro
> > <paulo.flores.mail at gmail.com <mailto:paulo.flores.mail at gmail.com>>
> wrote:
> >
> >     Thank you, Barry. I am using planar coordinates (meters) and
> >     Euclidean distances. The shape or size of the polygons is not
> >     important (for illustration purposes, imagine that polygons are
> >     farm boundaries and that each farm is a single polygon). I know
> >     how to extract the maximum distance in a single polygon by
> >     calculating the distance matrix and selecting the maximum value.
> >     My "difficulty" is exactly in the coding of the loop process (or
> >     in the construction of the "function" to be used in the apply
> >     approach), so that I can apply it "automatically" to 25,000
> >     polygons. I am using the rgadl package, but I can switch to sf.
> >     Thanks for any help.
> >     Cheers,
> >     PauloFR
> >
> >     Às 12:27 de 25-04-2018, Barry Rowlingson escreveu:
> >>     Do you want great-circle distance or is your space small enough
> >>     that you can use planar coordinates?
> >>
> >>     Are your polygons all single rings or are there islands and/or
> >>     holes? Does that matter?
> >>
> >>     The straightforward way would be to coerce the polygons to
> >>     points, compute the distance matrix, then take the maximum.
> >>     Depending on if you are reading your shapefile into sp or sf
> >>     classes, the functions would be a bit different. You should try
> >>     and implement the straightforward way, test it for correctness,
> >>     and then worry about the "best way" if the straightforward way
> >>     isn't what you need. Its often the case that "best" ways need
> >>     fancy data structures or complex algorithms with more opportunity
> >>     for bugs. Start simple, work up.
> >>
> >>     For example, using sf, here's the max distance between any points
> >>     in the first feature of `pcs`
> >>
> >>     > max(st_distance(st_cast(st_geometry(pcs[1,]),"POINT")))
> >>     172.556 m
> >>
> >>     loop from 1 to N or otherwise apply over the features, and you're
> >>     done.
> >>
> >>     Barry
> >>
> >>
> >>
> >>     On Wed, Apr 25, 2018 at 11:26 AM, Paulo Flores Ribeiro
> >>     <paulo.flores.mail at gmail.com
> >>     <mailto:paulo.flores.mail at gmail.com>> wrote:
> >>
> >>         Hello,
> >>
> >>         I have a shapefile with ca. 25000 polygons. Each polygon has
> >>         an average of 40 vertices (nodes). I would like to extract,
> >>         for each polygon, the distance separating the two most
> >>         distant vertices (aka "polygon diagonal" or "maximum polygon
> >>         width"). It is not important whether the polygon is convex or
> >>         concave, so the lines connecting the vertices can be inside
> >>         or outside the polygon. The desired result would be a
> >>         two-column array, with a number of rows equal to the number
> >>         of polygons, and where the first column is the id of the
> >>         polygons, and the second the "maximum width" of the
> >>         corresponding polygon.
> >>
> >>         What would be the best way to do this, considering that the
> >>         calculation will probably require frequent updates (e.g. due
> >>         to changes in the shape of the polygons)?
> >>
> >>         Thanks in advance,
> >>
> >>         PauloFR
> >>
> >>         _______________________________________________
> >>         R-sig-Geo mailing list
> >>         R-sig-Geo at r-project.org <mailto:R-sig-Geo at r-project.org>
> >>         https://stat.ethz.ch/mailman/listinfo/r-sig-geo
> >>         <https://stat.ethz.ch/mailman/listinfo/r-sig-geo>
> >>
> >>
> >>
> >>     <http://www.avg.com/email-signature?utm_medium=email&
> utm_source=link&utm_campaign=sig-email&utm_content=emailclient>
> >>      Sem vírus. www.avg.com
> >>     <http://www.avg.com/email-signature?utm_medium=email&
> utm_source=link&utm_campaign=sig-email&utm_content=emailclient>
> >>
> >>
> >
> >
>
>

	[[alternative HTML version deleted]]



More information about the R-sig-Geo mailing list