java某个经纬度是否在genjson文件中
geojson是一种对各种地理数据结构进行编码的格式,基于javascript对象表示法(javascript object notation, 简称json)的地理空间信息数据交换格式。
如果我们要用某个经纬度是否在某个区域的时候,首先是要用到genjson文件,因为省份地图是一个不规则的图形,需要通过描边来确定是否在区域内部。
我们需要先解析genjson文件
然后在用经纬度去比较,需要提前导入genjson的库
<dependency>
<groupid>org.geotools</groupid>
<artifactid>gt-geojson</artifactid>
<version>23.5</version>
</dependency>创建一个对象
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 经度
* @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; //在区域内部
}catch (exception e){
}
return false; //不在区域内部
}
public static void main(string[] args) {
string filepath = "c:\\users\\administrator\\desktop\\林长制\\shanxi.geojson";
system.out.println(getgenjsonposition(filepath,39.34727,108.94647));
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论