Commit 1d030e23 by Guojunfeng

添加天地图转换源,以及给代码补充注释

parent 2c1cf78b
...@@ -6,25 +6,27 @@ import org.springframework.web.client.RestTemplate; ...@@ -6,25 +6,27 @@ import org.springframework.web.client.RestTemplate;
public class addressDNSUtil { public class addressDNSUtil {
private static final String BAIDU_AK = "cYfcu0CsGGNIl9GnfwUvGBjdiQDoMsGL"; private static final String BAIDU_AK = "cYfcu0CsGGNIl9GnfwUvGBjdiQDoMsGL";
private static final String GAODE_AK = "3866dcd12908db106e73b8f2e75ef3e3"; // private static final String GAODE_AK = "3866dcd12908db106e73b8f2e75ef3e3";
private static final String GAODE_AK = "d00bbe32ceb96d23fd8847c1efdfc65e";
private static final String TENGXUN_AK = "63GBZ-ADNWX-I564B-765QB-QEMW6-EXFOY"; private static final String TENGXUN_AK = "63GBZ-ADNWX-I564B-765QB-QEMW6-EXFOY";
private static final String TIANDITU_AK = "8890c68b649af2c52d04e0d6b28f6003";
//type标识正向反向. geo是正向,regeo是反向。 //type标识正向反向. geo是正向,regeo是反向。
//source 表示调用百度还是高德,高德用gaode,百度用baidu, //source 表示调用百度还是高德,高德用gaode,百度用baidu,天地图用tianditu,
//正向需要参数address,使用|分割, //正向需要参数address,使用|分割,
//反向需要参数location,使用|分割, //反向需要参数location,使用|分割,
//这里一开始没定好方向,经纬度整一块了,对性能损耗不大,不修改。 //这里一开始没定好方向,经纬度整一块了,对性能损耗不大,不修改。
public static JSONObject getGeo(String type, String source, String address, String location){ public static JSONObject getGeo(String type, String source, String address, String location) {
RestTemplate restTemplate = new RestTemplate(); RestTemplate restTemplate = new RestTemplate();
JSONObject responseJO = new JSONObject(); JSONObject responseJO = new JSONObject();
//正向 ---使用address //正向 ---使用address
if("geo".equals(type)){ if ("geo".equals(type)) {
//来源是百度---百度无法一次性批量,使用循环查询再拼装结果。 //来源是百度---百度无法一次性批量,使用循环查询再拼装结果。
if("baidu".equals(source)){ if ("baidu".equals(source)) {
String[] addressList; String[] addressList;
if(address.contains("|")){//查询多个 if (address.contains("|")) {//查询多个
addressList = address.split("\\|"); addressList = address.split("\\|");
}else{//查询一个 } else {//查询一个
addressList = new String[1]; addressList = new String[1];
addressList[0] = address; addressList[0] = address;
} }
...@@ -33,58 +35,87 @@ public class addressDNSUtil { ...@@ -33,58 +35,87 @@ public class addressDNSUtil {
JSONObject queryJO;//这里不new,减少JVM垃圾回收。 JSONObject queryJO;//这里不new,减少JVM垃圾回收。
for(int i = 0;i < addressList.length;i ++){ for (int i = 0; i < addressList.length; i++) {
JSONObject addJO = new JSONObject(); JSONObject addJO = new JSONObject();
url.append("http://api.map.baidu.com/geocoding/v3/?address="); url.append("http://api.map.baidu.com/geocoding/v3/?address=");
url.append(addressList[i]); url.append(addressList[i]);
//2021-05-27 //2021-05-27
url.append("&output=json&ak=").append(BAIDU_AK); url.append("&output=json&ak=").append(BAIDU_AK);
String result = restTemplate.getForObject(url.toString(), String.class); String result = restTemplate.getForObject(url.toString(), String.class);
System.out.println(addressList[i] + result); System.out.println(addressList[i] + result);
queryJO = (JSONObject) JSONObject.parseObject(result).get("result"); queryJO = (JSONObject) JSONObject.parseObject(result).get("result");
addJO.put("formatted_address", addressList[i]); addJO.put("formatted_address", addressList[i]);
//0是百度正向解析成功。 //0是百度正向解析成功。
if(JSONObject.parseObject(result).getIntValue("status") == 0){ if (JSONObject.parseObject(result).getIntValue("status") == 0) {
queryJO = (JSONObject) queryJO.get("location"); queryJO = (JSONObject) queryJO.get("location");
StringBuffer latlng = new StringBuffer(queryJO.getString("lng")); StringBuffer latlng = new StringBuffer(queryJO.getString("lng"));
latlng.append(",").append(queryJO.getString("lat")); latlng.append(",").append(queryJO.getString("lat"));
addJO.put("location", latlng); addJO.put("location", latlng);
}else { } else {
addJO.put("location", ""); addJO.put("location", "");
} }
jsonArray.add(addJO); jsonArray.add(addJO);
url.delete(0 ,url.length()); url.delete(0, url.length());
} }
responseJO.put("status", 200); responseJO.put("status", 200);
responseJO.put("geocodes", jsonArray); responseJO.put("geocodes", jsonArray);
return responseJO; return responseJO;
} }
if("gaode".equals(source)){ if ("gaode".equals(source)) {
StringBuffer url = new StringBuffer("https://restapi.amap.com/v3/geocode/geo?address="); StringBuffer url = new StringBuffer("https://restapi.amap.com/v3/geocode/geo?address=");
url.append(address); url.append(address);
url.append("&output=json&key=").append(GAODE_AK); url.append("&output=json&key=").append(GAODE_AK);
url.append("&batch=").append("true");//默认开启批量,|分割,最多支持10个 url.append("&batch=").append("true");//默认开启批量,|分割,最多支持10个
String result = restTemplate.getForObject(url.toString(), String.class); String result = restTemplate.getForObject(url.toString(), String.class);
System.out.println(result); System.out.println(result);
responseJO = JSONObject.parseObject(result); responseJO = JSONObject.parseObject(result);
if("1".equals(responseJO.getString("status"))){ if ("1".equals(responseJO.getString("status"))) {
responseJO.put("status", 200); responseJO.put("status", 200);
} }
return responseJO; return responseJO;
} }
if ("tianditu".equals(source)) {
if("tengxun".equals(source)){//不支持批量,这里也不进行批量,只查一个。 StringBuffer url = new StringBuffer("http://api.tianditu.gov.cn/geocoder?ds=");
String json = "{\"keyWord\":\""+address+"\"}";
url.append("{json}");
url.append("&tk=").append(TIANDITU_AK);
String result = restTemplate.getForObject(url.toString(), String.class,json);
System.out.println(result);
JSONObject resultJson = JSONObject.parseObject(result);
//获得状态码
String status = resultJson.getString("status");
//若转换成功
if ("0".equals(status)) {
responseJO.put("status", 200);
JSONObject locationJson = resultJson.getJSONObject("location");
//获得经纬度
String lon = locationJson.getString("lon");
String lat = locationJson.getString("lat");
//拼接经纬度
StringBuffer latlng = new StringBuffer(lon);
latlng.append(",").append(lat);
//返回值格式为jsonArray,此处拼json放入json数组
JSONArray jsonArray = new JSONArray();
JSONObject jsonObject = new JSONObject();
jsonObject.put("formatted_address", address);
jsonObject.put("location", latlng);
jsonArray.add(jsonObject);
responseJO.put("geocodes", jsonArray);
}
return responseJO;
}
if ("tengxun".equals(source)) {//不支持批量,这里也不进行批量,只查一个。
StringBuffer url = new StringBuffer("https://apis.map.qq.com/ws/geocoder/v1/?address="); StringBuffer url = new StringBuffer("https://apis.map.qq.com/ws/geocoder/v1/?address=");
url.append(address); url.append(address);
url.append("&output=json&key=").append(TENGXUN_AK); url.append("&output=json&key=").append(TENGXUN_AK);
String result = restTemplate.getForObject(url.toString(), String.class); String result = restTemplate.getForObject(url.toString(), String.class);
System.out.println(result); System.out.println(result);
responseJO = JSONObject.parseObject(result); responseJO = JSONObject.parseObject(result);
JSONArray jsonArray = new JSONArray(); JSONArray jsonArray = new JSONArray();
JSONObject queryJO; JSONObject queryJO;
if(0 ==(responseJO.getIntValue("status"))){ if (0 == (responseJO.getIntValue("status"))) {
responseJO.put("status", 200); responseJO.put("status", 200);
queryJO = (JSONObject) ((JSONObject) responseJO.get("result")).get("location"); queryJO = (JSONObject) ((JSONObject) responseJO.get("result")).get("location");
StringBuffer latlng = new StringBuffer(queryJO.getString("lng")); StringBuffer latlng = new StringBuffer(queryJO.getString("lng"));
...@@ -98,16 +129,15 @@ public class addressDNSUtil { ...@@ -98,16 +129,15 @@ public class addressDNSUtil {
} }
} }
//反向 //反向
if("regeo".equals(type)){ if ("regeo".equals(type)) {
//来源是百度 //来源是百度
if("baidu".equals(source)){ if ("baidu".equals(source)) {
String[] locationList; String[] locationList;
if(location.contains("|")){//查询多个 if (location.contains("|")) {//查询多个
locationList = location.split("\\|"); locationList = location.split("\\|");
}else{//查询一个 } else {//查询一个
locationList = new String[1]; locationList = new String[1];
locationList[0] = location; locationList[0] = location;
} }
...@@ -116,60 +146,100 @@ public class addressDNSUtil { ...@@ -116,60 +146,100 @@ public class addressDNSUtil {
JSONObject queryJO;//这里不new,减少JVM垃圾回收。 JSONObject queryJO;//这里不new,减少JVM垃圾回收。
for(int i = 0;i < locationList.length;i ++){ for (int i = 0; i < locationList.length; i++) {
JSONObject addJO = new JSONObject(); JSONObject addJO = new JSONObject();
url.append("http://api.map.baidu.com/reverse_geocoding/v3/?coordtype=wgs84ll&ak="); url.append("http://api.map.baidu.com/reverse_geocoding/v3/?coordtype=wgs84ll&ak=");
url.append(BAIDU_AK); url.append(BAIDU_AK);
url.append("&output=json&location="); url.append("&output=json&location=");
url.append(locationList[i]); url.append(locationList[i]);
String result = restTemplate.getForObject(url.toString(), String.class); String result = restTemplate.getForObject(url.toString(), String.class);
System.out.println(url); System.out.println(url);
queryJO = (JSONObject) JSONObject.parseObject(result).get("result"); queryJO = (JSONObject) JSONObject.parseObject(result).get("result");
addJO.put("location", locationList[i]); addJO.put("location", locationList[i]);
//0是百度正向解析成功。 //0是百度解析成功。
if(JSONObject.parseObject(result).getIntValue("status") == 0 && ! "".equals(queryJO.getString("formatted_address"))){ if (JSONObject.parseObject(result).getIntValue("status") == 0 && !"".equals(queryJO.getString(
"formatted_address"))) {
addJO.put("formatted_address", queryJO.getString("formatted_address")); addJO.put("formatted_address", queryJO.getString("formatted_address"));
}else { } else {
addJO.put("formatted_address", "无效地址"); addJO.put("formatted_address", "无效地址");
} }
jsonArray.add(addJO); jsonArray.add(addJO);
url.delete(0 ,url.length()); url.delete(0, url.length());
} }
responseJO.put("status", 200); responseJO.put("status", 200);
responseJO.put("regeocodes", jsonArray); responseJO.put("regeocodes", jsonArray);
return responseJO; return responseJO;
} }
if("gaode".equals(source)){ //高德反向
StringBuffer url = new StringBuffer("https://restapi.amap.com/v3/geocode/regeo?extensions=base&output=json&key="); if ("gaode".equals(source)) {
StringBuffer url = new StringBuffer("https://restapi.amap.com/v3/geocode/regeo?extensions=base&output" +
"=json&key=");
url.append(GAODE_AK); url.append(GAODE_AK);
url.append("&location=").append(location); url.append("&location=").append(location);
url.append("&batch=").append("true"); url.append("&batch=").append("true");
String result = restTemplate.getForObject(url.toString(), String.class); String result = restTemplate.getForObject(url.toString(), String.class);
responseJO = JSONObject.parseObject(result); responseJO = JSONObject.parseObject(result);
if("1".equals(responseJO.getString("status"))){ if ("1".equals(responseJO.getString("status"))) {
responseJO.put("status", 200); responseJO.put("status", 200);
} }
return responseJO; return responseJO;
} }
//天地图反向
if("tengxun".equals(source)){//不支持批量,这里也不进行批量,只查一个。 if ("tianditu".equals(source)) {
//此处完整的url格式为:
// http://api.tianditu.gov.cn/geocoder?postStr={'lon':116.311469,'lat':39.94199864,'ver':1}&type=geocode&tk=8890c68b649af2c52d04e0d6b28f6003
//{}为占位符,需将{}里的值传入restTemplate.getForObject的第三个参数
try {
Thread.sleep(400);
} catch (InterruptedException e) {
e.printStackTrace();
}
StringBuffer url = new StringBuffer("http://api.tianditu.gov.cn/geocoder?postStr=");
String json = "{"+location+",\"ver\":1}";
url.append("{json}");
url.append("&type=").append("geocode");
url.append("&tk=").append(TIANDITU_AK);
// String json = "{\"lon\":116.311469,\"lat\":39.94199864,\"ver\":1}";
// String url = "http://api.tianditu.gov.cn/geocoder?postStr={json}&type=geocode&tk=8890c68b649af2c52d04e0d6b28f6003";
String result = restTemplate.getForObject(url.toString(), String.class,json);
JSONArray jsonArray = new JSONArray();
JSONObject addJO = new JSONObject();
JSONObject queryJO = JSONObject.parseObject(result);
String status = queryJO.getString("status");
JSONObject jsonObject = queryJO.getJSONObject("result");
String formatted_address = jsonObject.getString("formatted_address");
//0是天地图解析成功
if ("0".equals(status) && !"".equals(formatted_address)) {
addJO.put("formatted_address", formatted_address);
} else {
addJO.put("formatted_address", "无效地址");
}
//如果将status和regeocodes放在此处,必定不会进入下一次数据源转换,因为必定200且有值
jsonArray.add(addJO);
responseJO.put("status", 200);
responseJO.put("regeocodes", jsonArray);
return responseJO;
}
//腾讯反向
if ("tengxun".equals(source)) {//不支持批量,这里也不进行批量,只查一个。
StringBuffer url = new StringBuffer("https://apis.map.qq.com/ws/geocoder/v1/?location="); StringBuffer url = new StringBuffer("https://apis.map.qq.com/ws/geocoder/v1/?location=");
url.append(location); url.append(location);
url.append("&output=json&key="); url.append("&output=json&key=");
url.append(TENGXUN_AK); url.append(TENGXUN_AK);
String result = restTemplate.getForObject(url.toString(), String.class); String result = restTemplate.getForObject(url.toString(), String.class);
System.out.println(url); System.out.println(url);
JSONArray jsonArray = new JSONArray(); JSONArray jsonArray = new JSONArray();
JSONObject addJO = new JSONObject(); JSONObject addJO = new JSONObject();
JSONObject queryJO = (JSONObject) JSONObject.parseObject(result).get("result"); JSONObject queryJO = (JSONObject) JSONObject.parseObject(result).get("result");
addJO.put("location", location); addJO.put("location", location);
//0是百度正向解析成功。 //0是腾讯解析成功。
if(JSONObject.parseObject(result).getIntValue("status") == 0 && ! "".equals(queryJO.getString("formatted_address"))){ if (JSONObject.parseObject(result).getIntValue("status") == 0 && !"".equals(queryJO.getString(
"formatted_address"))) {
addJO.put("formatted_address", queryJO.getString("address")); addJO.put("formatted_address", queryJO.getString("address"));
}else { } else {
addJO.put("formatted_address", "无效地址"); addJO.put("formatted_address", "无效地址");
} }
jsonArray.add(addJO); jsonArray.add(addJO);
...@@ -177,10 +247,6 @@ public class addressDNSUtil { ...@@ -177,10 +247,6 @@ public class addressDNSUtil {
responseJO.put("regeocodes", jsonArray); responseJO.put("regeocodes", jsonArray);
return responseJO; return responseJO;
} }
} }
//请求参数错误。 //请求参数错误。
responseJO.put("status", 400); responseJO.put("status", 400);
......
...@@ -6,7 +6,6 @@ import com.alibaba.excel.event.AnalysisEventListener; ...@@ -6,7 +6,6 @@ import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.support.ExcelTypeEnum; import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import fwj.controller.kyPersonController;
import fwj.entity.tranLngLat; import fwj.entity.tranLngLat;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
...@@ -18,19 +17,35 @@ import java.time.format.DateTimeFormatter; ...@@ -18,19 +17,35 @@ import java.time.format.DateTimeFormatter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
/**
* 在该类中的invoke方法中控制使用哪种数据源进行正逆向地理编码
*/
public class addressLocationListener extends AnalysisEventListener<tranLngLat> { public class addressLocationListener extends AnalysisEventListener<tranLngLat> {
List<tranLngLat> lnglatList = new ArrayList<>(1000); List<tranLngLat> lnglatList = new ArrayList<>(1000);
HttpServletResponse response; HttpServletResponse response;
String fileName; String fileName;
boolean isEightFour; boolean isEightFour;
public addressLocationListener(HttpServletResponse response, String fileName,boolean isEightFour){
/**
* 构造方法用于初始化
*
* @param response
* @param fileName
* @param isEightFour
*/
public addressLocationListener(HttpServletResponse response, String fileName, boolean isEightFour) {
this.fileName = fileName; this.fileName = fileName;
this.response = response; this.response = response;
this.isEightFour = isEightFour; this.isEightFour = isEightFour;
} }
DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyyMMddHHmmss"); DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
/**
* 每解析一行会回调invoke()方法。
* 整个excel解析结束会执行doAfterAllAnalysed()方法
*/
@Override @Override
public void invoke(tranLngLat tranlnglat, AnalysisContext analysisContext) { public void invoke(tranLngLat tranlnglat, AnalysisContext analysisContext) {
JSONObject jo = new JSONObject(); JSONObject jo = new JSONObject();
...@@ -39,7 +54,9 @@ public class addressLocationListener extends AnalysisEventListener<tranLngLat> { ...@@ -39,7 +54,9 @@ public class addressLocationListener extends AnalysisEventListener<tranLngLat> {
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
}*/ }*/
if(! StringUtils.isEmpty(tranlnglat.getAddress())){
//标准地址不为空,调用地理编码接口
if (!StringUtils.isEmpty(tranlnglat.getAddress())) {
/*if("tengxun".equals(source)){ /*if("tengxun".equals(source)){
try {//腾讯的因为每秒并发5个,所以使用线程阻塞 try {//腾讯的因为每秒并发5个,所以使用线程阻塞
Thread.sleep(200); Thread.sleep(200);
...@@ -59,24 +76,23 @@ public class addressLocationListener extends AnalysisEventListener<tranLngLat> { ...@@ -59,24 +76,23 @@ public class addressLocationListener extends AnalysisEventListener<tranLngLat> {
kyPersonController.gaode_geoNum = + 1; kyPersonController.gaode_geoNum = + 1;
}*/ }*/
// tranlnglat = myGeoProcesster(jo, tranlnglat, "tianditu", isEightFour);
tranlnglat = myGeoProcesster(jo, tranlnglat, "gaode", isEightFour); tranlnglat = myGeoProcesster(jo, tranlnglat, "gaode", isEightFour);
if(tranlnglat.getHasSuccess() == 0){ if (tranlnglat.getHasSuccess() == 0) {
tranlnglat = myGeoProcesster(jo, tranlnglat, "baidu", isEightFour); tranlnglat = myGeoProcesster(jo, tranlnglat, "baidu", isEightFour);
if(tranlnglat.getHasSuccess() == 0){ if (tranlnglat.getHasSuccess() == 0) {
tranlnglat = myGeoProcesster(jo, tranlnglat, "tengxun", isEightFour); tranlnglat = myGeoProcesster(jo, tranlnglat, "tengxun", isEightFour);
if (tranlnglat.getHasSuccess() == 0) {
tranlnglat = myGeoProcesster(jo, tranlnglat, "tianditu", isEightFour);
}
} }
} }
/* tranlnglat = myGeoProcesster(jo, tranlnglat, "tengxun");
if(tranlnglat.getHasSuccess() == 0){
tranlnglat = myGeoProcesster(jo, tranlnglat, "baidu");
if(tranlnglat.getHasSuccess() == 0){
tranlnglat = myGeoProcesster(jo, tranlnglat, "gaode");
}
}*/
lnglatList.add(tranlnglat); lnglatList.add(tranlnglat);
}else { } else {
System.out.println( "有经纬度转 " + tranlnglat.getId() ); //有经纬度,调用逆地理编码接口
System.out.println("有经纬度转 " + tranlnglat.getId());
/*if("tengxun".equals(source)){ /*if("tengxun".equals(source)){
...@@ -104,34 +120,44 @@ public class addressLocationListener extends AnalysisEventListener<tranLngLat> { ...@@ -104,34 +120,44 @@ public class addressLocationListener extends AnalysisEventListener<tranLngLat> {
/* jo = addressDNSUtil.getGeo("regeo", source, "", sb.toString()); /* jo = addressDNSUtil.getGeo("regeo", source, "", sb.toString());
System.out.println(JSONObject.toJSONString(jo)); System.out.println(JSONObject.toJSONString(jo));
if(jo.getIntValue("status") == 200 && (JSONArray) jo.get("regeocodes") != null && ((JSONArray) jo.get("regeocodes")).size() > 0){ if(jo.getIntValue("status") == 200 && (JSONArray) jo.get("regeocodes") != null && ((JSONArray) jo.get
("regeocodes")).size() > 0){
String a = ((JSONObject) ((JSONArray) jo.get("regeocodes")).get(0)).getString("formatted_address"); String a = ((JSONObject) ((JSONArray) jo.get("regeocodes")).get(0)).getString("formatted_address");
tranlnglat.setAddress(a); tranlnglat.setAddress(a);
}*/ }*/
/**
* 默认先调用gaode来源,每次调用成功后会把hasSuccess设置为1,则不会继续调用,反之一个个来源调用
*/
// tranlnglat = myReGeoProcesster(jo, tranlnglat, "gaode");
// if (tranlnglat.getHasSuccess() == 0) {
// tranlnglat = myReGeoProcesster(jo, tranlnglat, "baidu");
// if (tranlnglat.getHasSuccess() == 0) {
// tranlnglat = myReGeoProcesster(jo, tranlnglat, "tengxun");
//
// }
// }
// tranlnglat = myReGeoProcesster(jo, tranlnglat, "tianditu");
tranlnglat = myReGeoProcesster(jo, tranlnglat, "gaode"); tranlnglat = myReGeoProcesster(jo, tranlnglat, "gaode");
if(tranlnglat.getHasSuccess() == 0){ if (tranlnglat.getHasSuccess() == 0) {
tranlnglat = myReGeoProcesster(jo, tranlnglat, "baidu"); tranlnglat = myReGeoProcesster(jo, tranlnglat, "baidu");
if(tranlnglat.getHasSuccess() == 0){ if (tranlnglat.getHasSuccess() == 0) {
tranlnglat = myReGeoProcesster(jo, tranlnglat, "tengxun"); tranlnglat = myReGeoProcesster(jo, tranlnglat, "tengxun");
if (tranlnglat.getHasSuccess() == 0) {
tranlnglat = myReGeoProcesster(jo, tranlnglat, "tianditu");
}
} }
} }
/* tranlnglat = myReGeoProcesster(jo, tranlnglat, "tengxun");
if(tranlnglat.getHasSuccess() == 0){
tranlnglat = myReGeoProcesster(jo, tranlnglat, "baidu");
if(tranlnglat.getHasSuccess() == 0){
tranlnglat = myReGeoProcesster(jo, tranlnglat, "gaode");
}
}*/
//并发量高的时候,腾讯的会丢失,这里返回原本数据不处理。 //并发量高的时候,腾讯的会丢失,这里返回原本数据不处理。
lnglatList.add(tranlnglat); lnglatList.add(tranlnglat);
} }
} }
@Override @Override
...@@ -142,13 +168,15 @@ public class addressLocationListener extends AnalysisEventListener<tranLngLat> { ...@@ -142,13 +168,15 @@ public class addressLocationListener extends AnalysisEventListener<tranLngLat> {
myFile.delete(); myFile.delete();
} }
EasyExcel.write(fileName, idLocation.class).sheet("Sheet1").doWrite(idLocationList);*/ EasyExcel.write(fileName, idLocation.class).sheet("Sheet1").doWrite(idLocationList);*/
//拿到原本文件名传入downLoadExcel方法
downLoadExcel(fileName); downLoadExcel(fileName);
} }
private void downLoadExcel(String fileName) { private void downLoadExcel(String fileName) {
try { try {
//输出新文件,拼接新文件名
LocalDateTime localDateTime = LocalDateTime.now(); LocalDateTime localDateTime = LocalDateTime.now();
fileName = fileName.split("\\.")[0] fileName = fileName.split("\\.")[0]
.concat(dtf2.format(localDateTime)) .concat(dtf2.format(localDateTime))
...@@ -157,97 +185,105 @@ public class addressLocationListener extends AnalysisEventListener<tranLngLat> { ...@@ -157,97 +185,105 @@ public class addressLocationListener extends AnalysisEventListener<tranLngLat> {
response.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8");
response.setHeader("content-Type", "application/vnd.ms-excel"); response.setHeader("content-Type", "application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8") ); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
if(fileName.toLowerCase().contains("xls")){ //原本是xls则输出xls,原本是xlsx则输出xlsx
EasyExcel.write(response.getOutputStream(), tranLngLat.class).excelType(ExcelTypeEnum.XLS).sheet("Sheet1").doWrite(lnglatList); if (fileName.toLowerCase().contains("xls")) {
}else { EasyExcel.write(response.getOutputStream(), tranLngLat.class).excelType(ExcelTypeEnum.XLS).sheet(
EasyExcel.write(response.getOutputStream(), tranLngLat.class).excelType(ExcelTypeEnum.XLSX).sheet("Sheet1").doWrite(lnglatList); "Sheet1").doWrite(lnglatList);
} else {
EasyExcel.write(response.getOutputStream(), tranLngLat.class).excelType(ExcelTypeEnum.XLSX).sheet(
"Sheet1").doWrite(lnglatList);
} }
} catch (IOException e) { } catch (IOException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} }
private tranLngLat myGeoProcesster(JSONObject jo, tranLngLat mytll, String source, boolean isEightFour) {
private tranLngLat myGeoProcesster( JSONObject jo, tranLngLat mytll, String source, boolean isEightFour){
jo = addressDNSUtil.getGeo("geo", source, mytll.getAddress(), ""); jo = addressDNSUtil.getGeo("geo", source, mytll.getAddress(), "");
System.out.println(source + "调用 " + JSONObject.toJSONString(jo)); System.out.println(source + "调用 " + JSONObject.toJSONString(jo));
if(jo.getIntValue("status") == 200 && (JSONArray) jo.get("geocodes") != null && ((JSONArray) jo.get("geocodes")).size() > 0){ if (jo.getIntValue("status") == 200 && (JSONArray) jo.get("geocodes") != null && ((JSONArray) jo.get(
"geocodes")).size() > 0) {
String location = ((JSONObject) ((JSONArray) jo.get("geocodes")).get(0)).getString("location"); String location = ((JSONObject) ((JSONArray) jo.get("geocodes")).get(0)).getString("location");
if ("tengxun".equals(source)) {
mytll.setSource("腾讯");
if (location.contains(",")) {
if (isEightFour) {//需要转换为84坐标
//需传入lat,lon,返回0是lat,1是lon
double[] myD = LngLonUtil.gcj02_To_Gps84(Double.valueOf(location.split(",")[1]),
Double.valueOf(location.split(",")[0]));
mytll.setLng(String.valueOf(myD[1]));
mytll.setLat(String.valueOf(myD[0]));
} else {
//location的0是lon,1是lat
mytll.setLng(location.split(",")[0]);
mytll.setLat(location.split(",")[1]);
}
}
if("tengxun".equals(source)){ } else if ("gaode".equals(source)) {
mytll.setSource("腾讯"); mytll.setSource("高德");
if (location.contains(",")) {
if(location.contains(",")){ if (isEightFour) {//需要转换为84坐标
if(isEightFour){//需要转换为84坐标 double[] myD = LngLonUtil.gcj02_To_Gps84(Double.valueOf(location.split(",")[1]),
double [] myD = LngLonUtil.gcj02_To_Gps84(Double.valueOf(location.split(",")[1]), Double.valueOf(location.split(",")[0])); Double.valueOf(location.split(",")[0]));
mytll.setLng(String.valueOf(myD[1])); mytll.setLng(String.valueOf(myD[1]));
mytll.setLat(String.valueOf(myD[0])); mytll.setLat(String.valueOf(myD[0]));
}else{ } else {
mytll.setLng(location.split(",")[0]); mytll.setLng(location.split(",")[0]);
mytll.setLat(location.split(",")[1]); mytll.setLat(location.split(",")[1]);
} }
} }
} else if ("baidu".equals(source)) {
mytll.setSource("百度");
}else if("gaode".equals(source)){ if (location.contains(",")) {
mytll.setSource("高德"); if (isEightFour) {//需要转换为84坐标
if(location.contains(",")){ double[] myD = LngLonUtil.bd09_To_gps84(Double.valueOf(location.split(",")[1]),
if(isEightFour){//需要转换为84坐标 Double.valueOf(location.split(",")[0]));
double [] myD = LngLonUtil.gcj02_To_Gps84(Double.valueOf(location.split(",")[1]), Double.valueOf(location.split(",")[0])); mytll.setLng(String.valueOf(myD[1]));
mytll.setLng(String.valueOf(myD[1])); mytll.setLat(String.valueOf(myD[0]));
mytll.setLat(String.valueOf(myD[0])); } else {
}else{ mytll.setLng(location.split(",")[0]);
mytll.setLng(location.split(",")[0]); mytll.setLat(location.split(",")[1]);
mytll.setLat(location.split(",")[1]); }
} }
} } else if ("tianditu".equals(source)) {
//天地图的坐标系就是CGCS2000,不需要转坐标系
mytll.setSource("天地图");
if (location.contains(",")) {
}else if("baidu".equals(source)) { mytll.setLng(location.split(",")[0]);
mytll.setSource("百度"); mytll.setLat(location.split(",")[1]);
if(location.contains(",")){ }
if(isEightFour){//需要转换为84坐标
double [] myD = LngLonUtil.bd09_To_gps84(Double.valueOf(location.split(",")[1]), Double.valueOf(location.split(",")[0]));
mytll.setLng(String.valueOf(myD[1]));
mytll.setLat(String.valueOf(myD[0]));
}else{
mytll.setLng(location.split(",")[0]);
mytll.setLat(location.split(",")[1]);
}
}
} }
mytll.setHasSuccess(1); mytll.setHasSuccess(1);
}else{ } else {
mytll.setHasSuccess(0); mytll.setHasSuccess(0);
} }
return mytll; return mytll;
} }
private tranLngLat myReGeoProcesster(JSONObject jo, tranLngLat mytll, String source) {
private tranLngLat myReGeoProcesster( JSONObject jo, tranLngLat mytll, String source){
//这里希望是线程安全的。 //这里希望是线程安全的。
//这里的else好像没意义,因为当所有情况调用完还是没结果返回,invoke()方法中的多重if条件判断已经调用完-20220613
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
if("tengxun".equals(source)){ if ("tengxun".equals(source)) {
mytll.setSource("腾讯"); mytll.setSource("腾讯");
sb.append(mytll.getLat()).append(",").append(mytll.getLng()); sb.append(mytll.getLat()).append(",").append(mytll.getLng());
}else if("gaode".equals(source)){//高德地址反向,先传经度后维度 } else if ("gaode".equals(source)) {//高德地址反向,先传经度后维度
mytll.setSource("高德"); mytll.setSource("高德");
sb.append(mytll.getLng()).append(",").append(mytll.getLat()); sb.append(mytll.getLng()).append(",").append(mytll.getLat());
}else if("baidu".equals(source)) { } else if ("baidu".equals(source)) {
mytll.setSource("百度"); mytll.setSource("百度");
sb.append(mytll.getLat()).append(",").append(mytll.getLng()); sb.append(mytll.getLat()).append(",").append(mytll.getLng());
}else { } else if ("tianditu".equals(source)) {//天地图反向,先传经度后纬度
mytll.setSource("天地图");
sb.append("\"lon\":").append(mytll.getLng()).append(",\"lat\":").append(mytll.getLat());
} else {
sb.append(mytll.getLat()).append(",").append(mytll.getLng()); sb.append(mytll.getLat()).append(",").append(mytll.getLng());
mytll.setSource("高德"); mytll.setSource("高德");
} }
...@@ -255,11 +291,13 @@ public class addressLocationListener extends AnalysisEventListener<tranLngLat> { ...@@ -255,11 +291,13 @@ public class addressLocationListener extends AnalysisEventListener<tranLngLat> {
jo = addressDNSUtil.getGeo("regeo", source, "", sb.toString()); jo = addressDNSUtil.getGeo("regeo", source, "", sb.toString());
System.out.println(JSONObject.toJSONString(jo)); System.out.println(JSONObject.toJSONString(jo));
if(jo.getIntValue("status") == 200 && (JSONArray) jo.get("regeocodes") != null && ((JSONArray) jo.get("regeocodes")).size() > 0){ if (jo.getIntValue("status") == 200 && (JSONArray) jo.get("regeocodes") != null && ((JSONArray) jo.get(
"regeocodes")).size() > 0) {
String a = ((JSONObject) ((JSONArray) jo.get("regeocodes")).get(0)).getString("formatted_address"); String a = ((JSONObject) ((JSONArray) jo.get("regeocodes")).get(0)).getString("formatted_address");
mytll.setAddress(a); mytll.setAddress(a);
//该值用于控制停止进入下一地图源转换
mytll.setHasSuccess(1); mytll.setHasSuccess(1);
}else{ } else {
mytll.setHasSuccess(0); mytll.setHasSuccess(0);
} }
return mytll; return mytll;
......
...@@ -10,5 +10,9 @@ spring.mvc.favicon.enabled=false ...@@ -10,5 +10,9 @@ spring.mvc.favicon.enabled=false
spring.mvc.static-path-pattern=/** spring.mvc.static-path-pattern=/**
spring.resources.static-locations=classpath:/webapp/ spring.resources.static-locations=classpath:/webapp/
#ȲЧ #\uFFFD\u0232\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u0427
spring.devtools.restart.enabled=true spring.devtools.restart.enabled=true
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
...@@ -106,7 +106,9 @@ ...@@ -106,7 +106,9 @@
}) })
/**
* 判断文件路径是否正确
*/
function doSaveBg() { function doSaveBg() {
var localPath = $("#fileName1").val(); var localPath = $("#fileName1").val();
var a = $("#isEF").prop("checked"); var a = $("#isEF").prop("checked");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment