日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

r语言 rgl 强制过程中_一个R语言中操纵矢量空间数据的标准化工具—sf

發布時間:2024/9/30 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 r语言 rgl 强制过程中_一个R语言中操纵矢量空间数据的标准化工具—sf 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?注: 本文是R語言sf包的核心開發者和維護者——來自德國明斯特大學的地理信息學教授:Edzer Pebesma 的一篇關于sf包的簡介,發表于2018年7月的R語言期刊,主要講述了sf的定位、功能、開發現狀及現存問題和今后展望,sf包是一個非常了不起的工具,在R語言中引入了空間數量分析領域通用的標準規范(simple feature),結合tidyverse工具箱組合,R語言中處理、轉化與繪制地理空間數據的復雜度降了一個數量級。

by Edzer Pebesma摘要Simple features是一種在計算機中編碼矢量空間數據(點、線、面等)的標準化方法。sf包在R語言中引入了simple features對象,它基本具備和sp、rgeos、rgdal一樣的矢量空間數據處理能力。本文主要描述此包的基本功能,其在R語言諸多擴展生態系統中的地位,以及在連接R語言與其他空間計算系統中的潛在價值。

"Simple features" 究竟是什么?

我們可以把“Features”看做是一種包含特定空間位置或范圍的“事物”或對象;Featrue gemetry是指某種空間幾何特征(位置或范圍),或者你也可以直接把其當成是一個點、點集合、線、線集合、多邊形、多邊形集合,甚至是以上多種對象的結合。簡單來說,simple features就是線集合、多邊形集合的特征(這些線集合或者多邊形集合是由很多點連接的直線段構成的)。Features 還包含有其他典型屬性(如時間、顏色、名稱、質量),我們稱之為特征屬性。并非所有的空間現象都可以被輕易稱為“事物”或“對象”。某些連續性現象:比如水溫或者海拔等諸如此類的,我們最好把其看成是來自于連續空間(或時間)上的映射函數(Scheider et al., 2016),這些也經常被作為柵格數據而非矢量數據(點集合、線集合、多邊形集合)。Simple feature 對象(Herring,2011)是呈現、編碼矢量空間數據的國際通用標準,主要用于呈現點、線、多邊形等幾何對象(IOS,2004)。它被廣泛用于各種空間數據庫系統(Herring,2010),GeoJSON(Butler et al.,2016),GeoSPL(Perry and Herring,2012),以及開源地理信息工具庫:如GDAL(Warmerdam,2008),GEOS(GEOS Development Team,2017) 和liblwgeom(一個PostGIS的附加模塊,Obe and Hsu(2015))。

一個新包的價值

sf包(Pebesma,2018)是R語言中一個讀取、寫入、操縱、計算simple features對象的工具包。它幾乎重塑了sp包中所有矢量空間數據(點集合、線集合、多邊形集合等)處理功能(Pebesma and Bivand,2005;Bivand et al.,2013),rgdal ( Bivand et al.,2017) 和 rgeos ( Bivand and Rundel,2017)。由于sp包具有約400個直接的反向依賴和幾千個間接依賴,所以很有必要重寫一個包來替代它。首先,在sp包的開發期間,simple features標準還尚未出現,ESRI shapefile那時在矢量空間數據的存儲和轉換上來處于統治地位。但是由于ESRI shapefile缺乏清晰開放的標準,其本身混亂、繁多的配置文件及其在呈現空間數據上的諸多缺陷,給sp包造成了不利影響,比如在呈現多邊形集合上的孔洞時,盲目的使用封閉外邊界來標記孔洞。這種方式嚴重影響圖形繪制,阻礙其與其他同類型工具庫之間的兼容性。simple feature 格式標準目前已經被廣泛采納,但是sp包仍然習以為常的將矢量空間數據強制轉化為R的內部對象。這也意味著你無法靈活的進行雙向數據操作。比如:導入數據、操縱數據、導出數據后才能得到同樣的幾何對象。但對于sf而言,這根本就是不是問題。另一個重要原因是R語言在讀寫空間數據(GDAL)以及操縱空間幾何對象(GEOS)時重度依賴的外部擴展庫均以對simple feature標準給予了強有力的支持。除此之外,sp和當前比較流行的數據操縱工具箱:如tidyverse(Wickham et., 2017)和 ggplot2(wickham,2016)等之間的兼容性較差。

  • tidyverse 包不僅把操縱對象當做是一個數據框(然而sp 對象則是通過提供方法函數來實現),而且把對象視作一個長度相等的向量組成的列表,這一點兒sp包望塵莫及。
  • 在使用ggplot2繪圖時,先利用fortify函數將sp對象轉化成數據框(該數據框里存放著每一個多邊形構成點的信息),以此來嘗試“簡化”多邊形對象,這樣既不優雅,也不高效。


基本規范

數據類型

sf包的主要類型如下:

  • “sf”: 一個數據框(或者tl_df):包含一到 多個空間幾何對象列(通常由一組與數據框等長的列表組成)、一個用于標識當前空間幾何對象列(sfc類)的屬性(sf_column),
  • "sfc": 一個由一組空間幾何屬性組成的列表列
  • "sfg":一個空間幾何列表列中的任一個元素(一個幾何要素)
  • "crs": 一個坐標參考系統(CRS),作為“sfc”對象的性質存儲除了“sfg”對象之外,以上所有類型均可看做列表。“sfg”對象可看做是其他類型的子類,這些類主要有以下幾種存儲格式:

POINT:一個單點組成的數值型向量

MULTIPOINT:每行由多點組成的數值矩陣

LINESTRING:每行由多點組成的數值矩陣

POLYGON:多個數據矩陣(每行由多點組成)組成的列表(多邊形邊界內部可能嵌套若干個孔洞)

MULTILINRSTRING:多個數值矩陣(每行由多點組成)組成的列表

MULTIPLOYGON:POLYGON結構組成的list

GEOMETRYCOLLECTION: 一個或多個以上幾何對象組成的結構。所有的幾何對象都具有空值,表示幾何對象的缺失(或者NA)。

函數與方法

CategorygoryFunctions

binary predicatesst_contains,st_contains_properly,st_convered_by,st_covers,st_crosses,st_disjoint,st_equals,st_equals_exact,st_intersects,st_is_within_distance,st_within,st_touches,st_overlapsbinary operationsst_relate,st_distanceunary operationsst_dimension,st_area,st_length,st_is_longlat,st_is_simple,st_is_valid,st_jitter,st_geohash,st_geometry_type,st_sample,st_line_sample,st_join,st_interpolate_aw,st_make_grid,st_graticule,st_extSoftVersion,raw_ToHex,st_proj_infosettersst_set_agr,st_set_crsconstructorsst_sfc,st_sf,st_as_sf,st_as_sfc,st_point,st_multipoint,st_linestring,st_multilinestring,st_polygon,st_multipolygon,st_geometrycollection,st_combine,st_bind_colsin & outputst_read,st_read_db,st_write,st_write_db,read_sf,write_sf,st_drivers,st_layersplottingst_viewport,st_wrap_dateline,sf.colors表格 1:來自sf包的功能函數 ,按照函數類別順序

以上所列函數中,部分函數同時作用于屬性和幾何對象,比如:aggregate 和 summarize 計算分組統計量。class methods

sfgas.matrix, c, coerce, format, head, Ops, plot, print, st_as_binary, st_as_grob, st_as_text, st_transform, st_coordinates, st_geometry, st_boundary, st_buffer, st_centroid, st_convex_hull, st_difference, st_intersection, st_line_merge, st_make_valid, st_node, st_point_on_surface, st_polygonize, st_segmentize, st_simplify, st_split, st_sym_difference, st_triangulate, st_union, st_voronoi, st_cast, st_collection_extract, st_is, st_zmsfc[, [<-, as.data.frame, c, coerce, format, Ops, print, rep, st_as_binary, st_as_text, st_bbox, st_coordinates, st_crs, st_crs<-, st_geometry, st_precision, st_set_precision, str, summary, st_transform, st_boundary, st_buffer,st_centroid, st_convex_hull, st_difference, st_intersection, st_line_merge, st_make_valid, st_node, st_point_on_surface, st_polygonize, st_segmentize, st_simplify, st_split, st_sym_difference, st_triangulate, st_union, st_voronoi, st_cast, st_collection_extract, st_is, st_zm, obj_sum, type_sumsf[, [[<-, $<-, aggregate, cbind, coerce, merge, plot, print, rbind, st_agr, st_agr<-, st_bbox, st_coordinates, st_crs, st_crs<-, st_geometry, st_geometry<-, st_precision, st_set_precision, st_transform, st_boundary, st_buffer, st_centroid, st_convex_hull, st_difference, st_intersection, st_line_merge, st_make_valid, st_node, st_point_on_surface, st_polygonize, st_segmentize, st_simplify, st_split, st_sym_difference, st_triangulate, st_union, st_voronoi, st_cast, st_collection_extract, st_is, st_zm, anti_join, arrange, distinct, filter, full_join, gather, group_by, inner_join, left_join, nest, mutate, rename, right_join, sample_frac, sample_n, select, semi_join, separate, slice, spread, summarise, transmute, ungroup, unitecrs$, is.na, Ops, print, st_as_text, st_crs表格 2:sf包中的類方法st_interpolate_aw函數可以針對幾何對象進行基于面積加權的差值計算(Do et al., 2015)。st_join可以基于空間類型連接成對的表格。sf包的一般方法已經展示在上面表格2中了,其中很多方法主要服務于矢量空間數據的創建、抽取、轉換,當然也有很函數屬于不經常用到的低頻函數。在可能的情況下,方法作用于一個幾何對象(sfg)、一個幾何對象集合(sfc)或一個帶有屬性的集合對象集合(sf),同時返回一個相同類的對象。序列化simple featrue對象定義了兩個序列化標準:常見文本表現形式(WKT)和二進制文本表現形式(WKB)。常見文本表現形式是日常打印時默認的輸出格式,sfc列可以利用st_as_sfc函數從WKT格式的字符串向量中直接讀取。

> library(sf) Linking to GEOS 3.5.1, GDAL 2.1.2, proj.4 4.9.3 > (pt <- st_point(c(0,1))) POINT (0 1) > (pol <- st_polygon(list(rbind(c(0,0), c(1,0), c(1,1), c(0,1), c(0,0))))) POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0)) > st_as_sfc("POINT(0 1)") # returns sfc: Geometry set for 1 feature geometry type: POINT dimension: XY bbox: xmin: 0 ymin: 1 xmax: 0 ymax: 1 epsg (SRID): NA proj4string: NA POINT (0 1)R native simple feature geometries can be written to WKB usingst_as_binary:> st_as_binary(st_point(c(0,1)))[1] 01 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 f0 3f > st_as_binary(st_polygon(list(rbind(c(0,0), c(1,0), c(1,1), c(0,1), c(0,0))))) [1] 01 03 00 00 00 01 00 00 00 05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [26] 00 00 00 00 00 00 00 00 00 00 f0 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 [51] 00 f0 3f 00 00 00 00 00 00 f0 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [76] f0 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

同理,二進制編碼的幾何對象同樣可以使用sf_as_sfc函數來進行還原。 在sf包中,所有與底層庫GDAL、GEOS和liblwgeom之間的通信,以及與空間數據庫之間進行的空間幾何對象讀寫操作,均使用c++編寫的二進制序列化和反序列化。這樣可以使得代碼高效、穩健,對于所有可能的幾何對象類型,都使用統一的接口進行操縱。

球面幾何對象GEOS庫提供了很多用于處理二維空間的運算函數。對于未做投影處理的地理空間數據,提供的坐標通常是經緯度,表征的是球面上的點,而非投影后的平面。sf包允許針對此類數據進行所有幾何操作,但在操作過程中,GEOS包會彈出提示信息。而像st_area、st_length、st_distance、st_is_within_distance和st_segmentze之類的專門用于進行球面運算操作的函數,則主要依賴于底層庫——lwgeom(Pebesma)。相對于geosphere包(Hijmans, 2016a)而言,這個包的主要優勢在于,它支持所有simple feature對象的距離計算,但geosphere包只能計算點與點之間的距離。st_sample函數目前的功能已經有所改變,現在主要服務于球面區域點采樣后的坐標計算。

如果有一個全面的用于處理球面幾何對象的函數系統,那當時再好不過的事情了。目前看來具備這種潛質的候選包主要包括s2(Rubak和Ooms, 2017)(Rubak和Ooms, 2017)、liblwgeom (PostGIS的一部分)、CGAL (Fabri和Pion, 2009)和boost.Geometry。

操縱工具在sf的開發過程中,為了使新的數據結構與tidyverse能夠較好的協同工作,投入了大量的精力。這方面主要體現在給dplyr包提供了很多用于操縱sf對象的方法(見表2)以及給ggplot2提供了用于快速針對sf對象進行繪圖映射的geom系列函數。 tidyverse工具箱規定了四個主要原則,如下所示: 1.返回基礎數據結構我們僅使用R語言中最基礎的數據結構,并且完全支持兩種序列化標準(WKT、WKB)

2.使用管道函數來精簡代碼過程。這樣來設計函數和方法可以非常容易的適用于管道式工作流程。像st_crs之類的替換函數建議用st_set_crs這種形式,看起來更加優雅。

3.擁抱函數式編程。保持函數類型安全,支持空幾何體和空列表,并通過提供縮放和移動多邊形選項來創造性地完成了重載操作。

>pol * 2 + pt

POLYGON ((0 1, 2 1, 2 3, 0 3, 0 1))

st_join之類的空間連接函數,允許用戶傳遞一個與st_intersects兼容的連接函數,從而使應用于連接的空間謂詞完全可定制。

4.人性化設計。基于過去10年編寫和維護sp包的經驗,我們一直保持sf包的簡介和易學。盡可能抽象通用方法,來保持底層代碼占用較少的內存。所有函數和方法均以st_(對于“spacetime”,遵循PostGIS約定)開頭,以保持它們的統一性和可識別性,并可提供tab鍵來實現函數的模糊提醒。

繪圖

圖1(左)顯示了具有多個屬性的“sf”對象的默認圖:沒有提供顏色參數,默認顏色取決于變量是數值(上)還是因子(下)。圖1如下:

圖1:左圖:帶有兩個屬性的sf對象的默認圖;右圖:帶有顏色鍵、坐標軸和經緯度的單個屬性的繪圖。圖2:使用ggplot2::geom_sf生成的圖,現在彎曲的經緯網遵循固定比例的的經緯度線。

> library(sf) > nc = read_sf(system.file("gpkg/nc.gpkg", package="sf"))` > plot(nc[, c(9,5)]) When we plot a single attribute, a color key is default (unlesskey.pos=NULL). The following command > plot(nc[, 9], key.pos = 1, axes = TRUE, graticule = TRUE)在圖一右側圖中增加經緯網和坐標軸。Figure 2 shows a plot generated byggplot2(version 2.2.1 or later): > library(ggplot2) > library(tidyr) > library(dplyr) > nc2 <- nc %>% st_transform(32119) %>% select(SID74, SID79, geom) %>%+ gather(VAR, SID, -geom) > ggplot() + geom_sf(data = nc2, aes(fill = SID)) + facet_wrap( ~ VAR, ncol = 1)

圖3:sf依賴的其他R語言工具包及外部擴展系統

柵格、時間序列和單位

對于某些用戶來說,開始sf包的學習就如同翻開一本新書,同時合上一本舊書。但是和那本舊書相比,這本新書的內容、頁碼完全不同。目前還不知道,那些R語言中數百個使用了sp包提供的類和方法的包,是否會、以及何時會將修改為依賴sf包的類和方法。 最常聽到的問題是在這本新書中柵格數據在哪里:sp為網格數據提供了簡單的類,柵格(Hijmans, 2016b)提供了大量的類和密集的方法來使用它們,并與sp向量類緊密集成。當前版本的柵格數據是通過將sf對象轉換為(較小的一組)sp對象,從而使其可以兼容其中的一小部分函數。在撰寫本文時,我們只能說,這是一個高度活躍、探索和發展中的領域,我們很樂意向感興趣的讀者指出,這一討論的中大家關注的主流趨勢在向何處發展。除了柵格數據之外,時間序列類的空間特征(例如監測站的觀測數據)很難映射成sf對象:要么必須將時間切片放入列中,要么添加一個時間列,并為每個觀測重復空間幾何特征。柵格數據、空間時間序列和柵格時間序列是該項目今后探索的重點領域。 該軟件包的一個新功能是能夠檢索空間度量,并使用顯式度量單元設置距離參數等 (Pebesma et al., 2016):

> st_area(st_transform(nc[1, ], 2264)) # NC state plane, US foot 12244955726 US_survey_foot^2 > st_crs(2264)$units [1] "us-ft" > st_area(st_transform(nc[1, ], 2264)) %>% units::set_units(km^2) # convert: 1137.598 km^2

這可能會讓人困惑,但卻有可能防止一系列的科學錯誤。

與其他計算系統的連接和可伸縮性

在許多情況下,使用R分析空間數據從導入數據開始,或者從文件或數據庫導出數據結束。這種能力主要由可見文本(WKT)和二進制文本(WKB)序列化提供,它們是sf標準的一部分,并且受到sf的支持。與GDAL、GEOS和liblwgeom庫的通信都使用WKB方法。GDAL目前有93種不同的空間向量數據連接驅動程序(文件格式、數據庫、web服務)。圖3顯示了sf包和其他R包和系統庫的依賴關系。之所以將sf包構構筑于這些系統上,主要因為這些系統是由R語言外部致力于空間數據探索的研究機構和社會組織使用和維護的,反映了這些組織在關于空間數據研究上達成的默契和共識。 除了使用GDAL之外,sf還可以直接讀寫空間數據庫。目前主要通過RPostgreSQL來與PostGIS一起工作,當然,使用RPostgres以及DBI來讀寫空間數據庫的功能仍然進一步開發完善中。初步研究表明,使用dbplyr框架可以在R中處理大量耗費內存的空間數據庫。這不僅消除了R的內存限制,而且還從這些數據庫的持久空間索引中獲益。 對于平面數據,sf動態地為空間二進制謂詞構建空間索引(st_intersects,st_containsetc.) 以及二進制形式 (st_intersection,st_difference 等)。一篇關于在sf中設置空間索引的博文描述了如何使用索引操縱大內存的空間數據集。對于球面數據,還需要研究liblwgeom或s2提供的索引。

總結與延伸閱讀我們引入了一個新包 ——sf,在R語言中操縱simple feature對象,并且成為最前沿的用于部分替代sp包家族的潛力股。它為R語言中空間矢量數據的處理提供了新的基礎類,已經得到了廣泛的關注和應用。在實現sf過程中,維護了幾個經過良好驗證的概念(幾何對象與屬性的分離),為sf創建了新的連接(dplyr、ggplot2、空間數據庫),并探討了新的概念(單位、空間索引等)。 為了進一步了解sf的全部功能及其原理,讀者可以參考軟件包附帶的六篇小品文。

致謝如果沒有Roger Bivand的前期工作和付出,sf包的面世幾乎是不可能的。該包的貢獻者包括 Ian Cook, Tim Keitt, Michael Sumner, Robin Lovelace, HadleyWickham, Jeroen Ooms, and Etienne Racin。同時也非常感謝在Githubs上面給sf項目提供問題反饋的所有貢獻者。特別鳴謝Dirk Eddelbuettel開發的Rcpp(Eddelbuettel et al., 2011; Eddelbuettel,2013)。 來自R語言聯盟的支持對于sf的開發、面世和普及與應用至關重要,我們對此表示感謝,同時匿名審稿人也給我們提供非常寶貴的意見。

總結

以上是生活随笔為你收集整理的r语言 rgl 强制过程中_一个R语言中操纵矢量空间数据的标准化工具—sf的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。