跳轉到主要內容
工程的博客

在規模與磚處理地理空間數據

2019年12月5日, 工程的博客

分享這篇文章

這個博客是3年前寫的。請參考這些文章最新的地理空間方法處理和分析你的數據磚Lakehouse:

  1. 增壓空間分析H3和光子
  2. 項目馬賽克磚實驗室的大規模的空間分析
    2 a。統一的矢量和柵格分析馬賽克
  3. 薩索斯島優化空間分析與馬賽克和H3如何

技術的進化和融合推動了一個充滿活力的市場及時準確的地理空間數據。每天數十億手持和物聯網設備以及成千上萬的空中和衛星遙感平台生成數百eb的位置感知數據。Beplay体育安卓版本這種繁榮的地理空間大數據結合機器學習的發展使組織在行業建立新產品和功能。

地圖利用地理空間數據廣泛應用在工業,跨越多個用例,包括災難恢複,防禦和英特爾、基礎設施和衛生服務。

例如,許多公司提供本地化的兵力映射和現場檢查等服務(參考智能雲計算和智能的發展優勢)。地理空間數據的另一個快速增長的行業是自主車輛。創業公司和老牌公司都積累大主體之一因地製宜地理數據來自車輛傳感器交付下一個自動駕駛汽車的創新(參考磚燃料wejo的雄心創建一個移動數據的生態係統)。零售商和政府機構也希望利用他們的地理空間數據。例如,定居分析(參考建築定居見解數據集)可以幫助確定最佳位置打開一個新商店或在公共部門,提高城市規劃。盡管這些投資在地理空間數據,存在許多挑戰。

大規模的挑戰分析地理空間

第一個挑戰涉及在流媒體處理規模和批處理應用程序。擴散的地理空間數據和應用程序所需的sla顛覆了傳統存儲和處理係統。客戶數據已被現有的垂直縮放geo數據庫到數據湖泊多年現在由於數據量等壓力,速度,存儲成本和嚴格schema-on-write執行。而企業投資於地理空間數據,很少有合適的技術架構準備這些大,下遊分析複雜的數據集。進一步,因為擴展數據通常所需的高級用例,大部分AI-driven舉措都未能使它從飛行員到生產。

兼容各種空間格式提出了第二個挑戰。有許多不同的專業地理空間的格式幾十年來建立以及附帶的位置信息的數據源可能是收獲:

  • 矢量格式,如GeoJSON KML, Shapefile, WKT
  • 光柵格式如ESRI網格,GeoTIFF, JPEG 2000, NITF
  • 導航AIS和GPS設備使用等標準
  • Geodatabases通過如PostgreSQL / PostGIS JDBC / ODBC連接
  • 從高光譜遙感器格式,多光譜、激光雷達和雷達平台Beplay体育安卓版本
  • OGC web標準如WCS, WFS WMS, WMTS
  • 標記了日誌,圖片,視頻,和社交媒體
  • 非結構化數據與地理位置的引用

在這篇文章中,我們概述的一般方法處理上麵列出的兩個主要挑戰使用磚統一數據分析平台。Beplay体育安卓版本這是一係列的博客文章的第一部分在處理大量的地理空間數據。

擴展地理空間與磚工作負載

磚提供了一個統一的數據分析平台Beplay体育安卓版本大數據分析和機器學習全球成千上萬的客戶使用。beplay体育app下载地址它是由Apache引發™,三角洲湖,MLflow大生態係統的第三方和可用的庫集成。磚UDAP提供企業級安全、支持、可靠性和性能在規模生產工作負載。地理空間的工作負載通常是複雜的,沒有一個圖書館擬合所有的用例。雖然Apache火花不提供地理空間數據類型本地,開源社區以及企業有導演多努力開發空間庫,導致海洋的選項可供選擇。

一般有三種模式擴展地理空間操作,比如空間連接或最近的鄰居:

  1. 使用專門的庫為地理空間分析擴展Apache火花。GeoSpark,GeoMesa,GeoTrellis,Rasterframes有幾個這樣的庫所使用的我們的客戶。beplay体育app下载地址這些框架通常提供多種語言綁定,有更好的可伸縮性和性能比non-formalized方法,但也可以有一個學習曲線。
  2. 包裝單節點庫等GeoPandas,地理空間數據抽象庫(GDAL),或Java拓撲服務(JTS)在特別用戶定義函數(udf)與火花DataFrames處理分布式的方式。這是最簡單的方法來擴展現有的工作負載沒有多少代碼重寫;然而它可以介紹性能的缺點,更重要的是,在《自然》雜誌上。
  3. 索引數據網格係統和利用生成的索引來執行空間操作是一種常見的方法來處理超大規模或計算限製工作負載。S2,GeoHex和超級的H3就是這樣的網格係統的例子。網格近似地理特性如多邊形或點用一組固定的可識別的細胞從而避免昂貴的地理空間完全操作,從而提供更好的擴展行為。實現者可以決定之間的網格固定在一個精度可以有所損耗更多的性能或與多個網格精度可以減少性能,但對lossines減輕。

遵循的例子通常麵向紐約出租車皮卡/下降數據集在這裏紐約出租車區數據和幾何圖形也將作為多邊形的集合。這個數據包含多邊形為紐約市的五個區社區。這筆記本將指導您完成準備和做一做最初的CSV文件轉換成三角洲湖表作為一個可靠和高性能的數據源。

我們的基地DataFrame出租車上升/下降數據讀取三角洲湖表使用磚。

% scalaval dfRaw = spark.read.format (“δ”).load (“/毫升/博客/地理/δ/ nyc-green”)顯示器(dfRaw)/ /顯示前10列

地理空間數據讀例子從三角洲湖表使用磚。

地理空間操作使用地理空間庫為Apache火花

在過去的幾年裏,幾個庫開發擴展Apache火花地理空間分析的功能。這些框架首當其衝注冊一般應用用戶定義類型(UDT)和函數(UDF)以一致的方式,提升責任否則放在用戶和團隊寫特別的空間邏輯。請注意,在這篇文章裏我們使用幾種不同的空間框架選擇強調各種功能。我們理解之外的其他框架存在的突出顯示,您可能還希望使用磚來處理你的空間工作負載。

早些時候,我們裝載DataFrame基本數據。現在我們需要將緯度/經度屬性轉化為幾何圖形。為了實現這一點,我們將使用udf DataFrames在分布式的方式執行操作。請參考提供的筆記本的博客向集群添加這些框架的細節和初始化調用udf和之上。首先,我們有添加GeoMesa集群,一個框架特別擅長處理矢量數據。攝入,我們主要是利用JTS的集成火花SQL我們可以輕鬆地轉換為注冊和使用JTS幾何類。我們將使用給定一個經度和緯度的函數st_makePoint創建一個點幾何對象。函數是一個UDF以來,我們可以直接應用於列。

% scalaval df = dfRaw.withColumn (“pickup_point”,st_makePoint(坳(“pickup_longitude”)、坳(“pickup_latitude”))).withColumn (“dropoff_point”,st_makePoint(坳(“dropoff_longitude”)、坳(“dropoff_latitude”)))顯示器(df.select (“dropoff_point”,“dropoff_datetime”))

使用udf執行操作DataFrames分布式的方式將緯度/經度地理空間數據屬性轉化為幾何圖形。

我們還可以執行分布式空間連接,在這種情況下使用GeoMesa提供st_contains UDF生產產生的加入對接送點的多邊形。

% scalaval joinedDF = wktDF。加入(df, st_contains(美元)“the_geom”美元,“pickup_point”)顯示器(joinedDF.select (“區域”,“區”,“pickup_point”,“pickup_datetime”))

使用GeoMesa st_contains UDF提供,例如,生產產生的加入對接送點的多邊形。

包裝單節點庫udf

除了使用目的構建分布式空間框架,現有單節點庫也可以用特別的udf用於執行地理空間操作DataFrames分布式的方式。這種模式是提供給所有火花Scala語言綁定,Java、Python、R和SQL -是一個簡單的方法來利用現有工作負載以最少的代碼更改。為了演示一個單節點的例子,讓我們紐約區數據加載和定義UDF find_borough (…)點包容操作分配每個GPS定位使用geopandas區。這也可以完成矢量化UDF甚至更好的性能。

% python#閱讀區與geopandas多邊形gdf = gdp.read_file (“/ dbfs / ml /博客/地理/ nyc_boroughs.geojson”)b_gdf = sc.broadcast (gdf)#廣播geopandas dataframe集群的所有節點deffind_borough(緯度、經度):mgdf = b_gdf.value.apply (λx: [“boro_name”]如果x (“幾何”].intersects(點(經度、緯度))idx = mgdf.first_valid_index ()返回mgdf.loc [idx]如果idx沒有一個其他的沒有一個
              find_borough_udf = udf (find_borough StringType ())

現在我們可以使用UDF將一列添加到我們的火花DataFrame分配一個自治市的名字每個小點。

% python#從三角洲讀取坐標df = spark.read。格式(“δ”).load (“/毫升/博客/地理/δ/ nyc-green”)df_with_boroughs = df.withColumn (“pickup_borough”,find_borough_udf(坳(“pickup_latitude”)、坳(pickup_longitude)))顯示器(df_with_boroughs.select (“pickup_datetime”,“pickup_latitude”,“pickup_longitude”,“pickup_borough”))

一個單節點的例子的結果,Geopandas用於分配每個GPS定位紐約區。
一個單節點的例子的結果,Geopandas用於分配每個GPS定位紐約區。

網格空間索引係統

地理空間操作本質上是需要大量的計算。點包容、空間連接,最近鄰或拍攝路線所有涉及複雜的操作。通過索引網格係統,其目的是避免地理空間操作。這種方法導致了大多數可伸縮實現近似的警告操作。這是一個簡單的例子H3。

擴展空間操作和H3本質上是一個兩步的過程。第一步是計算每個特性的H3指數(點,多邊形,…)定義為UDF geoToH3 (…)。第二步是使用這些指數等空間操作空間加入(點在多邊形,再鄰居,等等),在這種情況下,定義為UDF multiPolygonToH3 (…)。

% scala進口com.uber.h3core.H3Core進口com.uber.h3core.util.GeoCoord進口scala.collection.JavaConversions._進口scala.collection.JavaConverters._對象H3擴展可序列化的{val實例= H3Core.newInstance ()}val geoToH3 = udf {(經度緯度:雙:翻倍,決議:Int)= >H3.instance。geoToH3(緯度、經度、分辨率)}val polygonToH3 = udf {(幾何:幾何、解析:Int)= >var點:列表[GeoCoord] = ()var洞:[java.util列表。列表[GeoCoord]] = ()如果(幾何。getGeometryType = =“多邊形”){點=列表(幾何.getCoordinates ().toList. map (coord= >GeoCoord (coord。y, coord.x)): _ *)}H3.instance。polyfill(點,洞。作為Java, resolution).toList}val multiPolygonToH3 = udf {(幾何:幾何、解析:Int)= >var點:列表[GeoCoord] = ()var洞:[java.util列表。列表[GeoCoord]] = ()如果(幾何。getGeometryType = =“多個多邊形”){val numGeometries = geometry.getNumGeometries ()如果(numGeometries >0){點=列表(幾何.getGeometryN (0).getCoordinates ().toList. map (coord= >GeoCoord (coord。y, coord.x)): _ *)}如果(numGeometries >1){洞= (1(numGeometries -1).toList.map (n= >{列表(幾何.getGeometryN (n).getCoordinates ().toList. map (coord= >GeoCoord (coord。y, coord.x)): _ *) .asJava})}}H3.instance。polyfill(點,洞。作為Java, resolution).toList}

我們現在可以申請這兩個udf紐約出租車數據以及組區多邊形生成H3指數。

% scalaval res =7/ / H3的分辨率指數1.2公裏val dfH3 = df.withColumn (“h3index”,geoToH3(坳(“pickup_latitude”)、坳(“pickup_longitude”),點燃(res)))val wktDFH3 = wktDF.withColumn (“h3index”,multiPolygonToH3(坳(“the_geom”),點燃(res))).withColumn (“h3index”爆炸(美元)“h3index”))

給定一組的緯度/經度點和一組多邊形的幾何圖形,現在可以執行空間連接使用h3index字段作為連接條件。這些作業可用於聚合點的數量在每個多邊形為例。通常有數百萬或數十億點必須匹配數千或數百萬多邊形需要一個可伸縮的方法。還有其他技術中未涉及這個博客,可以用於索引支持空間操作當一個近似是不夠的。

% scalaval dfWithBoroughH3 = dfH3.join (wktDFH3,“h3index”)顯示器(df_with_borough_h3.select (“區域”,“區”,“pickup_point”,“pickup_datetime”,“h3index”))

DataFrame表表示的空間加入一組緯度/經度點和多邊形的幾何圖形,使用特定字段作為聯接條件。
DataFrame表表示的空間加入一組緯度/經度點和多邊形的幾何圖形,使用特定字段作為聯接條件。

空投地點,這是一個可視化的出租車與緯度和經度扔進垃圾箱的決議7邊緣長度(1.22公裏)和彩色的聚合計算在每一個垃圾箱。

出租車空投地點的地理空間可視化,緯度和經度扔進垃圾箱的決議7邊緣長度(1.22公裏)和彩色的聚合計算在每一個垃圾箱。
出租車空投地點的地理空間可視化,緯度和經度扔進垃圾箱的決議7邊緣長度(1.22公裏)和彩色的聚合計算在每一個垃圾箱。

與磚處理空間格式

地理空間數據涉及到參考點,例如緯度和經度,地球物理位置或區段以及特征描述的屬性。雖然有很多文件格式可供選擇,我們挑選出少數代表矢量和柵格格式展示閱讀與磚。

矢量數據

矢量數據的表示是世界上存儲在x(經度),y(緯度)協調度,也z(米)高度是否考慮高程。矢量數據的三種基本符號是點、線、多邊形。Well-known-text(預留),GeoJSON,Shapefile一些流行的格式來存儲矢量數據我們下麵突出。

讓我們讀紐約出租車與幾何圖形作為WKT存儲區數據。我們想回來的數據結構是一個DataFrame將允許我們標準化與其他api和數據來源,如使用其他博客。我們能夠輕鬆the_geom WKT文本內容中找到字段轉換成相應的JTS幾何課通過st_geomFromWKT (…)UDF調用。

% scalaval wktDFText = sqlContext.read。格式(“csv”).option (“頭”,“真正的”).option (“inferSchema”,“真正的”).load (“/ ml /博客/地理/ nyc_taxi_zones.wkt.csv”)val wktDF = wktDFText.withColumn (“the_geom”,st_geomFromWKT(坳(“the_geom”))).cache

GeoJSON許多開源GIS軟件包用於各種地理編碼數據結構,包括它們的特征、屬性和空間範圍。對於本例,我們將讀取紐約區邊界的方法根據工作流。因為符合JSON數據,我們可以使用磚內置的JSON讀者.option(“多行”,“真正的”)與嵌套模式加載數據。

% pythonjson_df = spark.read.option (“多行”,“真正的”). json (“nyc_boroughs.geojson”)

的例子使用磚內置JSON讀者.option (
的例子使用磚內置JSON讀者.option(“多行”,“真正的”)與嵌套模式加載數據。

從這裏我們可以選擇提升到頂級的任何字段列使用火花的內置函數爆發。例如,我們可能想把幾何、屬性和類型,然後將幾何圖形轉換為其對應的JTS類與WKT例子所示。

% pythonpyspark.sql進口功能作為Fjson_explode_df = (json_df.select (“特征”,“類型”,F.explode (F.col (“features.properties”).alias (“屬性”)).select (“*”,F.explode (F.col (“features.geometry”).alias (“幾何”).drop (“特征”))
              顯示器(json_explode_df)

使用內置的火花爆炸函數增加一個字段到頂級,DataFrame表內顯示。
使用內置的火花爆炸函數增加一個字段到頂級,DataFrame表內顯示。

我們也可以想象紐約出租車區數據在筆記本使用現有的DataFrame或直接呈現等數據和一個圖書館葉形Python庫,使空間數據。磚文件係統(DBFS)運行在分布式存儲層代碼就可以使用熟悉的文件係統與數據格式標準。DBFS有保險絲山允許本地API調用執行文件讀寫操作,這使得它很容易與運作API加載數據交互式渲染。在Python下麵打開(…)命令,“dbfs /…”前綴允許使用FUSE掛載。

% python進口葉形進口json開放(“/ dbfs / ml /博客/地理/ nyc_boroughs.geojson”,“r”)作為myfile:boro_data = myfile.read ()#使用FuseMount GeoJSON從DBFS讀取
              m = folium.Map (位置= [40.7128,74.0060),瓷磚=雄蕊地形的,zoom_start =12)folium.GeoJson (json.loads (boro_data) .add_to (m)#顯示,也可以使用displayHTML(…)變體

我們也可以想象紐約出租車區數據,例如,在一個筆記本上使用現有DataFrame或直接呈現葉等數據和一個圖書館,一個Python庫呈現地理空間數據。
我們也可以想象紐約出租車區數據,例如,在一個筆記本上使用現有DataFrame或直接呈現葉等數據和一個圖書館,一個Python庫呈現地理空間數據。

由ESRI Shapefile是一個流行的矢量格式的存儲地理特征的幾何位置和屬性信息。文件的格式由一組共同的文件名前綴(*。軸馬力,*。shx和*。dbf是強製性的)存儲在相同的目錄中。另一個圖形文件KML也被我們的客戶,但沒有顯示簡潔。beplay体育app下载地址對於本例,我們使用shapefile紐約建築。雖然有很多方法來演示閱讀shapefile使用GeoSpark我們會給一個例子。內置的ShapefileReader用於生成rawSpatialDf DataFrame。

% scalavarspatialRDD =SpatialRDD(幾何)spatialRDD = ShapefileReader.readToGeometryRDD (sc,“/毫升/博客/地理/ shapefile /紐約”)varrawSpatialDf = Adapter.toDf (spatialRDD火花)rawSpatialDf.createOrReplaceTempView (“rawSpatialDf”)/ / DataFrame現在可用SQL, Python和R

通過注冊rawSpatialDf作為臨時視圖中,我們可以很容易的進入純火花SQL語法與DataFrame工作,包括應用UDF shapefile WKT轉換為幾何。

%sql選擇*,ST_GeomFromWKT(幾何)作為幾何——GeoSpark UDF轉換WKT幾何rawspatialdf

另外,我們可以使用磚建成的可視化圖表等內聯分析紐約最高的建築。

%sql選擇的名字,圓((num_floors作為),0)作為num_floors——字符串數rawspatialdf在哪裏的名字訂單通過num_floorsDESC限製5

內聯的磚內置的可視化分析圖表,例如,紐約最高的建築。
內聯的磚內置的可視化分析圖表,例如,紐約最高的建築。

柵格數據

光柵數據存儲信息的功能細胞(或像素)組成的矩陣行和列(離散的或連續的)。衛星圖像、攝影測量和掃描地圖是所有類型的基於柵格的地球觀測數據(EO)。

以下Python示例使用RasterFrames DataFrame-centric空間分析框架,閱讀兩個樂隊的GeoTIFF Landsat-8意象(紅色和近紅外),組合成歸一化植被指數。我們可以使用這些數據來評估工廠衛生在紐約。rf_ipython模塊是用來操縱RasterFrame成各種視覺上有用的形式,內容如下麵紅色,近紅外光譜和歸一化植被指數呈現顏色坡道,瓦列使用磚內置displayHTML(…)命令來顯示結果在筆記本上。

% python#構造一個CSV RasterFrames“目錄”“光柵”讀者#目錄也可以引發或

RasterFrame內容可以過濾、轉換、總結,重新取樣,並通過200 +光柵光柵和矢量函數。
RasterFrame內容可以過濾、轉換、總結,重新取樣,並通過200 +光柵光柵和矢量函數。

通過自定義火花數據源RasterFrames可以閱讀各種光柵格式,包括GeoTIFF JP2000 MRF, HDF,從一個一係列的服務。它還支持閱讀GeoJSON和WKT / WKB矢量格式。RasterFrame內容可以過濾、轉換、總結,重新取樣,光柵200 +光柵和矢量函數,如st_reproject(…)和st_centroid(…)在上麵的示例中使用。它為Python提供了api、SQL和Scala以及與火花毫升的互操作性。

GeoDatabases

Geo數據庫可以filebased較小規模的數據或通過JDBC / ODBC連接中等規模數據。您可以使用磚查詢很多內置的SQL數據庫JDBC / ODBC數據源。連接到PostgreSQL如下所示通常用於規模較小的工作負載的應用PostGIS擴展。這種模式的連接允許客戶保持原有訪問現有的數據庫。beplay体育app下载地址

% scala顯示器(sqlContext.read。格式(“jdbc”).option (“url”jdbcUrl).option (“司機”,“org.postgresql.Driver”).option (“數據表”,“””(從yellow_tripdata_staging選擇*抵消5限製10)當t”“”)/ /謂詞下推.option (“用戶”jdbcUsername).option (“jdbcPassword”jdbcPassword).load)

開始使用地理空間分析數據磚

企業和政府機構尋求利用空間引用結合企業數據源的數據畫出可行的見解和實現廣泛的創新的用例。在這個博客,我們演示了磚統一數據分析平台Beplay体育安卓版本可以很容易地規模地理空間的工作負荷,使我們的客戶能夠利用雲計算來獲取、存儲和分析大量數據的大小。beplay体育app下载地址

在以後的博客,我們將深入了解地理空間處理大規模數據磚更高級的主題。你會發現更多細節關於空間格式和突出顯示框架通過評審數據準備筆記本電腦,GeoMesa + H3筆記本,GeoSpark筆記本,GeoPandas筆記本,Rasterframes筆記本。另外,請繼續關注我們的新部分文檔專門為地理感興趣的話題。

下一個步驟

免費試著磚

相關的帖子

看到所有工程的博客的帖子
Baidu
map