Java某個(gè)經(jīng)緯度是否在genjson文件中問題
Java某個(gè)經(jīng)緯度是否在genjson文件中
GeoJSON是一種對(duì)各種地理數(shù)據(jù)結(jié)構(gòu)進(jìn)行編碼的格式,基于Javascript對(duì)象表示法(JavaScript Object Notation, 簡(jiǎn)稱JSON)的地理空間信息數(shù)據(jù)交換格式。
如果我們要用某個(gè)經(jīng)緯度是否在某個(gè)區(qū)域的時(shí)候,首先是要用到genjson文件,因?yàn)槭》莸貓D是一個(gè)不規(guī)則的圖形,需要通過描邊來確定是否在區(qū)域內(nèi)部。
我們需要先解析genjson文件
然后在用經(jīng)緯度去比較,需要提前導(dǎo)入GenJSON的庫
<dependency> <groupId>org.geotools</groupId> <artifactId>gt-geojson</artifactId> <version>23.5</version> </dependency>
創(chuàng)建一個(gè)對(duì)象
import lombok.Data; @Data public class LatLng { double lat; double lng; public LatLng(double lat,double lng){ this.lat = lat; this.lng = lng; } }
工具類
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; public class GeojsonUtils { /** * * @param path genjson 位置 * @param lat 緯度 * @param lng 經(jīng)度 * @return */ public static Boolean getGenjsonPosition(String path,Double lat,Double lng){ try{ String jsonString = new String(Files.readAllBytes(Paths.get(path))); ObjectMapper objectMapper = new ObjectMapper(); JsonNode jsonNode = objectMapper.readTree(jsonString); JsonNode coordinatesNode = jsonNode.path("features").get(0).path("geometry").path("coordinates").get(0); List<LatLng> coordinatesList = new ArrayList<>(); for (JsonNode coordinate : coordinatesNode) { double rlng = coordinate.get(0).asDouble(); double rlat = coordinate.get(1).asDouble(); LatLng point = new LatLng(rlat,rlng); coordinatesList.add(point); } LatLng targetPoint = new LatLng(lat, lng); boolean isInArea = false; int j = coordinatesList.size() - 1; for (int i = 0; i < coordinatesList.size(); i++) { LatLng point1 = coordinatesList.get(i); LatLng point2 = coordinatesList.get(j); if ((point1.getLng() < targetPoint.getLng() && point2.getLng() >= targetPoint.getLng() || point2.getLng() < targetPoint.getLng() && point1.getLng() >= targetPoint.getLng()) && (point1.getLat() <= targetPoint.getLat() || point2.getLat() <= targetPoint.getLat())) { if (point1.getLat() + (targetPoint.getLng() - point1.getLng()) / (point2.getLng() - point1.getLng()) * (point2.getLat() - point1.getLat()) < targetPoint.getLat()) { isInArea = !isInArea; } } j = i; } if (isInArea) return true; //在區(qū)域內(nèi)部 }catch (Exception e){ } return false; //不在區(qū)域內(nèi)部 } public static void main(String[] args) { String filePath = "C:\\Users\\Administrator\\Desktop\\林長制\\shanxi.geojson"; System.out.println(getGenjsonPosition(filePath,39.34727,108.94647)); }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用SpringBoot跨系統(tǒng)調(diào)用接口的方案
這篇文章主要介紹了使用SpringBoot跨系統(tǒng)調(diào)用接口的方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01java中靜態(tài)代碼塊與構(gòu)造方法的執(zhí)行順序判斷
對(duì)靜態(tài)代碼塊以及構(gòu)造函數(shù)的執(zhí)行先后順序,一直很迷惑,直到最近看到一段代碼,發(fā)現(xiàn)終于弄懂了,所以這篇文章主要給大家介紹了關(guān)于如何判斷java中靜態(tài)代碼塊與構(gòu)造方法的執(zhí)行順序的相關(guān)資料,需要的朋友可以參考下。2017-12-12Mybatis-plus一對(duì)多分頁數(shù)據(jù)條數(shù)不正確的處理
這篇文章主要介紹了Mybatis-plus一對(duì)多分頁數(shù)據(jù)條數(shù)不正確的處理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01詳解Spring系列之@ComponentScan批量注冊(cè)bean
本文介紹各種@ComponentScan批量掃描注冊(cè)bean的基本使用以及進(jìn)階用法和@Componet及其衍生注解使用,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2022-02-02淺析SpringBoot自動(dòng)裝配的實(shí)現(xiàn)
springboot開箱即用,其實(shí)實(shí)現(xiàn)了自動(dòng)裝配,本文重點(diǎn)給大家介紹SpringBoot是如何做到自動(dòng)裝配的,感興趣的朋友跟隨小編一起看看吧2022-02-02java多線程編程之使用Synchronized關(guān)鍵字同步類方法
JAVA中要想解決“臟數(shù)據(jù)”的問題,最簡(jiǎn)單的方法就是使用synchronized關(guān)鍵字來使run方法同步,看下面的代碼,只要在void和public之間加上synchronized關(guān)鍵字2014-01-01Spring?Boot自定義Starter組件開發(fā)實(shí)現(xiàn)配置過程
SpringBoot中的starter是一種非常重要的機(jī)制,能夠拋棄以前繁雜的配置,將其統(tǒng)一集成進(jìn)?starter,應(yīng)用者只需要在maven中引入starter依賴,這篇文章主要介紹了Spring?Boot自定義Starter組件開發(fā)實(shí)現(xiàn),需要的朋友可以參考下2022-06-06