Programavimas

Kaip atlikti erdvinę analizę R su sf

Kur balsuojate? Kas jūs esate įstatymų leidėjai? Koks jūsų pašto kodas? Šie klausimai turi kažką bendro geografiškai: atsakymas apima nustatymą, į kurį daugiakampį patenka taškas.

Tokie skaičiavimai dažnai atliekami naudojant specializuotą GIS programinę įrangą. Bet juos lengva padaryti ir R. Jums reikia trijų dalykų:

  1. Geokodo adresų būdas rasti platumą ir ilgumą;
  2. Formos failai, nurodantys pašto kodo daugiakampio ribas; ir
  3. SF paketas.

Geokodavimui dažniausiai naudoju geocod.io API. Tai nemokama per 2500 paieškų per dieną ir turi gražų R paketą, tačiau norint jį naudoti, reikia (nemokamo) API rakto. Norėdami sužinoti apie šio straipsnio sudėtingumą, naudosiu nemokamą atvirojo kodo „Open Street Map Nominatim“ API. Tam nereikia rakto. „Tmaptools“ paketas turi funkciją, geocode_OSM (), naudoti tą API.

Geoerdvinių duomenų importavimas ir paruošimas

Aš naudosiu sf, tmaptools, tmap ir dplyr paketus. Jei norite sekti paskui, įkelkite kiekvieną pacman :: p_load () arba įdiekite dar ne savo sistemoje naudodami install.packages (), tada įkelkite kiekvieną su biblioteka ().

Šiame pavyzdyje sukursiu vektorių su dviem adresais: mūsų biuras Framinghame (Masačusetse) ir „RStudio“ biuras Bostone.

adresai <- c ("492 senasis Konektikuto kelias, Framingham, MA",

„250 Northern Ave., Bostonas, MA“)

Geokodavimas yra nesudėtingas naudojant geocode_OSM. Rezultatus galite pamatyti atsispausdinę pirmuosius tris stulpelius, įskaitant platumą ir ilgumą:

geocoded_addresses <- geocode_OSM (adresai)

spausdinti (geokoduoti_adresai [, 1: 3])

užklausa lat lon

# 1 492 Senasis Konektikuto kelias, Framingham, MA 42.31348 -71.39105

# 2 250 Northern Ave., Bostonas, MA 42.34806 -71.03673

Yra keli būdai gauti pašto kodo formos failus. Lengviausia tikriausiai yra JAV gyventojų surašymo biuro pašto kodų lentelių sudarymo sritys, kurios yra panašios į JAV pašto tarnybos ribas, jei ne visai tas pats.

Galite atsisiųsti ZCTA failą tiesiai iš JAV surašymo biuro, tačiau tai yra visos šalies failas. Tai darykite tik tuo atveju, jei neprieštaraujate dideliam duomenų failui.

Viena vieta atsisiųsti ZCTA failą vienai valstybei yra „Census Reporter“. Ieškokite bet kokių duomenų pagal valstiją, pvz., Gyventojų skaičių, tada pridėkite pašto kodą prie geografijos ir pasirinkite atsisiuntimo duomenis kaip formos failą.

Galėčiau išpakuoti atsisiųstą failą rankiniu būdu, bet tai lengviau naudojant „R.“. Čia aš naudoju pagrindinius R atsegti () funkciją atsisiųstame faile ir išpakuokite jį į projekto pakatalogį pavadinimu ma_zip_shapefile. Tai greitas kelias = TIESA argumentas sako, kad nenoriu išpakuoti pridėti dar vieną pakatalogį pagal ZIP failo pavadinimą.

išpakuokite ("data / acs2017_5yr_B01003_86000US02648.zip",

exdir = "ma_zip_shapefile", junkpaths = TRUE,

perrašyti = TRUE)

Geoerdvinis importas ir analizė su sf

Dabar pagaliau keletas geoerdvinių darbų. Aš importuosiu šabloną į R naudodamas sf's st_read () funkcija.

zipcode_geo <- st_read ("ma_zip_shapefile / acs2017_5yr_B01003_86000US02648.shp") # Skaitymo sluoksnis „acs2017_5yr_B01003_86000US02648“ iš duomenų šaltinio "/Users/smachlis/Documents/MoreWithRack_app_app_app_app_app_app_app_app_app_app_app_app_app_app_app_app_app_app_app_app_app_app_app_app_app_app_app_app_app_app_app_app_app_app_app_app_app_app_app_aspace_set_app_app_appus_app_app_aspace_set_app_app_appus_app_app_app_apps_app_aspace_app_app_app_apps_applash_set_app_app_app_app_apps_applash_set_app_app_app_app_apps_app_app_apps_app_apps_app_aspace_app_aspace_set_app_aspace_set} funkcijos ir 4 laukai # geometrijos tipas: MULTIPOLYGON # aspektas: XY # bbox: xmin: -73.50821 ymin: 41.18705 xmax: -69.85886 ymax: 42.95774 # epsg (SRID): 4326 # proj4string: + projekt = longlat + datum = WGS84 + no_def

Bėgdamas įtraukiau konsolės atsakymą st_read () nes ten rodoma tam tikra informacija: epsg. Tai sako kokia koordinačių atskaitos sistema buvo naudojama failui sukurti. Čia buvo 4326. Per daug neįsigilinus į piktžoles, epsg iš esmės rodokokia sistema buvo naudojama trimačio Žemės rutulio vietovėms - Žemei - paversti dvimatėmis koordinatėmis (platuma ir ilguma). Tai svarbu, nes yra a daug skirtingų koordinačių atskaitos sistemų. Noriu, kad mano pašto kodo daugiakampiai ir adresų taškai būtų vienodi, todėl jie tinkamai išsirikiuoja.

Pastaba: šiame faile yra daugiakampis visai Masačusetso valstijai, kurio man nereikia. Taigi aš filtruosiu tą Masačusetso eilę

pašto kodas_geo <- dplyr :: filtras (pašto kodas_geo,

vardas! = "Masačusetsas")

Formos failo atvaizdavimas naudojant tmap

Daugiakampio duomenų susieti nereikia, bet tai yra puikus mano formos failo patikrinimas, ar geometrija yra tokia, kokios tikiuosi. Galite greitai atlikti sf objekto brėžinį naudodami tmap's qtm () (trumpas greito temų žemėlapio) funkcija.

qtm (pašto kodas_geo) +

tm_legend (show = FALSE)

Ekranai, kuriuos nufilmavo Sharon Machlis,

Panašu, kad aš tikrai turiu Masačusetso geometriją su daugiakampiais, kurie galėtų būti pašto kodai.

Toliau noriu naudoti geokoduoto adreso duomenis. Šiuo metu tai yra paprastas duomenų rėmas, tačiau jį reikia konvertuoti į SF geodalinį objektą su tinkama koordinačių sistema.

Mes galime tai padaryti su sf st_as_sf () funkcija. (Pastaba: sf paketo funkcijos, veikiančios erdviniuose duomenyse, prasideda st_, kuris reiškia „erdvinis“ ir „laikinas“.)

st_as_sf () imasi kelių argumentų. Žemiau pateiktame kode pirmasis argumentas yra transformuojamas objektas - mano geokoduoti adresai. Antrasis argumentų vektorius nurodo funkcijai, kurios stulpeliai turi x (ilguma) ir y (platuma) reikšmes. Trečiasis nustato koordinačių atskaitos sistemą į 4326, taigi ji yra tokia pati kaip mano pašto kodo daugiakampiai.

point_geo <- st_as_sf (geokoduoti_adresai,

koordai = c (x = "lon", y = "lat"),

crs = 4326)

Geotelinė erdvė susijungia su sf

Dabar, kai sukūriau du savo duomenų rinkinius, su sf lengva apskaičiuoti kiekvieno adreso pašto kodą st_join () funkcija. Sintaksė:

st_join (point_sf_object, daugiakampis_sf_object, prisijungti = join_type)

Šiame pavyzdyje noriu bėgti st_join () ant geokoduotų taškų pirmiausia ir pašto kodo daugiakampių antra. Tai vadinamasis kairiosios jungties formatas: Viskas įtraukiami pirmųjų duomenų taškai (geokoduoti adresai), tačiau tik sutampa antrųjų (pašto kodo) duomenys. Pagaliau mano prisijungimo tipas yra st_within, nes noriu, kad rungtynės būtų taškai.

mano_rezultatai <- st_join (point_geo, zipcode_geo,

prisijungti = st_within)

Viskas! Dabar, jei pažvelgsiu į savo rezultatus atsispausdindamas kelis svarbiausius stulpelius, pamatysite, kad kiekvienas adresas turi pašto kodą (stulpelyje „vardas“).

spausdinti (mano_rezultatai [, c ("užklausa", "vardas", "geometrija")])

# Paprastas funkcijų rinkinys su 2 funkcijomis ir 2 laukais # geometrijos tipas: POINT # aspektas: XY # bbox: xmin: -71.39105 ymin: 42.31348 xmax: -71.03673 ymax: 42.34806 # epsg (SRID): 4326 # proj4string: + projekt = longlat + atskaitos taškas = WGS84 + no_defs # užklausos pavadinimo geometrija # 1 492 Senasis Konektikuto kelias, Framingham, MA 01701 POINT (-71.39105 42.31348) # 2250 Northern Ave., Bostonas, MA 02210 POINT (-71.03673 42.34806)

Taškų ir daugiakampių atvaizdavimas naudojant tmap

Jei norite susieti taškus ir daugiakampius, vienas iš būdų tai padaryti naudojant „tmap“:

tm_shape (zipcode_geo) +

tm_fill () +

tm_shape (mano_rezultatai) +

tm_bubbles (col = "raudona", dydis = 0,25)

Sharon Machlis ekranas

Norite daugiau R patarimų? Eikite į puslapį „Daryk daugiau su R“!