玩轉地球: 如何利用SAS繪製現代化地圖(附代碼)

2021-02-15 大數據文摘

投稿作者|巫銀良

大數據文摘歡迎各類優質稿件

請聯繫tougao@bigdatadigest.cn

移動網際網路應用和大規模社交網絡催生了海量的數據分析需求,時空數據作為記錄用戶和設備在現實世界分布和活躍程度的基礎數據,一直為各大網際網路電子商務平臺和商家所關注。地理空間數據結合其他業務數據如何被分析利用,以及如何在分析中可視化呈現一直是現代化分析平臺的一個重要方向。一方面各種地圖服務越來越多地集成到應用中,成為應用增強交互的組成部分(比如「附近的服務/人」,甚至連支付包紅包都需要呈現各種方位關係,來增強樂趣),另一方面在分析行業,如何能夠高效方便地繪製各種地圖成為一種基本需求。

SAS 語言中提供了能夠繪製地圖的能力。 考慮到 SAS 並不是地圖數據的生產者,SAS 只是利用數據。在早些年,儘管SAS提供的地圖數據來源多種多樣,但SAS花了大量的時間精力來保證用戶地圖數據的精確性。隨著現代衛星和測繪技術的成熟和一些其他原因(比如不再從CIA 獲得世界數據),SAS 不再維護既往的地圖數據,而是和第三方廠商合作來提供能夠定期更新的最新數據,這樣就不必考慮不同地理坐標系統和地緣政治格局變化帶來的基礎地理數據更新。

在傳統上,SAS 預設提供 MAPSSAS 庫和 PROC GMAP, PROC GPROJECT, PROC GREMOVE, GEONCODE 等若干過程步來支持地圖繪製功能。利用這些基礎數據和過程步,用戶能很容易繪製世界地圖,各大洲地圖,各國家地區地圖。從SAS 9.30M2 版本開始,SAS 和 GFK GeoMarketing 合作,提供MPASGFK基礎庫,它能為用戶提供超過240個國家和地區精準的數字郵政代碼和行政區劃地理數據。Gfk GeoMarketing 的數字地圖是世界範圍內最全最完整的數字地圖,坐標系統為 WGS84 並且定期更新。根據筆者的調查,MapGfK 基礎庫包括2個世界級(其中一個world_cities為世界城市),22個洲級,175個國家級6個美國州縣的地理數據與對應屬性數據。雖然看起來很全,但也並非十全十美,比如筆者發現有些版本China地圖數據沒有包括臺灣島的內容,也沒有反映2010年的北京核心四區合併為兩區 等變化。

下面,我們舉個最簡單的例子,來說明如何在SAS 裡繪製地圖:

proc gmap map=mapsgfk.world data=mapsgfk.world;

    id id;

    choro id / nolegend;

run;quit;

運行上面幾行代碼,SAS 會在結果窗口中輸出如下結果:

如果你需要繪製亞洲或者中國地圖,則只需要將上面world 改為 Asia或China 即可。

proc gmap map=mapsgfk.asia data=mapsgfk.asia;

    id id;

    choro id / nolegend;

run;quit;

細心的觀眾會發現,亞洲地圖確實按照各個國家進行了準確的繪製,但中國地圖則看起來黑壓壓的一片(…這個,其實反映的是俺們大中華確實是地大物博啊),並沒有什麼實用價值九段線是確實包括在內,但其中竟然沒有寶島臺灣(不要慌,下面我們介紹如何將缺失的臺灣部分和中國地圖合併為大中華地圖)

data mytaiwan;

    set mapsgfk.taiwan;

    id2=id1; id1='CN-83';

run;

data GreatChina;

    set mapsgfk.china mytaiwan; /*合併臺灣到大中華*/

run;    

proc gmap map= GreatChina data= GreatChina;

    id id;

    choro id / nolegend;

run;quit;

執行上面的代碼,輸出結果如下。臺灣出現在地圖正中央(四川盆地)位置。原因是各個分區地圖有自己的投影基點,我們需要按照中國數據進行投影。

為了將臺灣島移到指定位置,需要在調用 PROC GMAP 前執行如下代碼,對臺灣島的數據根據中國的投影進行變換:

...

proc GPROJECT data=GreatChina out=GreatChina  LATLON PARMIN=mapsgfk.projparm PARMENTRY=china; 

       id id;

run;

proc gmap map=..

在實際製作地圖時,並不需要這麼多的細節數據。因此我們需要將不必要的地區和縣的邊界刪除,然後再調用 PROC GMAI繪圖。代碼如下:

proc sort data=GreatChina out=tmpds;

    by ID1;

run;

proc gremove data=tmpds out=tmpds;

    by ID1;

    id id;

run;

data GreatChina(drop=ID1);

    set tmpds;

    id=ID1;

run;

為了給各省標註上省名,我們可以利用 MAPSGFK庫中已有的地圖屬性數據來繪製標籤。此時需要利用系統自帶的宏 %annomac 和 %maplabel 來生成描述數據數據。另外,需要對臺灣島的描述數據進行特殊處理,統一到大中華地圖中來。代碼如下:

data mytaiwan_attr;

    set mapsgfk.taiwan_attr;

    id2=id1; id2name=id1name;

    id1='CN-83'; id1name="Taiwan Sheng"; isoname='China';/*增補*/

    drop country ;

run;

data GreatChina_data;

    set mapsgfk.China_attr mytaiwan_attr; /*合併臺灣省的描述數據*/

    keep id1 id1name;

    rename id1=id  id1name=idname;

run;

%annomac;

%maplabel (GreatChina, GreatChina_data, anno_label, idname, id, font=%str(SimSun), color=black, size=1.5, hsys=3);

proc gmap map=GreatChina data=GreatChina_data;

    id id;

    choro id / nolegend anno=anno_label;

run;quit;

上面的地圖顯示的是英文名稱,而我們希望顯示中文名稱怎麼辦?很簡單,我們只需要在代碼中使用 id1nameU 列,並將字符進行轉義即可顯示正確:

data mytaiwan_attr;

    set mapsgfk.taiwan_attr;

    id2=id1; id2name=id1name;

    id1='CN-83'; id1name="Taiwan Sheng";   isoname='China';

id1nameu= put('臺灣省',$uesc200.);

    drop country ;

run;

data GreatChina_data;

    set mapsgfk.China_attr mytaiwan_attr; /*合併臺灣省的描述數據*/

    keep id1 id1nameU;

    rename id1=id  id1nameU=idname;

run;

%annomac;

%maplabel (GreatChina, GreatChina_data, anno_label, idname, id, font=%str(SimSun), color=black, size=1.5, hsys=3);

data anno_label; set anno_label; text=unicode(text);run;

proc gmap map= GreatChina data= GreatChina_data;

    id id;

    choro id / nolegend anno=anno_label;

run;quit;

雖然在 MAPSGFK 基礎庫中有很多基礎地理數據,但在現實中依然不夠用怎麼辦? 解決方案有兩種:第一種是直接利用實際測繪的地理數據創建自定義地圖;第二種方法是利用谷歌地球導出地球上任何地區/建築的 KML 數據,然後再導入到 SAS 系統裡創建地圖。比如下圖就是用第二種方法創建的谷歌總部第40號樓的地理數據。(下圖為 Google Earth裡的樣子)

%MAPIMPORT(DATAFILE="test.kml",out=%str(mymap), ID=201);

data mymap;   set mymap;

    x=long;y=lat;

run;

data mymap_data;

   attrib ID length=$15 label='Districts code';  

   attrib IDNAME length=$55 label='Districts name';   

   infile datalines dsd;

   input

      ID     

      IDNAME     

   ;

datalines4;

201,Google Building 40

;;;;

data mymap_data; set mymap_data;

    length my_html $100;

    my_html='title='||quote(trim(left(idname)));

run;

goptions reset=all;

goptions hsize=1024pt vsize=768pt;

ods html;    

%let mymap=mymap;

%let mymap_data=mymap_data;

%annomac;

%maplabel (&mymap, &mymap_data, anno_label, idname, id, font=%str(SimSun), color=WHITE, size=1.5, hsys=3);

proc gmap map=mymap data=mymap_data;

    id id;

    choro id / nolegend anno=anno_label;

run;quit;

ods html close;

以上代碼生成結果如下,為Google總部40號樓的精確地理信息,可用於進一步分析處理。

在網際網路上,有時聽見一些人抱怨 SAS 語言做出的圖表不夠美觀,顯得比較粗陋。其實造成這誤解的根本是沒有掌握 SAS 強大的特性控制功能和實現的靈活性。為了展示 SAS 在繪製地圖方面預留的靈活性和控制,下面將展示若干純粹利用 SAS 代碼繪製的各種現代化的複雜地圖。SAS語言天生作為面向分析而設計的語言,它保留了非常多的擴展性;筆者甚至發現在 SAS 地圖裡可以繪製天氣雲圖(見下圖3)。正所謂倚天不出,誰與爭鋒?在分析行業裡只有掌握了如何使用SAS這把倚天劍,才能使數據分析結果的展示一切皆有可能!

圖1:SAS繪製空白中國省圖

圖2:SAS繪製的中國各省的衛星地圖

圖3:SAS 繪製的帶有衛星雲圖的中國分省圖

總結:

SAS GMAP 提供 2D (choropleth) 和 3D (block, prism, surface) 地圖的繪製和渲染,用來將分析變量和結果顯示在地圖上。既往的研究表明,SAS 用戶可以橋接任何地圖服務商的數據,包括 MAPBOX, MAPQUEST, HERE, GOOGLE,ARCGIS和 AutoNavi(高德)的地圖和他們的各種變體:衛星圖(SATELLITE), (街道圖)STREETS, (地形圖)TERRAIN和(交通圖)TRAFFIC 等。 PROC GMAP 的所有奧秘其實都藏在它的 MAP和DATA 參數裡,至於如何實現,就需要在實際需求中與具體業務數據結合考慮。

賽仕軟體研究開發(北京)有限公司

商業智能和可視化分析產品部 技術總監

如需轉載,請在開篇顯著位置註明作者和出處(轉自:大數據文摘 |bigdatadigest),並在文章結尾放置大數據文摘醒目二維碼。無原創標識文章請按照轉載要求編輯,可直接轉載,轉載後請將轉載連結發送給我們;有原創標識文章,請發送【文章名稱-待授權公眾號名稱及ID】給我們申請白名單授權。未經許可的轉載以及改編者,我們將依法追究其法律責任。聯繫郵箱:zz@bigdatadigest.cn。

點擊圖片閱讀文章

Kaggle | 使用Python和R繪製數據地圖的十七個經典案例(附資源)

相關焦點

  • 利用人工智慧技術,如何解決海洋問題?
    上面的這些事實雖然聽起來很可怕,不過需要樂觀得指出的是,利用技術——尤其是人工智慧技術,將有助於解決這些海洋問題,修復我們的海洋環境。海洋如今面臨的諸多問題其實源於我們不了解它——儘管它佔據著四分之三的地球面積。諷刺的是,我們對海洋的了解,連對火星和月球的了解都比不過。水下的生命幾乎是不可見的,因此海洋生命幾乎超過了我們的文化認知。
  • 小經驗:用Excel表格繪製檢驗科室內質控圖(附視頻)
    利用Excel軟體製作的質控圖美觀、規範,對於沒有LiS系統的基層實驗室判別質控的失控及處理有很好的指導作用[2]。用Excel表格繪製檢驗科室內質控圖,是在LIS系統不支持質控數據管理,或者基層醫院缺乏資金不能購買專業質控軟體的前提下,做出的折中方案。
  • 谷歌地圖首曝數據:覆蓋全球98%居住區,已拍千萬英裡街景
    12月13日,谷歌透露了其街景車(Street View car)等設備為繪製世界地圖所做的工作。
  • 大跌眼鏡:學了那麼多年地理,我們都被地圖騙了!
    好吧,聽起來不明覺厲……然而它想表達的重點是:地球不是平的,不是平的,不是平的我們還是用事實說話吧。或者地球其實應該是這樣的吧!感覺打開了新世界的大門地球是三維的橢球體,而地圖只是平面的一張紙。球體表面是無法展成平面的曲面,而為了保證繪製完整的平面圖,會把經緯線進行拉伸或壓縮,於是產生了投影變形。繪製面積越大,地圖變形越明顯。無論用哪一種投影方式繪製的世界地圖,它都存在一定程度的變形,或者長度變形,或者角度變形,或者面積變形。
  • 未解之謎:古人繪南極地圖震驚世界
    1929年,在土耳其伊斯坦堡的塞拉伊圖書館,人們發現了一張用羊皮紙繪製的航海地圖,當然這不是原圖,而是精美的複製品。
  • 種族歧視地圖? 中東人和東亞人聚居區曝光
    一張繪製了雪梨種族和人種分布的可視化地圖顯示,北部海灘與雪梨其他的地區相比缺乏文化的多樣性。
  • 百度旅遊上線足跡地圖 與好友來一場旅行PK
    近日,百度旅遊7.0版本全新升級,並在年末推出了推出了情懷滿滿的「足跡地圖」,通過點選自己走過的地方去過的國家和城市,就會自動生成一份屬於你的獨特的足跡地圖,同時,還可以邀請好友進行PK,曬出你的旅行成就,滿足你的分享願望。
  • 衛星地圖:高清可以看到人的地圖,附下載方法
    ),清晰到可以看到人、樹枝,遇到風景好的地方效果堪比看攝影大片,另外附上高清衛星地圖的下載方法:http://www.bigemap.com/source/clause.html 本文概要:衛星地圖現在清晰到了什麼程度如何下載能看到人的高清衛星地圖衛星地圖現在清晰到了什麼程度,可以看到人嘛?
  • 智利:如何印地圖竟成了全民難題,只因國土太狹長,世界之最
    這個世界上還有地圖不好印的國家嗎?聽起來有點搞笑。不過當你看了世界地圖上的這個國家你就知道了。因為它狹長的像一條蛇趴在阿根廷的背上。
  • 衛星地圖:有沒有實時高清衛星地圖?
    雖然很多人在找實時超高清衛星地圖,但是很遺憾的明確的告訴大家,沒有實時超高清衛星地圖。
  • ArcGIS教程:地圖投影
    此數學變換通常稱作地圖投影。理解地圖投影如何改變空間屬性的一種簡便方法就是觀察光穿過地球投射到表面(稱為投影曲面)上。想像一下,地球表面是透明的,其上繪有經緯網。用一張紙包裹地球。位於地心處的光會將經緯網投影到一張紙上。現在,可以展開這張紙並將其鋪平。紙張上的經緯網形狀與地球上的形狀不同。地圖投影使經緯網發生了變形。展平旋轉橢球體並不比展平橙皮容易,因為它會破裂。
  • 【民航知識】機場代碼怎麼來的?這些代碼你都認識嗎?(附國內、國際三字代碼圖)
    給機場編碼始於20世紀30年代,航空公司通常會選擇它們自己的兩字代碼。到20世紀40年代,機場數量太多了,系統開始轉向我們如今熟悉的三字代碼。以洛杉磯國際機場為例,它原來的代碼是LA,但在1947年變成了LAX。等到航空公司決定它們需要一個標準化流程以避免混亂時,IATA在20世紀60年代開始介入機場代碼命名。
  • Nature:從全球天然林再生中繪製碳積累潛力圖
    為了減少不確定性並更好地預測碳積累率的變化,這個研究通過文獻搜索和國家統計數據得到了全球自然生長森林中碳的全球數據集,使用這些數據來評估氣候因素,土壤特徵和歷史土地利用如何影響碳積累的變化,並建立一個在全球範圍內潛在碳積累的空間模型。為了評估速率為何以及在何處不同,這個研究在匯總了13112個碳累積的地理測量數值。
  • 玩轉代碼:32個有趣的代碼注釋
    代碼注釋是一種用但還有一些「悶騷」的程序猿,早已把代碼注釋玩兒出了花。玩梗、吐槽、畫畫……還有什麼是他們不能做的?
  • CIA解密地圖:美國眼中的世界格局
    圖片來源:CIA地圖展示的信息會隨著不同時期地緣政治挑戰的變化而變化,但這些地圖的繪製質量從未鬆懈。對秘密機構來說,一張精確的地圖比其他工具都要有用的多,或許意味著成敗和生死之間的差別。長期以來,以保密聞名的美國中央情報局一直秘密保留著地圖和製圖方法。
  • 中文版澳洲地圖發布!吸引更多投資和留學生
    澳洲地圖為吸引更多中國遊客與留學生,澳洲地圖測繪公司Spatial Vision發布了該國最中文版澳洲地圖。
  • 實景地圖導航:3D世界地圖高清版
    查看世界地圖的工具有哪些可以提供呢?3D世界地圖官方版是簡單好用的世界地圖工具,可以看到地球的大概模樣,選擇不一樣的海洋能看到不一樣的事物,這也是一款3d世界地圖高清地圖,需要用地圖軟體的可以下載。3D世界地圖官方版軟體功能1、藉助3D世界地圖,您可以3D模式查看地球,獲取269個國家和實體的參考,定位並比較30,000多個城市,計算地球表面任意兩點之間的距離,並放大海拔高度以查看地球是什麼樣的。2、可以從幾種不同設計的地球儀中進行選擇,調整地球自轉的速度,選擇海洋和陸地的不透明度,並從幾個攝像機角度進行選擇。
  • 打得了針,畫得了畫,白衣天使手繪江西首份卡通醫院導航地圖
    近日,南昌大學第一附屬醫院象湖院區推出了一組由護士繪製的卡通漫畫地圖。據了解,這也是江西省首家以手繪地圖形式,進行院內導航的醫院。李君梅口中的這位護士便是手繪卡通漫話地圖的創作者——中醫科護士劉敬。1994年出生的劉敬已經在醫院工作了6個年頭。「我從小就愛畫畫,來醫院工作後,利用空餘時間自學了PS和SAI的操作技能,覺得以後可能用得上。沒想到這次真的發揮了作用,我還挺開心的。」劉敬笑道。
  • 效率大作戰:利用Markdown編寫微信圖文小技巧
    可利用的軟體一般我都是在簡書或者利用離線的Markdown編輯器比如Sublime Text3或者Atom撰寫Markdown文檔.Atom+Markdown preview enhanced插件Atom結合enhanced插件功能是很強大的,除了常規的markdown功能之外,還可以將撰寫好的markdown轉化為pdf,epub,mobi等電子書,同時可以繪製狀態圖/用例圖/類圖等各種UML圖像,友情提示:使用enhance插件要金庸atom默認自帶的markdown
  • Python繪製中國五星紅旗及美國星條旗原始碼
    本文含中國五星紅旗、美國星條旗、五星紅旗運行效果:五星紅旗是中華人民共和國的國旗,它是由四顆小的黃五角星環繞一顆大的黃五角星組成的,底色為紅色,實現代碼如下