screen-api/src/main/java/com/moral/api/entity/GeoCoordinate.java | ●●●●● patch | view | raw | blame | history | |
screen-api/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java | ●●●●● patch | view | raw | blame | history | |
screen-api/src/main/java/com/moral/api/utils/GetCenterPointFromListOfCoordinates.java | ●●●●● patch | view | raw | blame | history |
screen-api/src/main/java/com/moral/api/entity/GeoCoordinate.java
New file @@ -0,0 +1,38 @@ package com.moral.api.entity; /** * @program: screen * @description: 经纬度坐标类 * @author: lizijie * @create: 2021-12-09 16:40 **/ public class GeoCoordinate { private double latitude; private double longitude; public GeoCoordinate() { } public GeoCoordinate(double latitude, double longitude) { this.latitude = latitude; this.longitude = longitude; } public double getLatitude() { return latitude; } public void setLatitude(double latitude) { this.latitude = latitude; } public double getLongitude() { return longitude; } public void setLongitude(double longitude) { this.longitude = longitude; } } screen-api/src/main/java/com/moral/api/service/impl/HistoryHourlyServiceImpl.java
@@ -3,14 +3,12 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.moral.api.config.mybatis.MybatisPlusConfig; import com.moral.api.entity.Device; import com.moral.api.entity.HistoryFiveMinutely; import com.moral.api.entity.HistoryHourly; import com.moral.api.entity.Organization; import com.moral.api.entity.*; import com.moral.api.mapper.DeviceMapper; import com.moral.api.mapper.HistoryHourlyMapper; import com.moral.api.service.HistoryHourlyService; import com.moral.api.service.OrganizationService; import com.moral.api.utils.GetCenterPointFromListOfCoordinates; import com.moral.constant.Constants; import com.moral.constant.SeparateTableType; import com.moral.pojo.AQI; @@ -135,8 +133,8 @@ JSONObject value = JSONObject.parseObject(historyHourlyData.get("value").toString()); double num = Double.parseDouble(value.get(parameters.get("sensor_code")).toString()); int level = PollutantUtils.pollutantLevel(num, (parameters.get("sensor_code")).toString()); list1.add(latitude); list1.add(longitude); list1.add(latitude); list1.add(level); list.add(list1); } @@ -145,24 +143,41 @@ double latitudeMax = Collections.max(latitudeList)+0.0018; double longitudeMin = Collections.min(longitudeList)-0.2/(111*Math.cos(latitudeMin)); double longitudeMax = Collections.max(longitudeList)+0.2/(111*Math.cos(latitudeMin)); List<Object> bound = new ArrayList<>(); List<Object> left_up = new ArrayList<>(); List<Double> bound = new ArrayList<>(); bound.add(latitudeMax); bound.add(longitudeMax); bound.add(latitudeMin); bound.add(longitudeMin); resultMap.put("bound",bound); List<List> bound1 = new ArrayList<>(); List<Double> left_up = new ArrayList<>(); left_up.add(latitudeMax); left_up.add(longitudeMin); List<Object> right_up = new ArrayList<>(); List<Double> right_up = new ArrayList<>(); right_up.add(latitudeMax); right_up.add(longitudeMax); List<Object> left_down = new ArrayList<>(); List<Double> left_down = new ArrayList<>(); left_down.add(latitudeMin); left_down.add(longitudeMin); List<Object> right_down = new ArrayList<>(); List<Double> right_down = new ArrayList<>(); right_down.add(latitudeMin); right_down.add(longitudeMax); bound.add(left_up); bound.add(right_up); bound.add(right_down); bound.add(left_down); resultMap.put("bound",bound); bound1.add(left_up); bound1.add(right_up); bound1.add(right_down); bound1.add(left_down); List<GeoCoordinate> geoCoordinates = new ArrayList<>(); for (List bo:bound1) { GeoCoordinate g = new GeoCoordinate(); g.setLatitude(Double.parseDouble(bo.get(0).toString())); g.setLongitude(Double.parseDouble(bo.get(1).toString())); geoCoordinates.add(g); } GeoCoordinate centerPoint400 = GetCenterPointFromListOfCoordinates.getCenterPoint400(geoCoordinates); List centerPoint = new ArrayList(); centerPoint.add(centerPoint400.getLongitude()); centerPoint.add(centerPoint400.getLatitude()); resultMap.put("centerPoint",centerPoint); return resultMap; } screen-api/src/main/java/com/moral/api/utils/GetCenterPointFromListOfCoordinates.java
New file @@ -0,0 +1,80 @@ package com.moral.api.utils; import com.moral.api.entity.GeoCoordinate; import java.util.ArrayList; import java.util.List; /** * @program: screen * @description: 计算多个地点的中心点 * @author: lizijie * @create: 2021-12-09 16:37 **/ public class GetCenterPointFromListOfCoordinates { /** * 根据输入的地点坐标计算中心点 * @param geoCoordinateList * @return */ public static GeoCoordinate getCenterPoint(List<GeoCoordinate> geoCoordinateList) { int total = geoCoordinateList.size(); double X = 0, Y = 0, Z = 0; for (GeoCoordinate g : geoCoordinateList) { double lat, lon, x, y, z; lat = g.getLatitude() * Math.PI / 180; lon = g.getLongitude() * Math.PI / 180; x = Math.cos(lat) * Math.cos(lon); y = Math.cos(lat) * Math.sin(lon); z = Math.sin(lat); X += x; Y += y; Z += z; } X = X / total; Y = Y / total; Z = Z / total; double Lon = Math.atan2(Y, X); double Hyp = Math.sqrt(X * X + Y * Y); double Lat = Math.atan2(Z, Hyp); return new GeoCoordinate(Lat * 180 / Math.PI, Lon * 180 / Math.PI); } /** * 根据输入的地点坐标计算中心点(适用于400km以下的场合) * @param geoCoordinateList * @return */ public static GeoCoordinate getCenterPoint400(List<GeoCoordinate> geoCoordinateList) { // 以下为简化方法(400km以内) int total = geoCoordinateList.size(); double lat = 0, lon = 0; for (GeoCoordinate g : geoCoordinateList) { lat += g.getLatitude() * Math.PI / 180; lon += g.getLongitude() * Math.PI / 180; } lat /= total; lon /= total; return new GeoCoordinate(lat * 180 / Math.PI, lon * 180 / Math.PI); } public static void main(String[] args) { List geoCoordinateList = new ArrayList(); GeoCoordinate g = new GeoCoordinate(); g.setLongitude(112.977324); g.setLatitude(28.178376); GeoCoordinate g2 = new GeoCoordinate(); g2.setLongitude(112.975782); g2.setLatitude(28.172258); geoCoordinateList.add(g); geoCoordinateList.add(g2); GeoCoordinate re = GetCenterPointFromListOfCoordinates.getCenterPoint(geoCoordinateList); System.out.println(re.getLongitude() +" "+ re.getLatitude()); } }