據(jù)集處理全攻略:從SHP到城市時空分析)
做數(shù)據(jù)的這些年我越來越覺得OSMOpenStreetMap這類開放數(shù)據(jù)源是個寶藏但真要把它用得順手第一步往往是拿到一套干凈、結(jié)構(gòu)清晰、按年份切好的數(shù)據(jù)而不是自己從原始 XML 里一點點吭哧吭哧地解析。最近在做一個城市空間結(jié)構(gòu)演變的長期分析我就把 2014 到 2025 年逐年的 OSM 興趣面AOI矢量數(shù)據(jù)集整套拉了下來格式是 SHP。順手把整個處理流程、字段邏輯和踩過的坑梳理了一遍今天分享出來給準備做類似項目的朋友一個參考。這套數(shù)據(jù)集解決的核心問題很簡單你要研究一個區(qū)域的商業(yè)設(shè)施擴張、居住區(qū)演變、公共服務(wù)配套變化或者做某個品牌的門店選址累積分析你需要一套長時間序列、屬性相對穩(wěn)定、幾何邊界可用、且能直接拿進 GIS 軟件QGIS / ArcGIS / PostGIS里跑的 AOI 數(shù)據(jù)。OSM 正好提供了這個底子而把它加工成逐年版 SHP就是讓這件事變得可以批量操作、可以對比、可以復(fù)現(xiàn)。適合誰做城市規(guī)劃研究的學(xué)生、地理信息從業(yè)者、數(shù)據(jù)分析師以及任何需要空間面狀要素做趨勢判斷的人。1. 內(nèi)容整體設(shè)計與思路拆解1.1 為什么選擇 OSM 作為 AOI 數(shù)據(jù)源AOI 數(shù)據(jù)聽起來有點學(xué)術(shù)其實就是興趣面也就是一個帶邊界的區(qū)域?qū)ο?。比如一個商場、一個公園、一所學(xué)校、一片住宅小區(qū)在空間上都可以用一個面來表示。市面上有很多成熟的商業(yè) AOI 數(shù)據(jù)比如一些商業(yè)地產(chǎn)數(shù)據(jù)平臺會提供商場輪廓但問題很明顯貴而且很多只覆蓋重點城市歷史年份基本拿不到。OSM 不一樣。它是由全球志愿者共同維護的開放地理數(shù)據(jù)庫里面包含了大量的建筑輪廓、土地利用landuse、休閑區(qū)域leisure、商業(yè)設(shè)施amenity等面狀要素。雖然它的精度和完整度在不同區(qū)域差異很大但作為長期趨勢分析的數(shù)據(jù)基底它是目前最易獲取、覆蓋面最廣、時間可回溯的開放數(shù)據(jù)源。而且 OSM 有完整的歷史數(shù)據(jù)歸檔機制這意味著理論上可以重建任何一個時間段的地圖狀態(tài)逐年版 AOI 數(shù)據(jù)集就是從這個機制里蒸餾出來的產(chǎn)品。1.2 逐年版的設(shè)計邏輯為什么把數(shù)據(jù)按年份切而不是給一個最新的“全量快照”做過時序分析的朋友應(yīng)該深有體會如果你手里只有 2025 年的商場輪廓你想說“某商圈近十年商業(yè)面增長了百分之多少”是完全沒有依據(jù)的。逐年版的數(shù)據(jù)讓你可以在時間軸上做“切片”然后比較每個切片的面積、數(shù)量、空間分布變化。2014–2025 這個時間段也選得講究它跨越了移動互聯(lián)網(wǎng)高速滲透的十年也是國內(nèi)城市空間結(jié)構(gòu)劇烈重構(gòu)的十年用這個窗口做城市演變分析信息量非常足。這些年切片數(shù)據(jù)的價值還有一個容易被忽視的地方它天然形成了一套“訓(xùn)練集”可以用于空間預(yù)測模型的標注。比如做一個城市商業(yè)設(shè)施擴張預(yù)測模型你是需要過去多個年份的真實 AOI 邊界作為基線數(shù)據(jù)的逐年版數(shù)據(jù)對比單一年份是一條質(zhì)的飛躍。1.3 為什么選擇 SHP 格式SHPShapefile是 ESRI 主導(dǎo)的一種矢量數(shù)據(jù)格式從 90 年代用到現(xiàn)在。論“先進程度”它比 GeoJSON、GeoPackage 差遠了字段名長度限制 10 個字符一個要素集要拆成 .shp、.shx、.dbf、.prj 等多個文件并存甚至還可能出現(xiàn) .cpg字符編碼描述文件。但它的統(tǒng)治力就在于是行業(yè)事實標準幾乎所有 GIS 軟件、幾乎所有編程語言的空間庫比如 Python 的 geopandas / pyshp都對 SHP 有最成熟的支持。第三方做數(shù)據(jù)交換的時候默認選項總是 SHP尤其是涉及甲方交付、政府項目對接的場景SHP 是絕對的安全牌。我自己的習(xí)慣是對外交付用 SHP對內(nèi)自己分析一般會轉(zhuǎn)成 GeoPackage因為后者的單文件存儲、字段長度和空間索引都做得更好。不過這篇博文的場景我重點圍繞 SHP 說因為它最通用碰上兼容性問題的概率最低。2. 核心細節(jié)解析與實操要點2.1 AOI 的語義分層與數(shù)據(jù)結(jié)構(gòu)拿到手的數(shù)據(jù)不是一張“大雜燴”面而是做了語義分類的。簡單來說OSM 里面表示一個興趣面的方式很多比如 building、landuse、leisure、amenity、shop、tourism、historic、military 等每個主標簽key下面又有若干子標簽value。為了讓數(shù)據(jù)更可用這套逐年版數(shù)據(jù)集大概率會做一層“歸一化”把 OSM 原始標簽映射到一個統(tǒng)一的行業(yè)分類體系上。舉個例子OSM 里一個要素可能標的是buildingretail另一個標的是shopsupermarket還有可能標amenitymarketplace。這三者在語義上有重疊但原始標簽各不相同直接用會非常痛苦。你需要的是在“商業(yè)”“居住”“公共服務(wù)”“綠地”“工業(yè)”這種層級上看趨勢。所以數(shù)據(jù)處理的第一原則就是理清分類映射關(guān)系。下面是我個人在拿到這類數(shù)據(jù)后會默認使用的分類映射思路不是絕對標準但可以作為參考業(yè)務(wù)分類對應(yīng) OSM 主要標簽組合商業(yè)/零售shop*、buildingretail、amenitymarketplace居住buildingapartments / residential / house、landuseresidential公共服務(wù)/教育amenityschool / college / university / hospital / library工業(yè)/物流landuseindustrial、buildingwarehouse、amenitybus_station綠地/公園leisurepark / garden、landuserecreation_ground / grass文體/娛樂leisurestadium / sports_centre / fitness_centre、amenityarts_centre這個映射表做得好不好直接決定后面所有分析的語義可信度。如果你只是簡單地把buildingyes這種全量數(shù)據(jù)拉出來當(dāng) AOI 用面積統(tǒng)計會極為膨脹因為建筑面會被算進去但你要看的功能面其實是 POI 對應(yīng)的地塊邊界。2.2 SHP 字段結(jié)構(gòu)與空間坐標一個標準的 SHP 文件夾里至少有四種文件少一個都打不開。.shp存幾何.shx存索引.dbf存屬性表.prj存坐標系信息。有些時候你會額外看到.cpg和.sbn / .sbx前者是編碼聲明后者是空間索引生成過就不該刪。這也就引出一個極其常見的誤區(qū)有人拷貝數(shù)據(jù)的時候只拿走了.shp文件回頭在軟件里打不開以為是數(shù)據(jù)壞了其實只是文件不完整。坐標系這塊我拿到這套數(shù)據(jù)時重點確認了.prj文件里的定義。OSM 原始幾何是 WGS84 經(jīng)緯度坐標EPSG:4326這在地理坐標下跑沒問題但是做面積計算、距離測量和空間疊加就會遇到“單位是度”的尷尬。我的建議是所有涉及面積的計算必須投影到適合目標區(qū)域的分帶投影坐標系比如國內(nèi)項目一般用 CGCS2000 / WGS84 對應(yīng)的 UTM 分帶或者直接用 Web 墨卡托 EPSG:3857 做可視化用 Albers 等積投影做面積分析。千萬不要拿 WGS84 的經(jīng)緯度直接算平方米結(jié)果會錯到離譜。字段結(jié)構(gòu)上這套逐年版數(shù)據(jù)集的屬性表大概率包含這樣一些字段字段名說明備注osm_id原始 OSM 要素 ID用于跨年份回溯非常重要name名稱可能為空OSM 本身填充率不高type主類別如商業(yè)、居住、公共服務(wù)subtype細分類別如超市、學(xué)校、公園area面積平方米一般是按投影坐標算好的src_ver數(shù)據(jù)版本日期判斷數(shù)據(jù)更新時點update_year年份標簽用于年度切片2.3 逐年版數(shù)據(jù)與歷史回溯的注意點OSM 的歷史數(shù)據(jù)回溯有一個特性某一年的“地圖狀態(tài)”是基于該時間點的節(jié)點、路徑、關(guān)系快照重建的。這意味著如果你用 OSM 的歷史數(shù)據(jù)工具比如 osm-history-renderer 或者直接借助其內(nèi)部的數(shù)據(jù)模型去重建一個城市的 2014 年 AOI所得結(jié)果和今天的版本一定有差異這種差異既反映了真實世界的變化也反映了當(dāng)時 OSM 數(shù)據(jù)采集的不完整。因此使用逐年版 AOI 數(shù)據(jù)做趨勢分析要區(qū)分兩個概念真實擴張與采集補全。比如某一行政區(qū)在 2016 年 AOI 數(shù)量暴漲未必是當(dāng)年真的開了幾百家店而可能是那一年 OSM 在該區(qū)域的采集活動非?;钴S把以前沒畫出來的都補上了。合理的做法是看“增長率是否顯著偏離同區(qū)域其他年份的基線”如果異常高就要留個心眼看看是不是數(shù)據(jù)采集導(dǎo)致的跳變。我記得處理這套數(shù)據(jù)時對比某新區(qū) 2018 和 2019 年的商場 AOI 數(shù)量猛然增加了 200%以上細查發(fā)現(xiàn)是那個區(qū)域在 2018 年經(jīng)歷了一場大規(guī)模制圖活動大量建筑和地塊被重新描繪。后來我引入了“區(qū)域 OSM 編輯活躍指數(shù)”作為輔助校正因子才把這種采集噪聲和真實商業(yè)增長剝離開。這個思路值得做時序分析的朋友認真考慮。3. 實操過程與核心環(huán)節(jié)實現(xiàn)3.1 數(shù)據(jù)準備與環(huán)境配置我的處理環(huán)境是 Windows 11 QGIS 3.34 LTR Python 3.10 geopandas 庫。如果你習(xí)慣用 ArcGIS 也沒問題核心邏輯一致。確保 QGIS 的“OSM 工具”插件已安裝后面如果要拉取原始 OSM 增量做輔助校準會用到。處理順序建議按下面的流程走拿到逐年版 SHP 數(shù)據(jù)后先建一個統(tǒng)一目錄命名為aoi_vector_2014_2025/把每年的 .shp 單獨放一個子目錄例如2014/、2015/…… 不要把所有年份文件混在一起不然后面篩選時文件名都分不清。打開 QGIS把 2025 年那期數(shù)據(jù)先拖進來作為底圖建立整體認知。注意看圖層的坐標單位如果顯示是經(jīng)緯度就把項目坐標系臨時設(shè)為 EPSG:4326只用于瀏覽。在圖層屬性里查看屬性表確認字段名和字段類型。我這里特別核對了兩件事area是不是數(shù)值型update_year是不是整數(shù)型。如果發(fā)現(xiàn)字段是文本型后面做面積匯總時會很痛苦必須先用字段計算器轉(zhuǎn)成數(shù)值型。3.2 投影轉(zhuǎn)換與面積計算這是所有步驟中最容易出錯、又最影響結(jié)果的一環(huán)。以中部某城市為例我計劃做的是 AOI 密度和面積趨勢分析所以選定 EPSG:32650WGS84 UTM 50N 分帶作為分析坐標系。為什么用這個因為目標城市大致落在北緯 30°–36° 之間UTM 50N 覆蓋的是東經(jīng) 117°–123°對于中部偏東區(qū)域是合適的。強烈建議不要用同一個投影跑全國數(shù)據(jù)分帶投影只有在帶區(qū)附近精度才是可接受的跨帶計算會積累明顯變形。投影轉(zhuǎn)換操作如下在 QGIS 中右鍵圖層選擇“導(dǎo)出”“另存為”在“CRS”下拉框中選 EPSG:32650并勾選“將參數(shù)添加到圖層名稱”以便識別。轉(zhuǎn)換完成后重新計算面積在屬性表中新增字段area_m2表達式中填寫$area注意此時$area的單位已經(jīng)變成平方米因為圖層幾何已經(jīng)做了投影。對于 Python 用戶等價操作是import geopandas as gpd gdf gpd.read_file(aoi_2025.shp) gdf_proj gdf.to_crs(EPSG:32650) gdf_proj[area_m2] gdf_proj.geometry.area做完這一步建議抽查幾個面要素的邊長和面積驗證投影轉(zhuǎn)換是否合理。比如拿一個你熟悉的公園估算一下長寬再和面積字段對比如果嚴重不符多半是 CRS 設(shè)置錯了。3.3 年份切片提取與屬性清洗如果你拿到的是一份包含全部年份的“大表”即一個 SHP 里 20 萬條記錄每條記錄有一個年份字段你需要按年份切片。在 QGIS 里直接按屬性篩選即可比如update_year 2014另存為獨立圖層。在 Python 里就一行for year in range(2014, 2026): gdf_year gdf[gdf[update_year] year] gdf_year.to_file(faoi_{year}.shp, encodingutf-8)這里有個坑SHP 的字段名最長 10 個字符。如果原始屬性表里字段名超過這個長度保存時會自動截斷比如update_year變成update_yeasub_category變成sub_categ而且一旦保存字段名就永久性截斷了后續(xù)寫代碼時引用會非常難受。建議在前期就建立一份“字段映射表”把截斷后的字段名和業(yè)務(wù)含義對應(yīng)起來。這不麻煩但能省掉后面大量無效工時。屬性清洗這一步重點做三件事去除空幾何gdf gdf[gdf.geometry.notna()]刪除面積異常過小的要素比如面積小于 10 平方米的碎片通常都是制圖誤差保留只會污染統(tǒng)計。對name字段做去空格和去全角轉(zhuǎn)半角處理OSM 數(shù)據(jù)里的名稱經(jīng)常帶首尾空格或不規(guī)則空格后面做名稱匹配時會有大麻煩。3.4 多年份橫向?qū)Ρ确治銮謇硗耆舾赡攴莸臄?shù)據(jù)就可以做對比分析了。這里我給出一個常用的分析流程。以商業(yè) AOI 變化分析為例連接所有年份的數(shù)據(jù)按type篩選出商業(yè)/零售。對每個年份分別統(tǒng)計 AOI 數(shù)量、總面積、平均面積、最大單體面積。將統(tǒng)計結(jié)果輸出成寬表形如“年份 | 數(shù)量 | 總面積 | 平均面積”。把逐年結(jié)果合并導(dǎo)出為 CSV后續(xù)用 Excel 或 Python 做趨勢圖。Python 的參考代碼summary [] for year in range(2014, 2026): ydf gdf[(gdf[update_year] year) (gdf[type] 商業(yè)/零售)] summary.append({ year: year, count: len(ydf), total_area: ydf[area_m2].sum(), avg_area: ydf[area_m2].mean(), }) result pd.DataFrame(summary) result.to_csv(commercial_aoi_trend.csv, indexFalse, encodingutf-8-sig)如果你想進一步看空間格局變化可以做“新增/消失”分析。比如 2014 與 2025 兩個年份做空間疊加用 QGIS 的“相交”和“差異”工具提取出哪些商業(yè) AOI 是 2014 就有且一直存在的哪些是 2025 年新增的哪些是消失了。這個過程既可以可視化展示空間擴張方向也可以量化城市中心再開發(fā)的老舊地塊面積。3.5 名稱匹配與跨年關(guān)聯(lián)跨年份做要素關(guān)聯(lián)是 AOI 數(shù)據(jù)從“統(tǒng)計數(shù)字”走向“故事敘述”的關(guān)鍵一步。比如你想知道某個品牌門店 2014 年的 AOI 邊界和 2025 年的邊界有什么不同如果只是按名稱精確匹配碰上名稱微調(diào)“國際廣場”變“國際廣場二期”就歇菜了。推薦做法是分層匹配第一層精確匹配osm_id。OSM 要素 ID 是穩(wěn)定的身份標識如果同一家商場在 OSM 里沒有被重新繪制跨年份應(yīng)該能對上。第二層精確匹配name字段。第三層名稱模糊匹配用編輯距離Levenshtein 距離或者 Jaccard 相似度配合人工抽查。第四層空間位置匹配用質(zhì)心距離小于 N 米作為關(guān)聯(lián)條件。匹配代碼示意Python 環(huán)境from rapidfuzz import fuzz # 在 2014 年和 2025 年兩份數(shù)據(jù)中做名稱模糊匹配 for idx, row in gdf_2025.iterrows(): # 過濾候選集比如同樣類型、距離 500m candidates gdf_2014[ (gdf_2014[type] row[type]) (gdf_2014.geometry.centroid.distance(row.geometry.centroid) 500) ] for cidx, crow in candidates.iterrows(): score fuzz.ratio(row[name], crow[name]) if score 85: # 記錄匹配關(guān)系 break這套分層匹配思路在實操中很穩(wěn)它不需要所有要素都精確對上但能覆蓋絕大多數(shù)關(guān)鍵目標的跨年追蹤。4. 常見問題與排查技巧實錄4.1 SHP 打不開或只有部分字段原因多半是文件不完整。記住SHP 是一套多文件格式缺.shx或.dbf都會導(dǎo)致讀取異常。解決辦法是拿到數(shù)據(jù)第一時間檢查文件夾中是否包含全套文件特別是.shx和.dbf。如果缺失.prj很多渠道轉(zhuǎn)發(fā)的數(shù)據(jù)都會丟了這文件QGIS 會猜一個默認 CRS通常是 WGS84但你的數(shù)據(jù)本身可能是投影坐標系這種情況會造成幾何錯位。最簡單的判斷辦法是加載后在狀態(tài)欄查看坐標數(shù)值如果經(jīng)緯度長在 100–120 度、30–45 度范圍那大概率是 WGS84如果是幾十萬到幾百萬的單位那是投影坐標。4.2 屬性表中文亂碼SHP 的編碼記錄在.cpg文件里但這個文件有相當(dāng)概率缺失。在國內(nèi)流轉(zhuǎn)的數(shù)據(jù)經(jīng)常出現(xiàn).dbf里的中文內(nèi)容是 GBK 編碼但打開軟件默認按 UTF-8 解碼結(jié)果屬性表里全是亂碼。解決思路是讓軟件按指定編碼讀取在 QGIS 中右鍵圖層選擇“圖層屬性”“數(shù)據(jù)源”在“數(shù)據(jù)源編碼”里改 GBK 或 UTF-8 試一下直到內(nèi)容正常。如果是 ArcGIS 則相對好一些它會自動檢測。在 Python 中讀取時可以顯式指定編碼gdf gpd.read_file(aoi_2014.shp, encodinggbk)這是一個高頻問題每次處理 SHP 我都會先看一眼屬性表內(nèi)容亂碼問題不解決后面所有按名稱的篩選都是空轉(zhuǎn)。4.3 面積統(tǒng)計結(jié)果差距巨大遇到這種情況第一步查 CRS第二步查幾何有效性。無效幾何自相交、重復(fù)點等會導(dǎo)致面積異常甚至計算失敗??梢杂?QGIS 的“修復(fù)幾何”工具處理一遍或者用 GEOS 庫的make_valid方法。實際上在拿到一批 AOI 數(shù)據(jù)后我會先跑一遍gdf[geometry] gdf[geometry].apply(lambda g: g.buffer(0))這個buffer(0)的經(jīng)典小技巧可以修復(fù)很多交疊型無效幾何效果非常穩(wěn)定。面積差異還有一個容易被忽略的原因OSM 里的面要素邊界和真實地塊邊界存在天然誤差特別是綠地、公園這類邊界模糊的地類不同年份的描畫邊界漂移可能造成面積看起來“增長”或“萎縮”。做趨勢分析時建議人工核對幾個典型樣本確認漂移幅度是否可接受。4.4 OSM 原始要素與整理后數(shù)據(jù)的對齊問題這類逐年版 AOI 數(shù)據(jù)集已經(jīng)幫你做了原始 OSM 要素的歸類整理但不可避免會有漏歸、錯歸的情況。比如一個建筑要素既被標成buildingretail又被標成shopmall不同年份的算法可能會隨機歸到不同類導(dǎo)致年份之間類別不一致。建議在發(fā)布或使用前先抽檢 50 條要素對照 OSM 原始數(shù)據(jù)核對歸類準確率。如果發(fā)現(xiàn)錯歸率超過 10%就需要建立一套自定義的優(yōu)先級規(guī)則來強制修正。一個常用做法是把 OSM 的多個標簽字段拼成組合字段再通過查表映射。比如優(yōu)先級設(shè)定為shop優(yōu)先于buildingleisure優(yōu)先于landuse。這樣至少保證同一個 OSM 要素在不同年份的處理結(jié)果一致跨年對比時才不會因為分類抖動產(chǎn)生偽變化。4.5 數(shù)據(jù)年份邊界的選擇與 OSM 歸檔滯后2014 到 2025 的逐年版數(shù)據(jù)聽起來年份很整齊但要注意 OSM 歷史數(shù)據(jù)的完整度在不同時間段差異很大。2014 年的數(shù)據(jù)能拉出來但要素密度可能遠低于真實世界水平2025 年的數(shù)據(jù)較新但 OSM 官方歸檔服務(wù)器同步存在一定延遲某些區(qū)域可能滯后數(shù)周。這意味著如果你的分析特別關(guān)注某些設(shè)施“出現(xiàn)的具體年份”需要結(jié)合當(dāng)?shù)?OSM 編輯活躍度和新聞事件做交叉驗證。我通常會給每個年份加一個“可信度”標注比如要素數(shù)量、區(qū)域活躍度綜合評分這樣在做結(jié)論時不會把一個采集噪聲當(dāng)成真實變化。5. 擴展建議如何把 AOI 數(shù)據(jù)集用出更多價值5.1 與 POI 數(shù)據(jù)疊加驗證AOI 數(shù)據(jù)本質(zhì)上是面狀的空間容器而 POI興趣點數(shù)據(jù)則是點狀的“功能錨點”。兩者結(jié)合非常有用比如拿一個商業(yè) AOI 面去裁剪某年份的 POI 數(shù)據(jù)可以知道這個區(qū)域內(nèi)包含哪些品牌門店反過來如果一個 AOI 面內(nèi)部沒有對應(yīng)類型的 POI可能說明這個 AOI 已經(jīng)廢棄或者 POI 采集不全。我習(xí)慣把 AOI 作為基礎(chǔ)網(wǎng)格POI 作為校驗層生成一個“功能密度指數(shù)”這對城市活力分析很有幫助。5.2 轉(zhuǎn)成 GeoParquet 或 GeoPackage 做大規(guī)模分析如果你要處理的數(shù)據(jù)量非常大幾十萬甚至上百萬個 AOISHP 的讀取性能會成為瓶頸。我的做法是在完成 SHP 清洗和字段整理后轉(zhuǎn)成 GeoParquet 格式用pyarrow做并行讀取速度能快一個數(shù)量級。如果團隊統(tǒng)一用某款 BI 工具也可以轉(zhuǎn)成 GeoJSON 或者直接入庫 PostGIS。SHP 是很好的交換格式但不是最好的分析格式這個認知很重要。5.3 基于逐年版構(gòu)建城市擴張指標有了逐年 AOI 數(shù)據(jù)你其實可以自己算一些有意思的指數(shù)。比如某個城市的“商業(yè)重心遷移軌跡”做法是逐年計算商業(yè) AOI 的質(zhì)心并連線或者算“居住碎片化指數(shù)”做法是統(tǒng)計居住類 AOI 的邊界密度和面積方差。這些指標在公開統(tǒng)計年鑒里找不到而 OSM AOI 數(shù)據(jù)可以低成本補足。如果你要寫論文或做咨詢報告這會是一個非常獨特的數(shù)據(jù)亮點。6. 我對這套數(shù)據(jù)集的實際使用心得處理完 2014 到 2025 年逐年版 OSM 興趣面數(shù)據(jù)集我最核心的體會是這套數(shù)據(jù)不是拿來即用的“成品分析”而是一塊極好的“半成品原料”。它的價值上限取決于你怎么做分類映射、怎么做投影修正、怎么做跨年關(guān)聯(lián)。很多朋友第一次拿到 SHP 就直接做面積統(tǒng)計然后發(fā)現(xiàn)結(jié)果和自己想象差很多就斷定數(shù)據(jù)不可靠這個結(jié)論下得太早了。我自己在這套數(shù)據(jù)上踩過最大的坑就是最開始沒注意跨年的osm_id漂移問題。有一版數(shù)據(jù)在處理的時候歷史年份中的要素 ID 因為 OSM 數(shù)據(jù)重構(gòu)而發(fā)生了整體偏移直接導(dǎo)致我用osm_id做跨年關(guān)聯(lián)時大面積失配。后來我用“空間位置 名稱 類型”三個維度綜合做關(guān)聯(lián)才把匹配率拉回到可接受范圍。這種教訓(xùn)說一次就夠以后處理所有開放數(shù)據(jù)我都默認先驗證 ID 的穩(wěn)定性而不是默認它穩(wěn)定。如果你打算把這套數(shù)據(jù)用在自己的項目里我建議你按我上面分享的流程走一遍先投影再清洗再按年切片再做對比分析。不要嫌麻煩這套流程是你避免“拿著開放數(shù)據(jù)得出錯誤結(jié)論”的護身符。數(shù)據(jù)是死的能把它盤活靠的還是對空間數(shù)據(jù)處理邏輯的深入理解。