根据坐标 去查询附近的10个点由近到远?

数据是存在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个