[R-sig-Geo] Polygon width
Paulo Flores Ribeiro
paulo.flores.mail at gmail.com
Wed Apr 25 19:31:17 CEST 2018
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>
>>
>>
>
>
More information about the R-sig-Geo
mailing list