Vă prezentăm: POLYGON FULL | R-bloggeri

URMĂREȘTE-NE
16,065FaniÎmi place
1,142CititoriConectați-vă

(Acest articol a fost publicat pentru prima dată pe r-spațialăși cu amabilitate a contribuit la R-bloggeri). (Puteți raporta problema legată de conținutul acestei pagini aici)


Doriți să vă distribuiți conținutul pe R-bloggeri? dați clic aici dacă aveți un blog, sau aici dacă nu aveți.

(vezi Rmd brut)

Rezumat

Această postare prezintă POLYGON FULL geometrie, nou în sf 1.0-18 care a apărut pe CRAN Today.

De ce?

Poligoanele delimitează o legătură bidimensională zonă. Standardul de acces la funcții simple OGC definește pe lângă standardul obișnuit POLYGON şi MULTIPOLYGON (un set de poligoane) de asemenea POLYGON EMPTY şi MULTIPOLYGON EMPTYcare pot fi considerate ambele „fără puncte”. Cu toate acestea, nu există nimic poligonal despre „fără puncte”, puteți citi mai multe despre acest lucru în articolul lui Even Rouault pe blog.

Deși standardul de caracteristici simple nu precizează în mod explicit acest lucru, a fost dezvoltat în mod clar pentru geometrii plane, plane. Cu toate acestea, Pământul este rotund, iar efectuarea de operații geometrice, de exemplu, pe suprafața bidimensională a unei sfere, schimbă multe lucruri. Una dintre ele este că întreaga suprafață, întreaga suprafață este, de asemenea, o zonă delimitată. Pentru a desemna acea zonă, din moment ce sf 1.0-18 putem folosi acum POLYGON FULL.

Cum?

Din 2020, pachetul R sf
folosește R packgae s2 iar cel s2geometry bibliotecă pentru calcule pe geometrii cu coordonate geodezice (neproiectate), cu excepția cazului în care i se spune să nu facă acest lucru (și să presupună un Pământ plat) de către

library(sf)

## Linking to GEOS 3.12.1, GDAL 3.8.4, PROJ 9.4.0; sf_use_s2() is TRUE

sf_use_s2(FALSE)

## Spherical geometry (s2) switched off

The s2geomety biblioteca folosește conceptul de a POLYGON FULLși îl reprezintă intern prin POLYGON((0 -90, 0 -90)). Pachet sf face si asta:

sf_use_s2(TRUE)

## Spherical geometry (s2) switched on

(p = st_as_sfc("POLYGON FULL", crs="OGC:CRS84"))

## Geometry set for 1 feature 
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: -180 ymin: -90 xmax: 180 ymax: 90
## Geodetic CRS:  WGS 84 (CRS84)

## POLYGON FULL

Dacă s2 este dezactivată, această geometrie nu este recunoscută ca a
POLYGON FULL dar în schimb este tipărit ca POLYGON((0 -90, 0 -90)):

sf_use_s2(FALSE)

## Spherical geometry (s2) switched off

p

## Geometry set for 1 feature 
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: -180 ymin: -90 xmax: 180 ymax: 90
## Geodetic CRS:  WGS 84 (CRS84)

## POLYGON ((0 -90, 0 -90))

care evident nu este un poligon valid

st_is_valid(p)

## (1) NA

și va duce la erori atunci când este utilizat, de exemplu în

st_make_valid(p)

## Error in scan(text = lst((length(lst))), quiet = TRUE): scan() expected 'a real', got 'IllegalArgumentException:'

## Error in (function (msg) : IllegalArgumentException: Invalid number of points in LinearRing found 2 - must be 0 or >= 3

Când se utilizează s2funcționează bine:

sf_use_s2(TRUE)

## Spherical geometry (s2) switched on

st_is_full(p)

## (1) TRUE

st_is_empty(p)

## (1) FALSE

st_is_valid(p)

## (1) TRUE

pt = st_as_sfc("POINT(7 52)", crs="OGC:CRS84")
st_intersects(p, pt)

## Sparse geometry binary predicate list of length 1, where the predicate
## was `intersects'
##  1: 1

st_intersection(p, pt)

## Geometry set for 1 feature 
## Geometry type: POINT
## Dimension:     XY
## Bounding box:  xmin: 7 ymin: 52 xmax: 7 ymax: 52
## Geodetic CRS:  WGS 84 (CRS84)

## POINT (7 52)

st_distance(p, pt)

## Units: (m)
##      (,1)
## (1,)    0

st_area(p) |> units::set_units(km^2) # spherical approximation

## 510066073 (km^2)

st_bbox(p)

## xmin ymin xmax ymax 
## -180  -90  180   90

Exemple

Un exemplu mai complet este descris în această vignetă, rezultând această cifră:

options(s2_oriented = TRUE) # don't change orientation from here on
co = st_as_sf(s2::s2_data_countries())
g = st_as_sfc("POLYGON FULL", crs="EPSG:4326")
oc = st_difference(g, st_union(co)) # oceans
b = st_buffer(st_as_sfc("POINT(-30 52)", crs="EPSG:4326"), 9800000) # visible half
i = st_intersection(b, oc) # visible ocean
plot(st_transform(i, "+proj=ortho +lat_0=52 +lon_0=-30"), col="blue")

Mai multe discuții care conduc la implementarea actuală se găsesc în acest număr de sf. Comentariile sunt binevenite în acest număr!

Dominic Botezariu
Dominic Botezariuhttps://www.noobz.ro/
Creator de site și redactor-șef.

Cele mai noi știri

Pe același subiect

LĂSAȚI UN MESAJ

Vă rugăm să introduceți comentariul dvs.!
Introduceți aici numele dvs.