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)); }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论