|
|
|
@ -1,14 +1,23 @@
|
|
|
|
|
package com.palnet.biz.api.comn.coordinate.service; |
|
|
|
|
|
|
|
|
|
import java.io.BufferedReader; |
|
|
|
|
import java.io.IOException; |
|
|
|
|
import java.util.ArrayList; |
|
|
|
|
import java.util.HashSet; |
|
|
|
|
import java.util.List; |
|
|
|
|
import java.util.Set; |
|
|
|
|
import java.io.InputStream; |
|
|
|
|
import java.io.InputStreamReader; |
|
|
|
|
import java.util.*; |
|
|
|
|
import java.util.regex.Pattern; |
|
|
|
|
|
|
|
|
|
import com.palnet.biz.api.comn.coordinate.model.SearchAddressCoordinateRQ; |
|
|
|
|
import com.palnet.biz.api.comn.coordinate.model.SearchAddressCoordinateRS; |
|
|
|
|
import com.palnet.comn.code.ErrorCode; |
|
|
|
|
import com.palnet.comn.exception.CustomException; |
|
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
|
import org.json.simple.JSONArray; |
|
|
|
|
import org.json.simple.JSONObject; |
|
|
|
|
import org.json.simple.parser.JSONParser; |
|
|
|
|
import org.json.simple.parser.ParseException; |
|
|
|
|
import org.locationtech.jts.geom.Coordinate; |
|
|
|
|
import org.springframework.core.io.ClassPathResource; |
|
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
|
|
|
|
|
|
import com.palnet.biz.api.comn.coordinate.model.CompotentAuthorityRQ; |
|
|
|
@ -17,15 +26,15 @@ import com.palnet.biz.jpa.entity.FltCptAuthBas;
|
|
|
|
|
import com.palnet.biz.jpa.repository.flt.FltCptAuthAdminDistrictBasQueryRepository; |
|
|
|
|
import com.palnet.comn.utils.CoordUtils; |
|
|
|
|
import com.palnet.comn.utils.DmsUtils; |
|
|
|
|
import com.palnet.comn.utils.FlightUtils; |
|
|
|
|
|
|
|
|
|
import lombok.RequiredArgsConstructor; |
|
|
|
|
|
|
|
|
|
@Service |
|
|
|
|
@RequiredArgsConstructor |
|
|
|
|
@Slf4j |
|
|
|
|
public class ComnCoordinateService { |
|
|
|
|
|
|
|
|
|
private final FltCptAuthAdminDistrictBasQueryRepository ffFltCptAuthAdminDistrictBasQueryRepository; |
|
|
|
|
private final FltCptAuthAdminDistrictBasQueryRepository fltCptAuthAdminDistrictBasQueryRepository; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public CompotentAuthorityRS getCompetentAuthority(CompotentAuthorityRQ rq){ |
|
|
|
@ -39,12 +48,8 @@ public class ComnCoordinateService {
|
|
|
|
|
JSONObject code = new JSONObject(); |
|
|
|
|
try { |
|
|
|
|
code = utils.getPlace(coord); |
|
|
|
|
} catch (ParseException e) { |
|
|
|
|
e.printStackTrace(); |
|
|
|
|
} catch (IOException e){ |
|
|
|
|
e.printStackTrace(); |
|
|
|
|
} catch (Exception e){ |
|
|
|
|
e.printStackTrace(); |
|
|
|
|
} catch (ParseException | IOException e) { |
|
|
|
|
log.error("", e); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
String[] scope = {"ctprvn", "sig", "emd", "li"}; |
|
|
|
@ -54,7 +59,7 @@ public class ComnCoordinateService {
|
|
|
|
|
|
|
|
|
|
for(int i = 0; i < scope.length; i++){ |
|
|
|
|
String cdParam = this.codeParsing(cd, scope[i]); |
|
|
|
|
List<FltCptAuthBas> authList = ffFltCptAuthAdminDistrictBasQueryRepository.geFltCptAuthBas(cdParam); |
|
|
|
|
List<FltCptAuthBas> authList = fltCptAuthAdminDistrictBasQueryRepository.getFltCptAuthBas(cdParam); |
|
|
|
|
|
|
|
|
|
fltCptAuthBas.addAll(new HashSet<FltCptAuthBas>(authList)); |
|
|
|
|
} |
|
|
|
@ -111,4 +116,193 @@ public class ComnCoordinateService {
|
|
|
|
|
return sb.toString(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public SearchAddressCoordinateRS getCoordinateByAddress(SearchAddressCoordinateRQ rq) { |
|
|
|
|
|
|
|
|
|
String[] addressArray = rq.getAddress().split(" "); |
|
|
|
|
StringBuilder address = new StringBuilder(); |
|
|
|
|
|
|
|
|
|
for(int i = 0; i < addressArray.length; i++){ |
|
|
|
|
String addressNode = addressArray[i].replace(" ", ""); |
|
|
|
|
|
|
|
|
|
address.append(addressNode); |
|
|
|
|
if((addressArray.length - 1) != i) address.append(" "); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
String searchAdmCd = fltCptAuthAdminDistrictBasQueryRepository.findAdmCdByAddress(address.toString()); |
|
|
|
|
String scope = this.getScope(address.toString()); |
|
|
|
|
|
|
|
|
|
if(searchAdmCd == null) { |
|
|
|
|
throw new CustomException(ErrorCode.DATA_NOTFIND); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
String coordinateForderPath = this.getCodeForderPath(searchAdmCd, scope); |
|
|
|
|
|
|
|
|
|
String admCd = this.removeAdmCd(searchAdmCd, scope); |
|
|
|
|
|
|
|
|
|
List<SearchAddressCoordinateRS.LocationCoordinateModel> locationCoordinateModelList = new ArrayList<>(); |
|
|
|
|
|
|
|
|
|
InputStream inputStream = null; |
|
|
|
|
try { |
|
|
|
|
inputStream = new ClassPathResource(coordinateForderPath).getInputStream(); |
|
|
|
|
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8192); |
|
|
|
|
|
|
|
|
|
JSONParser jsonParser = new JSONParser(); |
|
|
|
|
JSONObject jsonObject = (JSONObject) jsonParser.parse(reader); |
|
|
|
|
List<JSONObject> features = (List<JSONObject>) jsonObject.get("features"); |
|
|
|
|
|
|
|
|
|
Optional<JSONObject> resultJsonObject = features.stream() |
|
|
|
|
.filter(feature -> { |
|
|
|
|
JSONObject properties = (JSONObject) feature.get("properties"); |
|
|
|
|
String cd = (String) properties.get("CD"); |
|
|
|
|
|
|
|
|
|
return cd.equals(admCd); |
|
|
|
|
}) |
|
|
|
|
.map(JSONObject::new) |
|
|
|
|
.findFirst(); |
|
|
|
|
|
|
|
|
|
JSONObject result = resultJsonObject.get(); |
|
|
|
|
JSONObject geometry = (JSONObject)result.get("geometry"); |
|
|
|
|
|
|
|
|
|
JSONArray coordinates = (JSONArray) geometry.get("coordinates"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for(int i = 0; i < coordinates.size(); i ++){ |
|
|
|
|
JSONArray arrayNode = (JSONArray)((JSONArray)coordinates.get(i)).get(0) ; |
|
|
|
|
|
|
|
|
|
List<SearchAddressCoordinateRS.CoordimateModel> coordinateList = new ArrayList<>(); |
|
|
|
|
|
|
|
|
|
for (Object o : arrayNode) { |
|
|
|
|
JSONArray node = (JSONArray) o; |
|
|
|
|
SearchAddressCoordinateRS.CoordimateModel coordimateModel = new SearchAddressCoordinateRS.CoordimateModel(); |
|
|
|
|
coordimateModel.setLon((Double) node.get(0)); |
|
|
|
|
coordimateModel.setLat((Double) node.get(1)); |
|
|
|
|
|
|
|
|
|
coordinateList.add(coordimateModel); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
SearchAddressCoordinateRS.LocationCoordinateModel locationCoordinateModel = new SearchAddressCoordinateRS.LocationCoordinateModel(); |
|
|
|
|
locationCoordinateModel.setIndex(i); |
|
|
|
|
locationCoordinateModel.setCoordinateList(coordinateList); |
|
|
|
|
|
|
|
|
|
locationCoordinateModelList.add(locationCoordinateModel); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} catch (IOException | ParseException e) { |
|
|
|
|
log.error("", e); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SearchAddressCoordinateRS result = new SearchAddressCoordinateRS(); |
|
|
|
|
result.setAdmCd(admCd); |
|
|
|
|
result.setAddress(address.toString()); |
|
|
|
|
result.setLocationCoordList(locationCoordinateModelList); |
|
|
|
|
|
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private String getScope(String address) { |
|
|
|
|
Map<String, String[]> patternMap = new HashMap<>(); |
|
|
|
|
patternMap.put("ctprvn", new String[]{ |
|
|
|
|
"^[^ ]+시$", |
|
|
|
|
"^[^ ]+도$" |
|
|
|
|
}); |
|
|
|
|
patternMap.put("sig", new String[]{ |
|
|
|
|
"^[^ ]+시 [^ ]+구$", |
|
|
|
|
"^[^ ]+시 [^ ]+군$", |
|
|
|
|
"^[^ ]+도 [^ ]+시$", |
|
|
|
|
"^[^ ]+도 [^ ]+시 [^ ]+구$" |
|
|
|
|
}); |
|
|
|
|
patternMap.put("emd", new String[]{ |
|
|
|
|
"^[^ ]+시 [^ ]+구 [^ ]+동$", |
|
|
|
|
"^[^ ]+시 [^ ]+동$", |
|
|
|
|
"^[^ ]+시 [^ ]+읍$", |
|
|
|
|
"^[^ ]+시 [^ ]+면$", |
|
|
|
|
"^[^ ]+도 [^ ]+시 [^ ]+동$", |
|
|
|
|
"^[^ ]+도 [^ ]+시 [^ ]+읍$", |
|
|
|
|
"^[^ ]+도 [^ ]+시 [^ ]+면$", |
|
|
|
|
"^[^ ]+도 [^ ]+시 [^ ]+구 [^ ]+동$", |
|
|
|
|
"^[^ ]+도 [^ ]+시 [^ ]+구 [^ ]+읍$", |
|
|
|
|
"^[^ ]+도 [^ ]+시 [^ ]+구 [^ ]+면$", |
|
|
|
|
"^[^ ]+시 [^ ]+군 [^ ]+읍$", |
|
|
|
|
"^[^ ]+시 [^ ]+군 [^ ]+면$" |
|
|
|
|
}); |
|
|
|
|
patternMap.put("li", new String[]{ |
|
|
|
|
"^[^ ]+시 [^ ]+구 [^ ]+동 [^ ]+리$", |
|
|
|
|
"^[^ ]+시 [^ ]+동 [^ ]+리$", |
|
|
|
|
"^[^ ]+시 [^ ]+읍 [^ ]+리$", |
|
|
|
|
"^[^ ]+시 [^ ]+면 [^ ]+리$", |
|
|
|
|
"^[^ ]+도 [^ ]+시 [^ ]+동 [^ ]+리$", |
|
|
|
|
"^[^ ]+도 [^ ]+시 [^ ]+읍 [^ ]+리$", |
|
|
|
|
"^[^ ]+도 [^ ]+시 [^ ]+면 [^ ]+리$", |
|
|
|
|
"^[^ ]+도 [^ ]+시 [^ ]+구 [^ ]+동 [^ ]+리$", |
|
|
|
|
"^[^ ]+도 [^ ]+시 [^ ]+구 [^ ]+읍 [^ ]+리$", |
|
|
|
|
"^[^ ]+도 [^ ]+시 [^ ]+구 [^ ]+면 [^ ]+리$", |
|
|
|
|
"^[^ ]+시 [^ ]+군 [^ ]+읍 [^ ]+리$", |
|
|
|
|
"^[^ ]+시 [^ ]+군 [^ ]+면 [^ ]+리$" |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
for (Map.Entry<String, String[]> entry : patternMap.entrySet()) { |
|
|
|
|
for (String pattern : entry.getValue()) { |
|
|
|
|
if (Pattern.matches(pattern, address)) { |
|
|
|
|
return entry.getKey(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
throw new CustomException(ErrorCode.NON_VALID_PARAMETER); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private String getCodeForderPath(String cd, String scope){ |
|
|
|
|
|
|
|
|
|
if(cd.length() != 10) return null; |
|
|
|
|
|
|
|
|
|
Stack<String> forderPathStack = new Stack<>(); |
|
|
|
|
|
|
|
|
|
switch (scope) { |
|
|
|
|
case "li": |
|
|
|
|
forderPathStack.push(cd.substring(0, 8)); |
|
|
|
|
case "emd": |
|
|
|
|
forderPathStack.push(cd.substring(0, 5)); |
|
|
|
|
case "sig": |
|
|
|
|
forderPathStack.push(cd.substring(0, 2)); |
|
|
|
|
case "ctprvn": |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
StringBuilder forderPath = new StringBuilder(); |
|
|
|
|
forderPath.append("air/coordinateFolder"); |
|
|
|
|
|
|
|
|
|
while(!forderPathStack.isEmpty()){ |
|
|
|
|
forderPath.append("/"); |
|
|
|
|
forderPath.append(forderPathStack.pop()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
forderPath.append("/all_location.geojson"); |
|
|
|
|
|
|
|
|
|
return forderPath.toString(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private String removeAdmCd(String cd, String scope){ |
|
|
|
|
|
|
|
|
|
if(cd.length() != 10) return null; |
|
|
|
|
|
|
|
|
|
String result = ""; |
|
|
|
|
|
|
|
|
|
switch (scope) { |
|
|
|
|
case "li": |
|
|
|
|
result = cd.substring(0, 10); |
|
|
|
|
break; |
|
|
|
|
case "emd": |
|
|
|
|
result = cd.substring(0, 8); |
|
|
|
|
break; |
|
|
|
|
case "sig": |
|
|
|
|
result = cd.substring(0, 5); |
|
|
|
|
break; |
|
|
|
|
case "ctprvn": |
|
|
|
|
result = cd.substring(0, 2); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|