Java某個(gè)經(jīng)緯度是否在genjson文件中問題
Java某個(gè)經(jīng)緯度是否在genjson文件中
GeoJSON是一種對各種地理數(shù)據(jù)結(jié)構(gòu)進(jìn)行編碼的格式,基于Javascript對象表示法(JavaScript Object Notation, 簡稱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è)對象
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à)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
java中靜態(tài)代碼塊與構(gòu)造方法的執(zhí)行順序判斷
對靜態(tài)代碼塊以及構(gòu)造函數(shù)的執(zhí)行先后順序,一直很迷惑,直到最近看到一段代碼,發(fā)現(xiàn)終于弄懂了,所以這篇文章主要給大家介紹了關(guān)于如何判斷java中靜態(tài)代碼塊與構(gòu)造方法的執(zhí)行順序的相關(guān)資料,需要的朋友可以參考下。2017-12-12
Mybatis-plus一對多分頁數(shù)據(jù)條數(shù)不正確的處理
這篇文章主要介紹了Mybatis-plus一對多分頁數(shù)據(jù)條數(shù)不正確的處理,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
詳解Spring系列之@ComponentScan批量注冊bean
本文介紹各種@ComponentScan批量掃描注冊bean的基本使用以及進(jìn)階用法和@Componet及其衍生注解使用,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2022-02-02
淺析SpringBoot自動裝配的實(shí)現(xiàn)
springboot開箱即用,其實(shí)實(shí)現(xiàn)了自動裝配,本文重點(diǎn)給大家介紹SpringBoot是如何做到自動裝配的,感興趣的朋友跟隨小編一起看看吧2022-02-02
java多線程編程之使用Synchronized關(guān)鍵字同步類方法
JAVA中要想解決“臟數(shù)據(jù)”的問題,最簡單的方法就是使用synchronized關(guān)鍵字來使run方法同步,看下面的代碼,只要在void和public之間加上synchronized關(guān)鍵字2014-01-01
Spring?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

