数据是存在es中的 坐标是存的俩个double 看一下请求:http://10.10.123.24:8080/app/json/station/getNearMore?latitude=38.82921632576175&longitude=116.88869758070442
返回数据:
{"status":0,"result":"success","info":"","data":[{"id":100064686,"posX":"116.92958300000000","posY":"38.82020580000000","stationCode":"UE05","stationName":"静海静涞加油站","distance":3684.8999999999996,"address":"静海县陈官屯东钓台村104国道","openingTime":"00:00","closingTime":"23:59","isAllDay":1,"services":[],"openState":1,"cardPay":1},{"id":100060666,"posX":"116.92821100000000","posY":"38.87600200000000","stationCode":"UE01","stationName":"静海东双塘加油站","distance":6233.7,"address":"天津市静海区东双塘乡东双塘村","openingTime":"00:00","closingTime":"23:59","isAllDay":1,"services":[],"openState":1,"cardPay":1},{"id":100065875,"posX":"116.87398420000000","posY":"38.88634810000000","stationCode":"UI01","stationName":"泰宇控股邓庄1站","distance":6486.5,"address":"京沪高速静海服务区东侧","openingTime":"00:00","closingTime":"23:59","isAllDay":1,"services":[],"openState":1,"cardPay":1},{"id":100058452,"posX":"116.87082260000000","posY":"38.88757740000000","stationCode":"UI02","stationName":"泰宇控股邓庄2站","distance":6678.9,"address":"京沪高速静海服务区西侧","openingTime":"00:00","closingTime":"23:59","isAllDay":1,"services":[],"openState":1,"cardPay":1},{"id":100060668,"posX":"116.93363900000000","posY":"38.75712900000000","stationCode":"UE03","stationName":"静海四通加油站","distance":8921.900000000001,"address":"天津市静海区陈官屯镇吕官屯村","openingTime":"00:00","closingTime":"23:59","isAllDay":1,"services":[],"openState":1,"cardPay":1}],"errorCode":"","page":"","totalPages":"","totalRecords":"","stackInfo":"","currentTime":"2022-04-12 11:08:37"}
求一个解决办法
就近取10个坐标就可以了,需要先罗列一下所有的坐标,然后查询最近的坐标
你可以把记录存到数据库后再查下。
思路:先算出该点周围的矩形的四个点,然后使用经纬度去直接匹配数据库中的记录。
private static List<String> findNeighDrugstore(double longitude,
double latitude, double distance) {
double minlat = 0;
double maxlat = 0;
double minlng = 0;
double maxlng = 0;
// 先计算查询点的经纬度范围
double r = 6371;// 地球半径千米
double dis = distance;// 距离(单位:千米)
double dlng = 2 * Math.asin(Math.sin(dis / (2 * r))
/ Math.cos(longitude * Math.PI / 180));
dlng = dlng * 180 / Math.PI;// 角度转为弧度
double dlat = dis / r;
dlat = dlat * 180 / Math.PI;
if (dlng < 0) {
minlng = longitude + dlng;
maxlng = longitude - dlng;
} else {
minlng = longitude - dlng;
maxlng = longitude + dlng;
}
if (dlat < 0) {
minlat = latitude + dlat;
maxlat = latitude - dlat;
} else {
minlat = latitude - dlat;
maxlat = latitude + dlat;
}
Lm_user lm_user = new Lm_user();
lm_user.setSelectedFields("uid");
List<String> ulist = new ArrayList<String>();
// 降序排序
lm_user.dec_upd("utype='1' AND addr_x BETWEEN " + minlng + " AND "
+ maxlng + " AND addr_y BETWEEN " + minlat + " AND " + maxlat
+ " ORDER BY weight DESC");
while (lm_user.fet_upd()) {
ulist.add(lm_user.get_uid());
}
return ulist;
}
试试把坐标列出来,然后求距离。
链接打不开、
先用这个单独坐标去跟每个坐标比对,得出距离
再按距离排序。
Es工具类,连接数据库
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class ElasticsearchJdbcUtils {
private static RestHighLevelClient client;
//192.168.177.11:9200/store
public static RestHighLevelClient getEsConnection(String url, String user,
String passwd){
String[] split = url.split("/");
String indexName = split[1];
String[] ipPort = split[0].split(":");
String ip = ipPort[0];
int port = Integer.parseInt(ipPort[1]);
client = new RestHighLevelClient(
RestClient.builder(
new HttpHost(ip, port, "http")));
return client;
}
public static void release(RestHighLevelClient conn) throws SQLException, IOException {
conn.close();
}
public static void release(RestHighLevelClient conn, PreparedStatement ps) throws SQLException, IOException {
ps.close();
conn.close();
}
public static void release(RestHighLevelClient conn, PreparedStatement ps,
java.sql.ResultSet rs) throws SQLException, IOException {
rs.close();
ps.close();
conn.close();
}
}
连接数据库,查询到数据,获取所有坐标数据,再使用这个坐标和其他坐标计算距离,计算出来的距离保存在Map中TreeMap中,键是坐标,值是距离,根据坐标获取距离差最小的10个点即可
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.rest.RestStatus;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import java.io.IOException;
import java.util.HashMap;
import java.util.TreeMap;
public class compareDistance {
//es数据库url,用户名和密码
private static String url = "";
private static String user = "";
private static String passwd = "";
public static void compare(SearchResponse searchResponse) throws IOException {
RestStatus status = searchResponse.status(); // ES请求状态
if (status != RestStatus.OK) {
System.out.println("未查询出结果");
return;
}
TimeValue took = searchResponse.getTook();
System.out.println("执行时间" + took);
//boolean timedOut = searchResponse.isTimedOut(); // 是否超时
// 获取hits,SearchHits对象包含搜索结果
SearchHits hits = searchResponse.getHits();
// 搜索结果总数
//long numHits = hits.getTotalHits();
// 遍历搜索结果
SearchHit[] searchHits = hits.getHits();
for (SearchHit hit : searchHits) {
hit.getId();
hit.getIndex();
hit.getType();
hit.getScore();
// 获取文档内容,json字符串格式
String sourceAsString = hit.getSourceAsString();
System.out.println(sourceAsString);
// 获取文档内容,Map对象格式
//Map<String, Object> sourceAsMap = hit.getSourceAsMap();
//比较距离,存放起来,坐标,距离,比较距离获取最近的10个点
TreeMap<HashMap<Double, Double>, Double> hashMapDoubleTreeMap = new TreeMap<HashMap<Double, Double>, Double>();
}
}
public static void main(String[] args) {
//获取es连接
RestHighLevelClient esConnection = ElasticsearchJdbcUtils.getEsConnection(url,user,passwd);
try {
// 索引名
String indexName = "blog";
// 构建查询语句
QueryBuilder queryBuilder = QueryBuilders.termQuery("title", "安");
// 构建 SearchSourceBuilder
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(queryBuilder); // 设置ES查询条件
sourceBuilder.from(0); // 设置分页参数
sourceBuilder.size(5);
//sourceBuilder.sort("title.keyword", SortOrder.DESC); // 排序
//sourceBuilder.aggregation(); // 聚合
System.out.println(sourceBuilder.toString());
// 构建 searchRequest
SearchRequest searchRequest = new SearchRequest();
searchRequest.source(sourceBuilder);
searchRequest.indices(indexName);
// 执行请求
SearchResponse searchResponse = esConnection.search(searchRequest);
// 遍历查询结果
compare(searchResponse);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (esConnection != null) {
ElasticsearchJdbcUtils.release();
}
}
}
}
pom.xml
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.3.2</version>
</dependency>
可以根据求解欧氏距离计算距离,可以参考
import java.util.Scanner;
public class test{
public static void main(String[] args){
int[][] arr=new int[2][2];
Scanner in=new Scanner(System.in);
for(int i=0;i<arr.length;i++){
for(int j=0;j<1;j++){
System.out.print("请输入第"+(j+1)+"个坐标的横坐标:");
arr[i][j]=in.nextInt();
System.out.print("请输入第"+(j+1)+"个坐标的纵坐标:");
if(j==0){
arr[i][j+1]=in.nextInt();
}
else{
arr[i][j]=in.nextInt();
}
}
}
distance(arr);
}
public static void distance(int[][] arr){
int i=0;
int j=0;
int x=arr[i][j]-arr[i+1][j];
int y=arr[i][j+1]-arr[i+1][j+1];
double distance=Math.sqrt(x*x+y*y);
System.out.println("坐标["+arr[i][j]+","+arr[i][j+1]+"]与坐标["+arr[i+1][j]+","+arr[i+1][j+1]+"]的距离为:"+distance);
}
}
这个地址访问不了啊,要计算的是直线距离吗,或者说你的意思是请求带的是经纬度坐标,根据经纬度坐标去找最近的10个点并排序?
内网ip给我们看啥?
建议你对数据重新格式化一下
先根据点计算距离,然后取最近的10个