|
@@ -5,7 +5,6 @@ import com.alibaba.fastjson.JSONObject;
|
|
|
import com.skyversation.poiaddr.bean.Address;
|
|
|
import com.skyversation.poiaddr.bean.AddressResult;
|
|
|
import com.skyversation.poiaddr.bean.GeoJsonBean;
|
|
|
-import com.skyversation.poiaddr.bean.WDToken;
|
|
|
import com.skyversation.poiaddr.service.AreaService;
|
|
|
import com.skyversation.poiaddr.util.ShanghaiAddressSplitUtil;
|
|
|
import com.skyversation.poiaddr.util.SplitAddress;
|
|
@@ -14,8 +13,6 @@ import com.skyversation.poiaddr.util.status.AddressLevel;
|
|
|
import com.skyversation.poiaddr.util.status.AddressResultEnum;
|
|
|
import org.springframework.http.HttpMethod;
|
|
|
import org.springframework.http.ResponseEntity;
|
|
|
-import org.springframework.util.LinkedMultiValueMap;
|
|
|
-import org.springframework.util.MultiValueMap;
|
|
|
import org.springframework.util.StringUtils;
|
|
|
import org.apache.commons.codec.binary.Base64;
|
|
|
|
|
@@ -37,8 +34,6 @@ public class AddressQueryEngine {
|
|
|
return instance;
|
|
|
}
|
|
|
|
|
|
- private WDToken wdToken = null;
|
|
|
-
|
|
|
/***
|
|
|
* 单条地名搜索通用方法,搜索顺序 1. 武大吉奥; 2. 市四中心; 3. 高德搜索; 4. 高德高级搜索;
|
|
|
* @param addrs
|
|
@@ -75,7 +70,7 @@ public class AddressQueryEngine {
|
|
|
AddressResult addressResult = new AddressResult();
|
|
|
|
|
|
SplitAddress splitAddress = ShanghaiAddressSplitUtil.splitBestAddress(addr);
|
|
|
- if(splitAddress.getStatus() == 2){ // 外省数据
|
|
|
+ if (splitAddress.getStatus() == 2) { // 外省数据
|
|
|
addressResult.setMessage("非上海数据");
|
|
|
AddressResult.ContentBean content = new AddressResult.ContentBean();
|
|
|
content.setPname(splitAddress.getProvince());
|
|
@@ -84,7 +79,7 @@ public class AddressQueryEngine {
|
|
|
content.setCommunity(splitAddress.getCommunity());
|
|
|
addressResult.setData(new ArrayList<>());
|
|
|
addressResult.getData().add(content);
|
|
|
- } else if(splitAddress.getStatus() == 3){// 不是地址
|
|
|
+ } else if (splitAddress.getStatus() == 3) {// 不是地址
|
|
|
addressResult.setMessage("非地址数据");
|
|
|
} else {
|
|
|
AddressResult.ContentBean addrBean = new AddressResult.ContentBean();
|
|
@@ -94,7 +89,7 @@ public class AddressQueryEngine {
|
|
|
addrBean.setDistance(splitAddress.getDistrict());
|
|
|
addrBean.setAdname(splitAddress.getStreet());
|
|
|
addrBean.setCommunity(splitAddress.getCommunity());
|
|
|
- addrBean.setStandAddr(splitAddress.getCity() + splitAddress.getDistrict() +splitAddress.getStreet()
|
|
|
+ addrBean.setStandAddr(splitAddress.getCity() + splitAddress.getDistrict() + splitAddress.getStreet()
|
|
|
+ splitAddress.getCommunity() + splitAddress.getAddr());
|
|
|
addressResult.setAddrBean(addrBean);
|
|
|
|
|
@@ -104,7 +99,7 @@ public class AddressQueryEngine {
|
|
|
JSONArray pois = new JSONArray();
|
|
|
pois.addAll(dbPois);
|
|
|
SplitAddress splitAddress1 = ShanghaiAddressSplitUtil.splitBestAddress(addr);
|
|
|
- addressResult = new TransfromDataTool().dbResultToResult(splitAddress1,addr, pois);
|
|
|
+ addressResult = new TransfromDataTool().dbResultToResult(splitAddress1, addr, pois);
|
|
|
addressResult.setAddrBean(addrBean);
|
|
|
if (addressResult != null && addressResult.getData() != null && addressResult.getData().size() > 0) {
|
|
|
getCjWgWgwByLoc(addressResult);
|
|
@@ -120,7 +115,7 @@ public class AddressQueryEngine {
|
|
|
addressResult.setAddrBean(addrBean);
|
|
|
return addressResult;
|
|
|
}
|
|
|
- }else {
|
|
|
+ } else {
|
|
|
if (splitAddress.getDistrict() != null && !splitAddress.getDistrict().isEmpty()) {
|
|
|
//查询无结果,尝试给出推荐结果
|
|
|
List<Address> recommendPois = AreaService.getInstance().getRecommendAddress(splitAddress);
|
|
@@ -128,7 +123,7 @@ public class AddressQueryEngine {
|
|
|
JSONArray pois = new JSONArray();
|
|
|
pois.addAll(recommendPois);
|
|
|
SplitAddress splitAddress1 = ShanghaiAddressSplitUtil.splitBestAddress(addr);
|
|
|
- addressResult = new TransfromDataTool().dbResultToResult(splitAddress1,addr, pois);
|
|
|
+ addressResult = new TransfromDataTool().dbResultToResult(splitAddress1, addr, pois);
|
|
|
addressResult.setAddrBean(addrBean);
|
|
|
if (addressResult != null && addressResult.getData() != null && addressResult.getData().size() > 0) {
|
|
|
getCjWgWgwByLoc(addressResult);
|
|
@@ -149,46 +144,12 @@ public class AddressQueryEngine {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if(addressResult != null){
|
|
|
+ if (addressResult != null) {
|
|
|
addressResult.setMessage("失败");
|
|
|
}
|
|
|
return addressResult;
|
|
|
}
|
|
|
|
|
|
- /***
|
|
|
- * 武大吉奥单条地名搜索
|
|
|
- * @param address
|
|
|
- */
|
|
|
- public AddressResult wdjaSearchByName(String address) {
|
|
|
- System.out.println("<<<<<<<<<<----------开始武大吉奥地名地址搜索------------>>>>>>>>>>>>>");
|
|
|
- if (wdToken == null || System.currentTimeMillis() - wdToken.getTime() > 36000000) {
|
|
|
- wdToken = AddressTools.getInstance().getWDToken(Constant.WD_USER_NAME, Constant.WD_USER_PWD);
|
|
|
- if (wdToken == null) {
|
|
|
- return null;
|
|
|
- }
|
|
|
- wdToken.setTime(System.currentTimeMillis());
|
|
|
- }
|
|
|
- if (wdToken == null)
|
|
|
- return AddressTools.getInstance().faildQuery(AddressResultEnum.NO_TOKEN, "token获取失败");
|
|
|
- String token = wdToken.getToken();
|
|
|
-
|
|
|
- String url = Constant.GET_ADDRESS_MEG_URL + "?token=" + token + "&addr=" + address;
|
|
|
- String body = null;
|
|
|
- try {
|
|
|
- body = AddressNetTools.getInstance().wdSendGetRequest(url);
|
|
|
- } catch (Exception e) {
|
|
|
- e.toString();
|
|
|
- }
|
|
|
- if (body == null || body.equals("null") || !StringUtils.hasText(body))
|
|
|
- return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_NULL, "搜索无结果");
|
|
|
- try {
|
|
|
- JSONObject json = JSONObject.parseObject(body);
|
|
|
- return TransfromDataTool.wdResultToResult(json);
|
|
|
- } catch (Exception e) {
|
|
|
- return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
public static Map<String, String> initSigns() {
|
|
|
Map<String, String> headerMap = new HashMap<>();
|
|
|
String timestamp = System.currentTimeMillis() + "";
|
|
@@ -278,24 +239,19 @@ public class AddressQueryEngine {
|
|
|
level--;
|
|
|
return sj_szxSearchByName(address, level);
|
|
|
}
|
|
|
- return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_NULL, "搜索无结果");
|
|
|
+ return new AddressResult(AddressResultEnum.RESULT_NULL, "搜索无结果");
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
- if (body.indexOf("[") != 0) {
|
|
|
- AddressResult addressResult = TransfromDataTool.szxResultToResult(JSONObject.parseObject(body), address);
|
|
|
- if (addressResult.getCode().equals(AddressResultEnum.RESULT_NULL) && level > 0) {
|
|
|
- level--;
|
|
|
- return sj_szxSearchByName(address, level);
|
|
|
- }
|
|
|
- return addressResult;
|
|
|
- } else {
|
|
|
-// 将得分最高的结果映射到实体类
|
|
|
- return TransfromDataTool.szxResultToResult2(com.skyversation.poiaddr.util.AddressTools.getInstance().findBestMatch(address, JSONArray.parseArray(body), "address"));
|
|
|
+ AddressResult addressResult = TransfromDataTool.szxResultToResult(JSONObject.parseObject(body), address);
|
|
|
+ if (addressResult.getCode().equals(AddressResultEnum.RESULT_NULL) && level > 0) {
|
|
|
+ level--;
|
|
|
+ return sj_szxSearchByName(address, level);
|
|
|
}
|
|
|
+ return addressResult;
|
|
|
} catch (Exception e) {
|
|
|
System.err.println("请求地址:" + address + ";返回结果:" + body + ";处理异常:" + e);
|
|
|
- return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");
|
|
|
+ return new AddressResult(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");
|
|
|
}
|
|
|
} else {
|
|
|
if (level > 0) {
|
|
@@ -307,82 +263,6 @@ public class AddressQueryEngine {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- /***
|
|
|
- * 高德普通地名搜索
|
|
|
- * @param address
|
|
|
- * @return
|
|
|
- */
|
|
|
- public AddressResult gdSearchByName(String address) {
|
|
|
- String geoUrl = Constant.AMAP_GEO_URL + "?key=" + Constant.AMAP_KEY + "&address=" + address + "&city=" + Constant.getAMAP_CITY_CODE() + "&output=JSON";
|
|
|
- ResponseEntity response = AddressNetTools.getInstance().requestGetOrPost(HttpMethod.GET, geoUrl, null, null, 0);
|
|
|
- if (response != null && response.getBody() != null) {
|
|
|
- String body = response.getBody() + "";
|
|
|
- if (!StringUtils.hasText(body))
|
|
|
- return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_NULL, "搜索无结果");
|
|
|
- try {
|
|
|
- JSONObject json = JSONObject.parseObject(body);
|
|
|
- return TransfromDataTool.gdResultToResult(json);
|
|
|
- } catch (Exception e) {
|
|
|
- System.err.println(e);
|
|
|
- return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");
|
|
|
- }
|
|
|
- } else {
|
|
|
- return null;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /***
|
|
|
- * 高德高级地名搜索
|
|
|
- * @param address
|
|
|
- * @return
|
|
|
- */
|
|
|
- public AddressResult gdV3SearchByName(String address) {
|
|
|
- String geoUrl =
|
|
|
- Constant.AMAP_SEARCH_NAME_V3 + "?key=" + Constant.AMAP_KEY + "&types=" + Constant.AMAP_SEARCH_TYPES +
|
|
|
- "&keywords=" + address + "&city=" + Constant.getAMAP_CITY_CODE() + "&offset=20";
|
|
|
- ResponseEntity responseEntity = AddressNetTools.getInstance().requestGetOrPost(HttpMethod.GET, geoUrl, null, null, 0);
|
|
|
- if (responseEntity.hasBody()) {
|
|
|
- String body = responseEntity.getBody() + "";
|
|
|
- if (!StringUtils.hasText(body)) {
|
|
|
- return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_NULL, "搜索无结果");
|
|
|
- }
|
|
|
- JSONArray pois = new JSONArray();
|
|
|
- JSONObject json = JSONObject.parseObject(body);
|
|
|
- if (json.containsKey("pois")) {
|
|
|
- pois.addAll(json.getJSONArray("pois"));
|
|
|
- }
|
|
|
- if (json.containsKey("count")) {
|
|
|
- int count = Integer.parseInt(json.get("count") + "");
|
|
|
- if (count > 20) {
|
|
|
- for (int i = 2; i < (count % 20 + 1); i++) {
|
|
|
- geoUrl =
|
|
|
- Constant.AMAP_SEARCH_NAME_V3 + "?key=" + Constant.AMAP_KEY + "&types=" + Constant.AMAP_SEARCH_TYPES +
|
|
|
- "&keywords=" + address + "&city=" + Constant.getAMAP_CITY_CODE() + "&offset=20&page=" + i;
|
|
|
- ResponseEntity responseEntity2 = AddressNetTools.getInstance().requestGetOrPost(HttpMethod.GET, geoUrl, null, null, 0);
|
|
|
- if (responseEntity2.hasBody()) {
|
|
|
- body = responseEntity2.getBody() + "";
|
|
|
- }
|
|
|
- if (!StringUtils.hasText(body)) {
|
|
|
- return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_AGAIN_NULL, "多次搜索无结果");
|
|
|
- }
|
|
|
- JSONObject json2 = JSONObject.parseObject(body);
|
|
|
- if (json2.containsKey(pois)) {
|
|
|
- pois.addAll(JSONObject.parseObject(body).getJSONArray("pois"));
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- try {
|
|
|
- return TransfromDataTool.gdV3ResultToResult(pois);
|
|
|
- } catch (Exception e) {
|
|
|
- System.err.println(e);
|
|
|
- return AddressTools.getInstance().faildQuery(AddressResultEnum.DATA_FROMAT_FAILD, "格式化失败");
|
|
|
- }
|
|
|
- } else {
|
|
|
- return AddressTools.getInstance().faildQuery(AddressResultEnum.RESULT_AGAIN_NULL, "高德V3分页查询无结果");
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
|
|
|
/***
|
|
|
* 根据搜索地址,赋值村居、网格、微格网信息
|
|
@@ -395,58 +275,60 @@ public class AddressQueryEngine {
|
|
|
} else {
|
|
|
AreaService areaService = AreaService.getInstance();
|
|
|
for (AddressResult.ContentBean content : result.getData()) {
|
|
|
- if ((content.getAdname() == null || content.getAdname().isEmpty() || content.getCityname() == null || content.getCityname().isEmpty() || content.getCommunity() == null || content.getCommunity().isEmpty()) && content.getLat() != null && content.getLon() != null) {
|
|
|
+ if (content.getLat() != null && content.getLon() != null) {
|
|
|
+ if ((content.getAdname() == null || content.getAdname().isEmpty() || content.getCityname() == null || content.getCityname().isEmpty() || content.getCommunity() == null || content.getCommunity().isEmpty())) {
|
|
|
// 判断是否存在行政区划数据
|
|
|
- if (content.getCityname() == null || content.getCityname().isEmpty()) {
|
|
|
- GeoJsonBean adBean = areaService.isInadPolygon(content.getLon(), content.getLat());
|
|
|
- if(adBean != null && adBean.getProperties() != null){
|
|
|
- content.setPname("上海市");
|
|
|
- content.setCityname(adBean.getProperties().getString("name"));
|
|
|
+ if (content.getCityname() == null || content.getCityname().isEmpty()) {
|
|
|
+ GeoJsonBean adBean = areaService.isInadPolygon(content.getLon(), content.getLat());
|
|
|
+ if (adBean != null && adBean.getProperties() != null) {
|
|
|
+ content.setPname("上海市");
|
|
|
+ content.setCityname(adBean.getProperties().getString("name"));
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
// 判断是否存在街镇数据
|
|
|
- if (content.getAdname() == null || content.getAdname().isEmpty()) {
|
|
|
- GeoJsonBean townBean = areaService.isInTownPolygon(content.getLon(), content.getLat());
|
|
|
- if(townBean != null && townBean.getProperties() != null){
|
|
|
- content.setPname("上海市");
|
|
|
- content.setAdnameCode(townBean.getProperties().getString("area_code"));
|
|
|
- content.setAdname(townBean.getProperties().getString("name"));
|
|
|
+ if (content.getAdname() == null || content.getAdname().isEmpty()) {
|
|
|
+ GeoJsonBean townBean = areaService.isInTownPolygon(content.getLon(), content.getLat());
|
|
|
+ if (townBean != null && townBean.getProperties() != null) {
|
|
|
+ content.setPname("上海市");
|
|
|
+ content.setAdnameCode(townBean.getProperties().getString("area_code"));
|
|
|
+ content.setAdname(townBean.getProperties().getString("name"));
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
// 判断是否存在村居数据
|
|
|
- if (content.getCommunity() == null || content.getCommunity().isEmpty()) {
|
|
|
- GeoJsonBean cjBean = areaService.isInResidentialCommitteePolygon(content.getLon(), content.getLat());
|
|
|
- if(cjBean != null && cjBean.getProperties() != null){
|
|
|
- content.setPname("上海市");
|
|
|
- content.setCityname(cjBean.getProperties().getString("所属区"));
|
|
|
- content.setAdname(cjBean.getProperties().getString("所属街"));
|
|
|
- content.setCommunityCode(cjBean.getProperties().getString("居委会"));
|
|
|
- content.setCommunity(cjBean.getProperties().getString("居委_1"));
|
|
|
+ if (content.getCommunity() == null || content.getCommunity().isEmpty()) {
|
|
|
+ GeoJsonBean cjBean = areaService.isInResidentialCommitteePolygon(content.getLon(), content.getLat());
|
|
|
+ if (cjBean != null && cjBean.getProperties() != null) {
|
|
|
+ content.setPname("上海市");
|
|
|
+ content.setCityname(cjBean.getProperties().getString("所属区"));
|
|
|
+ content.setAdname(cjBean.getProperties().getString("所属街"));
|
|
|
+ content.setCommunityCode(cjBean.getProperties().getString("居委会"));
|
|
|
+ content.setCommunity(cjBean.getProperties().getString("居委_1"));
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
- if (content.getLat() != null && content.getLon() != null) {
|
|
|
- if(!StringUtils.hasText(content.getWgName())){
|
|
|
+ if (!StringUtils.hasText(content.getWgName())) {
|
|
|
GeoJsonBean geoJsonBean = areaService.isInWGPolygon(content.getLon(), content.getLat());
|
|
|
- if(geoJsonBean != null && geoJsonBean.getProperties() != null){
|
|
|
+ if (geoJsonBean != null && geoJsonBean.getProperties() != null) {
|
|
|
content.setWgName(geoJsonBean.getProperties().getString("网格名称"));
|
|
|
content.setWgCode(geoJsonBean.getProperties().getString("网格编码"));
|
|
|
}
|
|
|
}
|
|
|
- if(!StringUtils.hasText(content.getWgwCode())){
|
|
|
+ if (!StringUtils.hasText(content.getWgwCode())) {
|
|
|
GeoJsonBean geoJsonBean = areaService.isInWGWPolygon(content.getLon(), content.getLat());
|
|
|
- if(geoJsonBean != null && geoJsonBean.getProperties() != null){
|
|
|
+ if (geoJsonBean != null && geoJsonBean.getProperties() != null) {
|
|
|
content.setWgwName(geoJsonBean.getProperties().getString("å¾®ç½\u0091_1"));
|
|
|
content.setWgwCode(geoJsonBean.getProperties().getString("å¾®ç½\u0091æ ¼"));
|
|
|
}
|
|
|
}
|
|
|
- if(!StringUtils.hasText(content.getZhwgName())){
|
|
|
+ if (!StringUtils.hasText(content.getZhwgName())) {
|
|
|
GeoJsonBean geoJsonBean = areaService.isInZHGWPolygon(content.getLon(), content.getLat());
|
|
|
- if(geoJsonBean != null && geoJsonBean.getProperties() != null){
|
|
|
+ if (geoJsonBean != null && geoJsonBean.getProperties() != null) {
|
|
|
content.setZhwgName(geoJsonBean.getProperties().getString("网格名称"));
|
|
|
content.setZhwgCode(geoJsonBean.getProperties().getString("网格编码"));
|
|
|
}
|
|
|
}
|
|
|
+ }else{
|
|
|
+ System.err.println("没有经纬度参数,不能根据经纬度落点补充街镇等信息!");
|
|
|
}
|
|
|
}
|
|
|
return result;
|
|
@@ -454,27 +336,26 @@ public class AddressQueryEngine {
|
|
|
}
|
|
|
|
|
|
|
|
|
-
|
|
|
- public AddressResult.ContentBean addContentWGWGrid(AddressResult.ContentBean content){
|
|
|
+ public AddressResult.ContentBean addContentWGWGrid(AddressResult.ContentBean content) {
|
|
|
AreaService areaService = AreaService.getInstance();
|
|
|
if (content != null && content.getLat() != null && content.getLon() != null) {
|
|
|
- if(!StringUtils.hasText(content.getWgName())){
|
|
|
+ if (!StringUtils.hasText(content.getWgName())) {
|
|
|
GeoJsonBean geoJsonBean = areaService.isInWGPolygon(content.getLon(), content.getLat());
|
|
|
- if(geoJsonBean != null && geoJsonBean.getProperties() != null){
|
|
|
+ if (geoJsonBean != null && geoJsonBean.getProperties() != null) {
|
|
|
content.setWgName(geoJsonBean.getProperties().getString("网格名称"));
|
|
|
content.setWgCode(geoJsonBean.getProperties().getString("网格编码"));
|
|
|
}
|
|
|
}
|
|
|
- if(!StringUtils.hasText(content.getWgwCode())){
|
|
|
+ if (!StringUtils.hasText(content.getWgwCode())) {
|
|
|
GeoJsonBean geoJsonBean = areaService.isInWGWPolygon(content.getLon(), content.getLat());
|
|
|
- if(geoJsonBean != null && geoJsonBean.getProperties() != null){
|
|
|
+ if (geoJsonBean != null && geoJsonBean.getProperties() != null) {
|
|
|
content.setWgwName(geoJsonBean.getProperties().getString("å¾®ç½\u0091_1"));
|
|
|
content.setWgwCode(geoJsonBean.getProperties().getString("å¾®ç½\u0091æ ¼"));
|
|
|
}
|
|
|
}
|
|
|
- if(!StringUtils.hasText(content.getZhwgName())){
|
|
|
+ if (!StringUtils.hasText(content.getZhwgName())) {
|
|
|
GeoJsonBean geoJsonBean = areaService.isInZHGWPolygon(content.getLon(), content.getLat());
|
|
|
- if(geoJsonBean != null && geoJsonBean.getProperties() != null){
|
|
|
+ if (geoJsonBean != null && geoJsonBean.getProperties() != null) {
|
|
|
content.setZhwgName(geoJsonBean.getProperties().getString("网格名称"));
|
|
|
content.setZhwgCode(geoJsonBean.getProperties().getString("网格编码"));
|
|
|
}
|