地图相关服务选择的是四维图新 本文记录的是,地图上任意多边形搜索,后端逻辑和SQL(后端),前端相关接口服务可看 MineMap for 2D
一、搜索效果
自定义选择多边形,搜索出范围内的数据
二、搜索处理逻辑
- 前端调用地图服务接口,获得多边形的点坐标数据,数据例如:[1 1,2 2,3 3,4 4,1 1]
- 后端获得范围坐标数据,同时取得范围坐标的2个极点(坐标最大最小,可先通过Double类型的经纬度大小判断,将搜索范围缩小),使用
Geometry 包含函数 ST_CONTAINS() ,获得符合函数坐标的数据 - 将搜索结果返给前端
三、SQL
假设点坐标 (103,35)、(104,36)为多边形点坐标极点,即所有符合要求范围内的数据,必定在极点之内
select m.name, ST_AsGeoJSON(m.geometry) as geometry
FROM mapdata m
WHERE jd < 104 and jd > 103 and wd < 36 and wd > 35
and ST_CONTAINS(ST_POLYGONFROMTEXT('POLYGON(103 35,104 35,104 36,103 36,103 35)'),m.geometry)
四、Java代码中部分工具类
String ssfwStr= net.sf.json.getJSONArray("搜索范围坐标,json格式");
List<List<Double>> maxPolygon = new getMaxPolygonDate().getMaxPolygonByJsonObject(ssfwStr);
public String polygonFormat(String ssfwStr) {
String str1 = StringUtils.substringBeforeLast(str, "]");
String str2 = StringUtils.substringAfter(str1, "[");
String str3 = "POLYGON" + str2.replace("[", "(").replace("]", ")");
String str4 = str3.replace(",", " ");
String polygonString = str4.replace(") (", ",");
return polygonString;
}
@Override
public cn.hutool.json.JSONObject mapCount(List<Mapdata> map) {
cn.hutool.json.JSONArray data = new cn.hutool.json.JSONArray();
HashMap<String, Integer> hashMap = new HashMap<>();
HashMap<String, String> hashMap2 = new HashMap<>();
HashMap<String, String> hashMap3 = new HashMap<>();
for (Mapdata m : map) {
Integer codeNames = hashMap.get(m.getCodename());
hashMap.put(m.getCodename(), codeNames == null ? 1 : codeNames + 1);
hashMap2.put(m.getCodename(), m.getIconCode());
hashMap3.put(m.getCodename(), m.getCode());
}
Set<String> codeNames = hashMap.keySet();
for (String codeName : codeNames) {
cn.hutool.json.JSONObject datas = new cn.hutool.json.JSONObject();
datas.putOpt("name", codeName);
datas.putOpt("icon", hashMap2.get(codeName));
datas.putOpt("code", hashMap3.get(codeName));
datas.putOpt("count", hashMap.get(codeName));
data.put(datas);
}
GeoJson geoJson = new GeoJson();
cn.hutool.json.JSONObject mapdata = geoJson.SplicingGeoJSON(map);
cn.hutool.json.JSONObject result = new cn.hutool.json.JSONObject();
result.putOpt("data", data);
result.putOpt("mapdata", mapdata);
return result;
}
|