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
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));
- }