美文网首页我爱编程
地图距离排序二(Java篇)

地图距离排序二(Java篇)

作者: 耐撕鹏鹏 | 来源:发表于2018-05-13 23:05 被阅读48次

我们在 mongodb 篇中介绍了如何使用 mongodb 进行地图的距离排序和筛选,今天我们来介绍一下,用 Java 和 SpringData 来实现的时候,需要注意的一些知识点。

首先,我们需要为实体设置地图索引。在 SpringData 中,我们可以通过使用 @GeoSpatialIndexed 注解来设置索引。但是这个索引注解默认使用的是2d索引,我们希望使用 2dsphere 索引,因此我们需要将重新设置这个注解的 type(type= GeoSpatialIndexType.GEO_2DSPHERE)。姿势如下:

@Document(collection = "location")
public class Location {

    @Field(value = "lng")
    private double lng;

    @Field(value = "lat")
    private double lat;

    @Field(value = "location")
    @GeoSpatialIndexed(type = GeoSpatialIndexType.GEO_2DSPHERE)
    private double[] location;
}

在设置好索引之后,我们就可以愉快的开始距离的排序了,第一种方式默认按照由近到远排序。姿势如下:

public List<Location> getNearLocation(double lng, double lat) {
    Query query = new Query();
    Point point = new Point(lng, lat);
    Criteria locCri = Criteria.where("location").nearSphere(point);
    query.addCriteria(locCri);        
    return mongoAccess.find(query, Location.class);
}

除了上面这种方式,按照离我最近,还可以使用 Aggregate 来实现。姿势如下:

public List<Location> getNearLocation(double lng, double lat) {
    Point point = new Point(lng, lat);
    Sort disSort = new Sort(Sort.Direction.ASC, "distance");
    List<AggregationOperation> aggregationOperations = new ArrayList<>();
    aggregationOperations.add(Aggregation.geoNear(NearQuery.near(point).inKilometers().spherical(true), "distance"));
    aggregationOperations.add(Aggregation.sort(disSort));
    Aggregation aggregation = Aggregation.newAggregation(aggregationOperations);
    AggregationResults<Location> results = this.mongoAccess.aggregate(aggregation, Location.class, Location.class);
    return results.getMappedResults();
}

如果我们希望查询以某个点为中心的圆几公里以内的位置数据,那你的姿势可以如下:

public List<Location> getCircleLocation(double lng, double lat, double radius) {
    //获取半径内的所有位置
    Point point = new Point(lng, lat);
    Distance distance = new Distance(radius, Metrics.KILOMETERS);
    Circle circle = new Circle(point, distance);
    Criteria locCri = Criteria.where("location").withinSphere(circle);
    Query query = new Query();
    query.addCriteria(locCri);
    return mongoAccess.find(query, Location.class);
}

注:代码中的 mongoAccess 为 mongodb 的基本操作封装,大家替换为自己的实现即可。

相关文章

  • 地图距离排序二(Java篇)

    我们在 mongodb 篇中介绍了如何使用 mongodb 进行地图的距离排序和筛选,今天我们来介绍一下,用 Ja...

  • 地图距离排序一(mongodb篇)

    在使用外卖或团购 App 筛选商家时,我们经常会用到一个功能,叫作按照离我最近排序。在使用共享单车时,App 会自...

  • 面试知识点

    排序冒泡排序快速排序选择排序插入排序二路归并 查找二分查找 排序和查找的java实现 java语言Java字符串字...

  • 数据结构&算法(一)

    一、Java实现快速排序算法 二、Java实现折半插入排序算法 三、Java实现冒泡排序算法

  • 常见排序的java实现

    常见排序的java实现 常见排序java实现 插入排序(二分插入排序) 希尔排序 快速排序(三数中值快排) 冒泡排...

  • 排序

    八大排序算法 一、归并排序 递归及非递归的JAVA实现 二、快速排序 快排算法JAVA实现 三、堆排序 堆排序堆排...

  • java 实现排序算法之「插入排序」

    java 实现排序算法系列 这是 Java 实现排序算法的第三篇文章——插入排序算法。插入排序可以说成是「一类」简...

  • java实现冒泡排序、快速排序、二分查找算法

    用Java写一个冒泡排序。 用Java写一个二分查找。 用Java写一个快速排序。

  • Java实现各种常用的排序算法

    Java实现各种常用的排序算法,包括:冒泡排序、插入排序、二分排序、选择排序、希尔排序、堆排序、快速排序(两种写法...

  • Java比较器(对象排序)

    Java实现排序的方式 自然排序:java.lang.Comparable 定制排序:java.lang.Comp...

网友评论

    本文标题:地图距离排序二(Java篇)

    本文链接:https://www.haomeiwen.com/subject/osprdftx.html