日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

从区划边界geojson中查询经纬度坐标对应的省市区县乡镇名称,开源Java工具,内存占用低、高性能

發布時間:2023/12/20 java 83 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从区划边界geojson中查询经纬度坐标对应的省市区县乡镇名称,开源Java工具,内存占用低、高性能 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 坐標邊界查詢工具:AreaCity-Query-Geometry
  • 性能測試數據
    • 測試一:Init_StoreInWkbsFile 內存占用很低(性能受IO限制)
    • 測試二:Init_StoreInMemory 內存占用和json文件差不多大(性能豪放)
    • 參考:數據庫查詢測試對比
  • 查詢坐標對應的省市區縣鄉鎮名稱
    • 步驟一:準備好省市區縣鄉鎮邊界的geojson文件
    • 步驟二:運行測試程序進行初始化
    • 步驟三:查詢坐標獲得省市區名稱
    • 附:通過Java代碼進行查詢

坐標邊界查詢工具:AreaCity-Query-Geometry

本工具核心功能:使用jts庫從省市區縣鄉鎮邊界數據(AreaCity-JsSpider-StatsGov開源庫)或geojson邊界數據文件中查找出和任意點、線、面有相交的矢量邊界,內存占用低,性能優良。

GitHub地址:https://github.com/xiangyuecn/AreaCity-Query-Geometry
Gitee鏡像庫:https://gitee.com/xiangyuecn/AreaCity-Query-Geometry

主要特性:

  • 查詢一個坐標點對應的城市信息;
  • 查詢一條路徑經過的所有城市;
  • 查詢一個矢量范圍覆蓋的所有城市;
  • 查詢一個城市或下一級所有邊界數據(WKT格式);
  • 支持通過HTTP API服務進行查詢調用;
  • 支持通過Java代碼進行查詢調用;
  • 源碼簡單,包括測試bat腳本共5個文件,無需IDE即可修改和運行,copy即用。

可以只copy AreaCityQuery.java 文件到項目中使用,項目中引入jts庫,就能使用 AreaCityQuery 中的所有查找功能了。也可以clone整個項目代碼雙擊 編譯和運行Test.java直接測試.bat 即可直接運行測試。

API和圖形界面:此工具自帶了一個HTTP API服務,運行測試然后通過菜單啟動此服務,然后就可以直接在瀏覽器上訪問這些接口;此API接口可以直接在 ECharts Map四級下鉆在線測試和預覽 頁面的自定義數據源中進行調用測試,頁面會立即繪制查詢出來的邊界圖形。

效果圖:

HTTP API圖形界面:

控制臺運行:

性能測試數據

測試數據源:AreaCity-JsSpider-StatsGov開源庫2021.220321.220428版本下載的ok_geo.csv文件按省市區導出成不同的geojson文件。

測試采用開啟多線程進行隨機坐標點的查詢(Test.java控制臺5號菜單),測試機器配置:8核 2.20GHz CPU,SSD 硬盤。

測試一:Init_StoreInWkbsFile 內存占用很低(性能受IO限制)

數據源文件大小數據量內存占用7核QPS單核QPS單次查詢耗時
省市區三級176MB3632條41MB62128871.13ms
僅區級107MB3208條24MB1381819740.51ms
僅省級20MB34條4MB1983228330.35ms

Init_StoreInWkbsFile:用加載數據到結構化數據文件的模式進行初始化,推薦使用本方法初始化,邊界圖形數據存入結構化數據文件中,內存占用很低,查詢時會反復讀取文件對應內容,查詢性能消耗主要在IO上,IO性能極高問題不大。

測試二:Init_StoreInMemory 內存占用和json文件差不多大(性能豪放)

數據源文件大小數據量內存占用7核QPS單核QPS單次查詢耗時
省市區三級176MB3632條161MB77242110340.091ms
僅區級107MB3208條96MB121228173180.058ms
僅省級20MB34條18MB465940665620.015ms

Init_StoreInMemory:用加載數據到內存的模式進行初始化,邊界圖形數據存入內存中,內存占用和json數據文件大小差不多大,查詢性能極高;另外可通過設置 AreaCityQuery.SetInitStoreInMemoryUseObject=true 來進一步提升性能,但內存占用會增大一倍多,省市區三級單核可達到 15000 QPS。

參考:數據庫查詢測試對比

數據源數據量查詢坐標MySQL單次查詢耗時SQL Server單次查詢耗時
省市區三級3632條深圳-龍華區163ms25ms
省市區三級3632條北京-房山區173ms47ms

數據庫查詢坐標點:POINT(114.044346 22.691963) 深圳市 龍華區;POINT(116.055588 39.709385) 北京市 房山區(查詢受內蒙envelope干擾影響性能)

查詢坐標對應的省市區縣鄉鎮名稱

使用此工具進行坐標省市區縣鄉鎮查詢,先要準備一個省市區縣鄉鎮的邊界geojson數據文件。

數據中有哪一級的邊界就能查詢出哪一級的名稱;比如你只有區級的數據,那么給一個坐標就能查詢出此坐標所在的區縣名稱(需另外查找出上級的省市名稱);如果有省市區三級的邊界,那一次性就能查詢出省市區三級的名稱,如果有鄉鎮的邊界,就能查詢出鄉鎮這級的名稱。

步驟一:準備好省市區縣鄉鎮邊界的geojson文件

如果你沒有邊界json文件,可以按以下步驟獲得最新的全國省市區縣鄉鎮邊界數據json文件:

  • 到開源庫下載省市區邊界數據ok_geo.csv文件: https://github.com/xiangyuecn/AreaCity-JsSpider-StatsGov (github可換成gitee);
  • 下載開源庫里面的AreaCity-Geo格式轉換工具軟件;
  • 打開轉換工具軟件,選擇ok_geo.csv,然后導出成geojson文件即可(默認會導出全國的省級數據,通過填寫不同城市名前綴可以導出不同城市)。
  • 如果你有多個geojson文件,需要合并成一個才行,可以通過上面下載的 AreaCity-Geo格式轉換工具軟件 中的 高級功能-GeoJSON多個文件合并成一個文件 來合并。

    步驟二:運行測試程序進行初始化

    雙擊 編譯和運行Test.java直接測試.bat 運行測試控制臺程序;根據控制臺菜單命令進行初始化,有兩種初始化方式,隨便哪種都行:

  • Init_StoreInWkbsFile:內存占用很低,但查詢速度相對StoreInMemory慢很多,但也很快的,推薦用此方法初始化;
  • Init_StoreInMemory:內存占用大一點,但查詢速度非常快。
  • 選擇了初始方式后會要求填寫geojson文件路徑,填寫上一步準備好的json文件完整路徑即可;或者直接將json文件放到程序根目錄,會自動初始化。

    步驟三:查詢坐標獲得省市區名稱

    初始化完成后,所有的菜單都可以使用了,可以直接在控制臺中使用對應的菜單進入菜單查詢功能,然后輸入坐標查詢即可。

    建議使用HTTP API來進行查詢,在菜單中啟動好HTTP服務后,就能通過網址訪問查詢接口,或者直接使用在線的可視化界面進行查詢操作:

    附:通過Java代碼進行查詢

    //先初始化,全局只會初始化一次,每次查詢前都調用即可(查詢會在初始化完成后進行),兩種初始化方式根據自己業務情況二選一 //首次初始化會從.json或.geojson文件中讀取邊界圖形數據,速度比較慢,會自動生成.wkbs結尾的結構化文件,下次初始化就很快了 AreaCityQuery.Init_StoreInWkbsFile("geojson文件路徑", "geojson文件路徑.wkbs", true); //AreaCityQuery.Init_StoreInMemory("geojson文件路徑", "geojson文件路徑.wkbs", true);//AreaCityQuery.OnInitProgress=(initInfo)->{ ... } //初始化過程中的回調,可以綁定一個函數,接收初始化進度信息//查詢包含一個坐標點的所有邊界圖形的屬性數據,可通過res參數讓查詢額外返回wkt格式邊界數據 QueryResult res1=AreaCityQuery.QueryPoint(114.044346, 22.691963, null, null);//查詢和一個圖形(點、線、面)有交點的所有邊界圖形的屬性數據,可通過res參數讓查詢額外返回wkt格式邊界數據 Geometry geom=new WKTReader(AreaCityQuery.Factory).read("LINESTRING(114.233963 30.546038, 114.468109 30.544264)"); QueryResult res2=AreaCityQuery.QueryGeometry(geom, null, null);//讀取省市區的邊界數據wkt格式,這個例子會篩選出武漢市所有區縣 QueryResult res3=AreaCityQuery.ReadWKT_FromWkbsFile("wkt_polygon", null, (prop)->{return prop.contains("武漢市 ");}, null);System.out.println(res1+"\n"+res2+"\n"+res3);

    【END】

    總結

    以上是生活随笔為你收集整理的从区划边界geojson中查询经纬度坐标对应的省市区县乡镇名称,开源Java工具,内存占用低、高性能的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。