目錄
前言
一、空間檢索簡介
1、空間表結構
2、四至空間檢索
二、前后端實現
1、后端實現
2、前端集成
三、成果展示
1、東部省份
2、西部省份
3、南部省份
4、北部省份
5、中部省份
四、總結
前言
????????在當今數字化時代,地理信息數據的分析與可視化對于眾多領域都有著至關重要的意義。從城市規劃到資源管理,從環境監測到交通物流,精準、直觀地呈現地理空間數據能夠為決策提供有力支持。在中國這樣一個地域遼闊、行政區劃復雜的國家,各省的地理四至極點信息在一定程度上反映了該省的地理位置特征和空間分布情況。通過確定各省的東西南北四至極點所在的區縣,并將其可視化展示,可以為眾多領域提供有價值的參考。
????????在城市規劃方面,了解周邊省份的四至極點區縣有助于明確自身的區域優勢和潛在發展方向,合理布局城市功能區,規劃交通線路和基礎設施建設,促進區域間的協調發展。對于資源管理,直觀的可視化界面可以幫助管理者快速了解資源的地理分布范圍,以便更好地制定資源開發與保護策略,優化資源分配,提高資源利用效率。?在環境監測領域,通過觀察四至極點區縣及其周邊環境數據的可視化呈現,可以及時發現環境問題的空間關聯性,為跨區域的環境治理提供依據,實現區域性環境協同監測與管理。此外,交通物流行業也可以借助該可視化系統,優化運輸路線規劃,提高物流配送效率,降低運輸成本,更好地應對復雜的地理環境和運輸需求。
????????本次研究聚焦于基于 SpringBoot 和 PostGIS 的各省東西南北四至極點區縣可視化項目。本項目旨在整合 SpringBoot 的高效開發能力和 PostGIS 的強大空間數據處理功能,構建一個精準、實時且交互性強的各省東西南北四至極點區縣可視化平臺,為相關領域的研究與決策提供一種創新、直觀且便捷的地理信息可視化解決方案,助力探索和挖掘地理空間數據蘊含的巨大價值,推動各行業在地理維度上的科學決策與可持續發展。接下來,本文將深入探討該可視化項目的空間查詢設計、關鍵技術實現以及實際應用場景與效果評估等內容,詳細闡述如何利用 SpringBoot 和 PostGIS 實現地理數據的有效處理與可視化展示,以滿足不同用戶的需求,為地理信息相關領域的研究和實踐提供有價值的參考與借鑒。通過本文可以實現一個查找對應省份的四至區縣和對應經緯度點坐標信息。
一、空間檢索簡介
????????本節將重點對空間檢索的知識進行綜合介紹,分別從以下兩點開展,首先是空間表結構展示,對縣域這張空間表進行簡單介紹。其次介紹如何基于PostGIS來進行省域范圍的區縣四至空間檢索實踐。
1、空間表結構
????????本實例涉及的空間表結構有以下這張表,這張便是區域信息,是省份對象的區縣信息。表結構如下:
????????具體的表結構SQL如下所示:
?
CREATE TABLE "public"."biz_area" ("id" int8 NOT NULL,"province_code" varchar(16) COLLATE "pg_catalog"."default" NOT NULL,"province_name" varchar(64) COLLATE "pg_catalog"."default" NOT NULL,"city_code" varchar(16) COLLATE "pg_catalog"."default" NOT NULL,"city_name" varchar(512) COLLATE "pg_catalog"."default" NOT NULL,"area_code" varchar(16) COLLATE "pg_catalog"."default" NOT NULL,"area_name" varchar(512) COLLATE "pg_catalog"."default" NOT NULL,"type" varchar(32) COLLATE "pg_catalog"."default","geom" "public"."geometry",CONSTRAINT "pk_biz_area" PRIMARY KEY ("id")
);
CREATE INDEX "idx_biz_area_areacode" ON "public"."biz_area" USING btree ("area_code" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
);
CREATE INDEX "idx_biz_area_city_code" ON "public"."biz_area" USING btree ("city_code" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
);
CREATE INDEX "idx_biz_area_geom" ON "public"."biz_area" USING gist ("geom" "public"."gist_geometry_ops_2d"
);
CREATE INDEX "idx_biz_area_geom_gp" ON "public"."biz_area" USING gist ((geom::geography) "public"."gist_geography_ops"
);
CREATE INDEX "idx_biz_area_provincec_code" ON "public"."biz_area" USING btree ("province_code" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
);
COMMENT ON COLUMN "public"."biz_area"."id" IS '主鍵ID';
COMMENT ON COLUMN "public"."biz_area"."province_code" IS '省份編碼';
COMMENT ON COLUMN "public"."biz_area"."province_name" IS '省份名稱';
COMMENT ON COLUMN "public"."biz_area"."city_code" IS '市級編碼';
COMMENT ON COLUMN "public"."biz_area"."city_name" IS '市級名稱';
COMMENT ON COLUMN "public"."biz_area"."area_code" IS '區縣編碼';
COMMENT ON COLUMN "public"."biz_area"."area_name" IS '區縣名稱';
COMMENT ON COLUMN "public"."biz_area"."type" IS '類型';
COMMENT ON COLUMN "public"."biz_area"."geom" IS 'geom';
????????區縣表的查詢數據結果如下所示:
????????以上就是空間表模型和表結構的簡單介紹。 這張表是基礎數據表格,是后續進行四至空間分析的基礎。
2、四至空間檢索
????????要想實現空間四至的求解,其實可以轉換成尋找當前面數據的四至范圍極值的問題。因此我們只需要找到能包圍當前面數據的做大點的坐標即可。為了方便實現按照某省份來查詢其對應的四至范圍,因此在Postgresql中使用子查詢來進行數據的過濾,首先定義with 子句。查詢的SQL如下:
WITH temp_area AS (SELECT * FROM biz_area T WHERE T.province_code = '510000'),bounds_info AS ((SELECT '最東' AS direction, T.*, ST_X(dp.geom) AS x, ST_Y(dp.geom) AS yFROM temp_area T, LATERAL ST_DumpPoints(T.geom) AS dpORDER BY x DESC LIMIT 1)UNION (SELECT '最西' AS direction, T.*, ST_X(dp.geom) AS x, ST_Y(dp.geom) AS yFROM temp_area T, LATERAL ST_DumpPoints(T.geom) AS dpORDER BY x ASC LIMIT 1)UNION (SELECT '最北' AS direction, T.*, ST_X(dp.geom) AS x, ST_Y(dp.geom) AS yFROM temp_area T, LATERAL ST_DumpPoints(T.geom) AS dpORDER BY y ASC LIMIT 1)UNION (SELECT '最南' AS direction, T.*, ST_X(dp.geom) AS x, ST_Y(dp.geom) AS yFROM temp_area T, LATERAL ST_DumpPoints(T.geom) AS dpORDER BY y DESC LIMIT 1)) SELECT direction,id, province_code, province_name, city_code,city_name,area_code,area_name,type,st_asgeojson(geom) AS geomJson,x AS lon,y AS lat FROM bounds_info;
????????這里我們以四川省為例,查詢四川省的四至縣域結果:
????????可以直觀的看到,四川省最東邊是達州市的宣漢縣,最西邊是甘孜藏族自治州的石渠縣,最南邊是涼山彝族自治州的會理縣,最北邊是阿壩藏族羌族自治州的若爾蓋縣。?
二、前后端實現
????????介紹完空間表以及四至的空間檢索實現后,接下來我們來介紹一下如何在前后端實現接口的接入和WebGIS界面的可視化。
1、后端實現
????????后端比較簡單,這里我們將前面的四至查詢函數包裝成一個公共的方法,供后續的分析方法調用。在Mapper中定義查詢請求的方法體,具體如下圖所示:
static final String FIND_ESWNAREA_BYPROVINCE_SQL = "<script>"+ " WITH temp_area AS ( SELECT * FROM biz_area T WHERE T.province_code = #{province_code} ), "+ " bounds_info AS ("+ " ( SELECT '最東' AS direction,T.*,ST_X ( dp.geom ) AS x,ST_Y ( dp.geom ) AS y "+ " FROM temp_area T,LATERAL ST_DumpPoints ( T.geom ) AS dp ORDER BY x DESC LIMIT 1 "+ " ) UNION "+ " ( SELECT '最西' AS direction,T.*,ST_X ( dp.geom ) AS x,ST_Y ( dp.geom ) AS y "+ " FROM temp_area T,LATERAL ST_DumpPoints ( T.geom ) AS dp ORDER BY x ASC LIMIT 1 "+ " ) UNION "+ " ( SELECT '最南' AS direction,T.*,ST_X ( dp.geom ) AS x,ST_Y ( dp.geom ) AS y "+ " FROM temp_area T, LATERAL ST_DumpPoints ( T.geom ) AS dp ORDER BY y ASC LIMIT 1 "+ " ) UNION "+ " (SELECT '最北' AS direction,T.*,ST_X ( dp.geom ) AS x,ST_Y ( dp.geom ) AS y "+ " FROM temp_area T, LATERAL ST_DumpPoints( T.geom ) AS dp ORDER BY y DESC LIMIT 1 "+ ") SELECT direction,id,province_code,province_name,city_code,city_name,area_code, "+ " area_name,type, st_asgeojson(geom) geomJson, x lon,y lat FROM bounds_info "+ "</script>";
/**
* - 根據省份code查詢對應省份的四至區縣信息
* @param provinceCode 需要查詢的目標省份code
* @return
*/
@Select(FIND_ESWNAREA_BYPROVINCE_SQL)
List<EwsnAreaVo> findEswnAreaByProvinceCode(@Param("province_code")String provinceCode);
????????這里僅介紹Mapper的實現,具體的業務層和控制層代碼比較簡單,在此不在贅述。?
2、前端集成
????????介紹完后端的方法實現后,再來介紹一下前端如何使用Leaflet來進行具體的展示。關于地圖頁面的展示分為兩個部分,第一部分展示省份信息,第二部分是展示四至極值的所在區縣信息。首先是展示省份信息的方法,關鍵代碼如下:
function previewProvince(gid,name){var myStyle = {color:"red",weight:3,"opacity":0.65};$.ajax({ type:"get", url:prefix + "/geojson/" + gid, data:{}, dataType:"json", cache:false,processData:false,success:function(result){if(result.code == web_status.SUCCESS){var geojson = JSON.parse(result.data);var areaLayer = L.geoJSON(geojson,{style:myStyle}).addTo(mymap);var myIcon = L.divIcon({className: 'my-div-icon',iconSize: 100});showLayerGroup.clearLayers();showLayerGroup.addLayer(areaLayer);}},error:function(){$.modal.alertWarning("獲取空間信息失敗");}});
}
?展示東南西北四至點和所在區縣的核心方法如下:
function previewEwsn(pid,provinceCode,name){previewProvince(pid,name);$.ajax({ type:"get", url:prefix + "/ewsnprovince/list/" + provinceCode, data:{}, dataType:"json", cache:false,processData:false,success:function(result){if(result.code == web_status.SUCCESS){var legendData = new Array();for(var i = 0;i< result.data.length;i++){var areaData = result.data[i];var color = ccolor = getRandomColor();var areaLayer = L.geoJSON(JSON.parse(areaData.geomJson),{style: {color:color,fillColor:color,weight:3,"opacity":0.65, fillOpacity: 0.65 }}).addTo(mymap);var myIcon = L.divIcon({iconSize: null,className: '',popupAnchor:[5,5],shadowAnchor:[5,5],html: buildShowInfo(i,color,areaData)});showLayerGroup.addLayer(areaLayer);//中心點位L.marker([areaData.lat,areaData.lon], { icon: myIcon}).addTo(showLayerGroup);legendData.push({label: "\xa0\xa0"+areaData.cityName + areaData.areaName,type: "rectangle",radius: 12,color: color,fillColor: color,fillOpacity: 0.8,weight: 2});}mymap.fitBounds(showLayerGroup.getBounds());initLegend(legendData);}},error:function(){$.modal.alertWarning("獲取空間信息失敗");}});}
三、成果展示
????????篇幅有限不能將所有省份一一展示,從東西南北中四個方向各選取一些省份及其對應的四至區縣來進行展示和講解。各個省份排名不分先后,區縣信息位置是準確的,文中展示不全的,如有興趣,歡迎在評論區留言。
1、東部省份
????????上海市四至:?
序號 | 四至 | 所在區縣 |
1 | 最北邊 | 上海崇明區 |
2 | 最東邊 | 上海崇明區 |
3 | 最西邊 | 上海青浦區 |
4 | 最南邊 | 上海金山區 |
?????????江蘇省四至:??
序號 | 四至 | 所在區縣 |
1 | 最北邊 | 連云港市贛榆區 |
2 | 最東邊 | 南通市啟東市 |
3 | 最西邊 | 徐州市豐縣 |
4 | 最南邊 | 蘇州市吳江區 |
2、西部省份
????????西藏自治區四至:??
序號 | 四至 | 所在區縣 |
1 | 最北邊 | 那曲市雙湖縣 |
2 | 最東邊 | 昌都市芒康縣 |
3 | 最西邊 | 阿里地區札達縣 |
4 | 最南邊 | 山南市錯那縣 |
3、南部省份
?????????廣西壯族自治區四至:??
序號 | 四至 | 所在區縣 |
1 | 最北邊 | 桂林市全州縣 |
2 | 最東邊 | 賀州市八步區 |
3 | 最西邊 | 百色市西林縣 |
4 | 最南邊 | 北海市海城區 |
4、北部省份
?????????河北省四至:??
序號 | 四至 | 所在區縣 |
1 | 最北邊 | 承德市圍場滿族蒙古族自治縣 |
2 | 最東邊 | 秦皇島市山海關區 |
3 | 最西邊 | 邯鄲市涉縣 |
4 | 最南邊 | 邯鄲市魏縣 |
5、中部省份
? ? ? ? ?湖北省四至:??
序號 | 四至 | 所在區縣 |
1 | 最北邊 | 十堰市鄖西縣 |
2 | 最東邊 | 黃岡市黃梅縣 |
3 | 最西邊 | 恩施土家族苗族自治州利川市 |
4 | 最南邊 | 咸寧市通城縣 |
四、總結
????????以上就是本文的主要內容,本次研究聚焦于基于 SpringBoot 和 PostGIS 的各省東西南北四至極點區縣可視化項目。本項目旨在整合 SpringBoot 的高效開發能力和 PostGIS 的強大空間數據處理功能,構建一個精準、實時且交互性強的各省東西南北四至極點區縣可視化平臺,為相關領域的研究與決策提供一種創新、直觀且便捷的地理信息可視化解決方案,助力探索和挖掘地理空間數據蘊含的巨大價值,推動各行業在地理維度上的科學決策與可持續發展。行文倉促,定有不足之處,歡迎各位朋友在評論區批評指正,不勝感激。