開源的地理數(shù)據(jù)工具,讓亂糟糟的 Shapefile 變成輕量地圖)
mapshaper 三步入門免費(fèi)開源的地理數(shù)據(jù)工具讓亂糟糟的 Shapefile 變成輕量地圖【免費(fèi)下載鏈接】mapshaperTools for editing Shapefile, GeoJSON, TopoJSON and CSV files項(xiàng)目地址: https://gitcode.com/gh_mirrors/ma/mapshaper上周我接了個活兒把一份十幾年前的普查數(shù)據(jù)整理成網(wǎng)頁地圖。打開一看全是坑——.dbf 用 Excel 打不開字段亂碼坐標(biāo)整體漂移縣城全跑到海里。我折騰了一下午最后是mapshaper把我撈出來的一個免費(fèi)開源的本地地理數(shù)據(jù)處理工具格式轉(zhuǎn)換、地圖瘦身、數(shù)據(jù)清洗一條命令搞定。這篇就按我踩坑的順序把用法講給你聽。mapshaper 是什么一句話定位 三張能力卡一句話定位mapshaper 是一個運(yùn)行在瀏覽器和命令行里的開源地理數(shù)據(jù)處理工具專門解決數(shù)據(jù)格式對不上、文件太大、數(shù)據(jù)太臟這三類最常見的問題。能力它幫你做什么格式轉(zhuǎn)換Shapefile / GeoJSON / TopoJSON / CSV / KML / GPKG 之間互轉(zhuǎn)地圖瘦身用算法刪掉不重要的頂點(diǎn)體積大幅縮小形狀基本不變空間操作裁剪、擦除、緩沖區(qū)、溶解、空間連接等常用分析它正好夾在重型桌面 GIS和在線轉(zhuǎn)換網(wǎng)站中間前者功能全但笨重后者方便卻要上傳數(shù)據(jù)、功能單薄。mapshaper 本地運(yùn)行、命令驅(qū)動、可以寫進(jìn)腳本整個工具也就幾 MB。想讀源碼的話命令都放在 命令目錄幾何算法在 幾何模塊可以從這兩處入手。上手路徑從拖一下到一條命令我第一次用 mapshaper 其實(shí)沒碰命令行——直接在瀏覽器里打開 mapshaper 網(wǎng)頁版把 .shp 文件拖進(jìn)去就能預(yù)覽和操作連安裝都省了。適合邊看邊調(diào)的探索階段。等流程確認(rèn)沒問題再進(jìn)入第二階段裝命令行版把操作固化下來。npm install -g mapshaper這段命令的意思是全局安裝 mapshaper之后在任意目錄敲mapshaper就能用。裝完輸入mapshaper --version驗(yàn)證一下即可。第三階段是規(guī)?;?dāng)你需要每周處理幾十個文件時把命令寫進(jìn)腳本循環(huán)就成了無人值守的自動流程后面會演示。小任務(wù) 1讓數(shù)據(jù)變成網(wǎng)頁能用的格式 第一個要解決的問題Shapefile 是桌面 GIS 的格式網(wǎng)頁地圖通常要 GeoJSON。而且我那份數(shù)據(jù)字段是亂碼——這是老數(shù)據(jù)最常見的坑很多國內(nèi) Shapefile 的編碼是 GBK 而不是 UTF-8。mapshaper towns.shp encodinggbk -o towns.geojson白話解釋讀入towns.shp時指定字段編碼是 GBK避免亂碼再導(dǎo)出成網(wǎng)頁通用的towns.geojson。編碼寫對后屬性表里的中文就恢復(fù)正常了不確定編碼時運(yùn)行mapshaper -encodings查看支持的全部編碼列表。順帶一提如果網(wǎng)頁端對體積敏感可以導(dǎo)出成 TopoJSON——它讓相鄰邊界共享弧線同內(nèi)容通常比 GeoJSON 小 2~5 倍。格式轉(zhuǎn)換的底層實(shí)現(xiàn)集中在 格式模塊每種格式一個模塊。小任務(wù) 2給文件瘦身從幾十 MB 到幾 MB ?轉(zhuǎn)完格式我以為完事了結(jié)果 GeoJSON 有 40 多 MB頁面加載依舊很慢。真正的殺手锏是簡化。mapshaper towns.geojson -simplify 10% -o towns_simplified.geojson白話解釋只保留約 10% 的頂點(diǎn)其余交給算法挑著刪——優(yōu)先刪掉對形狀影響最小的點(diǎn)。簡化后文件通常能縮到原來的十分之一左右輪廓肉眼看不出差別。上面這張圖是簡化前后的邊界對比左側(cè)保留全部細(xì)節(jié)右側(cè)頂點(diǎn)大幅減少整體輪廓幾乎一致。像縣界這種鋸齒密集的數(shù)據(jù)效果尤其明顯——原始 TIGER 數(shù)據(jù)布滿細(xì)碎折點(diǎn)簡化后輪廓依然清楚下圖就是我處理完的縣界地圖。簡化算法實(shí)現(xiàn)在 簡化模塊想研究原理可以翻一翻。一句話原理簡化 刪掉不重要的點(diǎn)讓文件變小但形狀還像。小任務(wù) 3把臟數(shù)據(jù)洗干凈、把坐標(biāo)擺正 真實(shí)世界的數(shù)據(jù)很少干凈多邊形自相交、重復(fù)頂點(diǎn)、斷裂邊界、坐標(biāo)系錯誤全都能遇到。我那份數(shù)據(jù)的坐標(biāo)漂移就是坐標(biāo)系沒寫對。這兩個問題可以連成一條命令處理mapshaper messy.shp -proj wgs84 -clean -o fixed.shp白話解釋先把數(shù)據(jù)投影到標(biāo)準(zhǔn)地理坐標(biāo)系 WGS84坐標(biāo)漂移大多是它引起的再自動修復(fù)自相交、無效環(huán)等幾何毛病輸出成干凈的新文件。正式交付前跑一遍這步能省掉下游一堆莫名其妙的 bug。順帶一個小建議-o永遠(yuǎn)輸出新文件源數(shù)據(jù)不會被改動所以放心大膽地試試錯了重來就是。小任務(wù) 4空間分析 自動跑批 數(shù)據(jù)干凈了接下來是干活。給河流數(shù)據(jù)做 1 公里緩沖區(qū)只要一行mapshaper rivers.shp -buffer 1km -o river_buffer.shp白話解釋在每條河兩側(cè)生成距離 1 公里的等距區(qū)域常用于洪水范圍、道路影響帶這類分析。同理-clip裁剪、-erase擦除、-dissolve按字段溶解合并、-join做空間連接都是類似的一行命令。當(dāng)處理對象從一個文件變成幾十個文件就輪到自動化上場。把命令寫進(jìn)循環(huán)配上-each改字段、-filter按條件過濾、-define定義變量就能覆蓋讀入→清洗→簡化→導(dǎo)出的全流程for f in *.shp; do mapshaper $f -simplify 50% -o out/${f%.shp}.geojson done白話解釋把當(dāng)前目錄下每個 .shp 都簡化一半導(dǎo)出成同名 GeoJSON 到 out 目錄。我后來把它接進(jìn)定時任務(wù)每周自動處理一次增量數(shù)據(jù)全程無人值守。三種人用它解決了什么問題前端同學(xué)從政府開放數(shù)據(jù)站點(diǎn)下到的邊界文件用 mapshaper 轉(zhuǎn)成 TopoJSON 再簡化地圖加載從卡死變秒開。數(shù)據(jù)分析師每周要合并、清洗各省上報的數(shù)據(jù)文件。把 mapshaper 命令寫進(jìn)腳本清洗流程可復(fù)現(xiàn)、可審計(jì)換誰跑結(jié)果都一樣。GIS 初學(xué)者在網(wǎng)頁版拖一個文件進(jìn)去拉動簡化滑塊立刻看到邊界一點(diǎn)點(diǎn)變光滑——簡化算法到底在干嘛這個問題玩五分鐘就懂了拿來當(dāng)教學(xué)演示也特別好用。新手最易搞錯的 3 件事? 字段亂碼以為數(shù)據(jù)壞了想重下數(shù)據(jù) → ? 多半只是編碼沒指定encodinggbk或 big5 等一條參數(shù)就解決。? 簡化后形狀崩了直接放棄簡化 → ? 試試換算法-simplify visvalingam/-simplify dp或把比例調(diào)高一點(diǎn)5% 和 20% 的觀感差別很大自己試一下最直觀。? 擔(dān)心命令會破壞源文件 → ?-o永遠(yuǎn)寫新文件源數(shù)據(jù)一動不動放心折騰。最后回頭看我那個亂成一團(tuán)的下午真正救場的不是某個炫技功能而是簡單、可復(fù)現(xiàn)、本地運(yùn)行這三個樸素特質(zhì)。mapshaper 沒有花哨的界面但把地理數(shù)據(jù)處理里最常見的 80% 需求做得又快又穩(wěn)還免費(fèi)開源、跨平臺?,F(xiàn)在就去裝一個挑一份你手頭最亂的數(shù)據(jù)文件跑一遍上面四個小任務(wù)——十分鐘后你大概會和我一樣感嘆原來這事兒可以這么輕?!久赓M(fèi)下載鏈接】mapshaperTools for editing Shapefile, GeoJSON, TopoJSON and CSV files項(xiàng)目地址: https://gitcode.com/gh_mirrors/ma/mapshaper創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考