mongodb-mongotemplate进行地理坐标操作

因为项目中使用的springboot + mongotemplate, 所以还是需要mongotemplate的操作方式

首先建立一个bean:

package com.iwhere.easy.travel.entity;

import java.io.Serializable;
import java.util.Arrays;

import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.PersistenceConstructor;
import org.springframework.data.mongodb.core.index.GeoSpatialIndexed;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;

/**
 * 收费poi
 *
 * @author wenbronk
 * @time 2017年7月19日 下午4:46:39
 */

@Document(collection = "charge_poi")
public class ChargePoi implements Serializable {
    private static final long serialVersionUID = 2653147280472201924L;

    @Id
    private String _id;

    @Indexed
    private String poi_id;
    private String poi_name;
    @GeoSpatialIndexed
    private Double[] location;
    private String media_url;
    private Double price;

    public ChargePoi() {
        super();
    }

    @PersistenceConstructor
    ChargePoi(String _id, String poi_id, String poi_name, Double[] location, String media_url, Double price) {
        super();
        this._id = _id;
        this.poi_id = poi_id;
        this.poi_name = poi_name;
        this.location = location;
        this.media_url = media_url;
        this.price = price;
    }

    public ChargePoi(String _id, String poi_id, String poi_name, Double x, Double y, String media_url, Double price) {
        super();
        this._id = _id;
        this.poi_id = poi_id;
        this.poi_name = poi_name;
        this.location = new Double[]{x, y};
        this.media_url = media_url;
        this.price = price;
    }

    public String get_id() {
        return _id;
    }

    public void set_id(String _id) {
        this._id = _id;
    }

    public String getPoi_id() {
        return poi_id;
    }

    public void setPoi_id(String poi_id) {
        this.poi_id = poi_id;
    }

    public String getPoi_name() {
        return poi_name;
    }

    public void setPoi_name(String poi_name) {
        this.poi_name = poi_name;
    }

    public Double[] getLocation() {
        return location;
    }

    public void setLocation(Double[] location) {
        this.location = location;
    }

    public String getMedia_url() {
        return media_url;
    }

    public void setMedia_url(String media_url) {
        this.media_url = media_url;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "ChargePoi [_id=" + _id + ", poi_id=" + poi_id + ", poi_name=" + poi_name + ", location="
                + Arrays.toString(location) + ", media_url=" + media_url + ", price=" + price + "]";
    }
}

注:

@GeoSpatialIndexed  注解的作用: 
Mark a field to be indexed using MongoDB‘s geospatial indexing feature.开始没有加这个注解, 然后计算距离的时候就会报错

1, 准备测试数据:

    /**
     * save
     */
    @Test
    public void test1() {
        for (int x = 100; x < 131; x++) {
            for (int y = 30; y < 61; y++) {
                Double loca[] = new Double[]{Double.valueOf(x), Double.valueOf(y)};
                ChargePoi chargePoi = new ChargePoi();
                chargePoi.setPoi_id("poiid" + x);
                chargePoi.setMedia_url("http://www.baidu.com?params=" + x);
                chargePoi.setPoi_name("vini" + Arrays.toString(loca));
                chargePoi.setPrice(Math.random() * 100);
                chargePoi.setLocation(loca);
                mongoTemplate.insert(chargePoi);
            }
        }
    }

2, 圆形查询

    /**
     * circle
     */
    @Test
    public void test2() {
        Circle circle = new Circle(30, 20, 20);
        List<ChargePoi> find = mongoTemplate.find(new Query(Criteria.where("location").within(circle)), ChargePoi.class);
        System.out.println(find);
        System.out.println(find.size());
    }

3, 球星查询

    /**
     * spherical
     */
    @Test
    public void test3() {
        Circle circle = new Circle(30,20, 20);
        List<ChargePoi> find = mongoTemplate.find(new Query(Criteria.where("location").withinSphere(circle)), ChargePoi.class);
        System.out.println(find.size());
        System.out.println(find);
    }

4, 矩形查询, box

    /**
     * box
     */
    @Test
    public void test4() {
        Box box = new Box(new Point(10, 11), new Point(10, 20));
        List<ChargePoi> find =
                mongoTemplate.find(new Query(Criteria.where("location").within(box)), ChargePoi.class);
        System.out.println(find.size());
        System.out.println(find);
    }

5, 按距离由近到元查询

    /**
     * near
     */
    @Test
    public void test5() {
        Point point = new Point(12, 12);
        List<ChargePoi> venues =
                mongoTemplate.find(new Query(Criteria.where("location").near(point).maxDistance(20)), ChargePoi.class);
        System.out.println(venues.size());
        System.out.println(venues);
    }

6, 空间距离查询

    /**
     * nearSphere
     */
    @Test
    public void test6() {
        Point point = new Point(12, 12);
        List<ChargePoi> venues =
                mongoTemplate.find(new Query(Criteria.where("location").nearSphere(point).maxDistance(20)), ChargePoi.class);
        System.out.println(venues.size());
        System.out.println(venues);
    }

7, 最近点查询

    @Test
    public void test7() {
        Point location = new Point(12, 12);
        NearQuery query = NearQuery.near(location).maxDistance(new Distance(100000, Metrics.KILOMETERS));
        GeoResults<ChargePoi> result = mongoTemplate.geoNear(query, ChargePoi.class);
        System.out.println(result);
    }

我是勤劳的搬运工:->http://docs.spring.io/spring-data/data-mongo/docs/1.5.2.RELEASE/reference/html/mongo.core.html#mongo.geospatial

				
时间: 2024-10-25 10:45:09

mongodb-mongotemplate进行地理坐标操作的相关文章

[Spring Data MongoDB]学习笔记--MongoTemplate插入修改操作

插入操作: 直接给个例子 import static org.springframework.data.mongodb.core.query.Criteria.where; import static org.springframework.data.mongodb.core.query.Criteria.query; … Person p = new Person("Bob", 33); mongoTemplate.insert(p);//还可以多加一个参数,来提供collectio

mongoDB与sql聚合操作对应图

SQL Terms, Functions, and Concepts MongoDB Aggregation Operators WHERE $match GROUP BY $group HAVING $match SELECT $project ORDER BY $sort LIMIT $limit SUM() $sum COUNT() $sum join No direct corresponding operator; however, the $unwindoperator allows

mysql数据库和mongodb数据库的相关操作以及两个数据库的区别

在docs命令中执行数据操作 MySQL数据库 先启动MySQL服务器  net start mysql 进入MySQL服务器MySQL -uroot -p(这里写你的数据库密码) (-P是从哪个端口进) 我第一次操作是就是因为电脑上 有 MySQL  MySQL57 MySQLla 三个服务 引起端口冲突 导致 我 找不到相应的数据 数据库操作 create database   创建数据库 show databases   显示MySQL服务上的数据库 use  数据库          使

MongoDB 运维常用操作

MongoDB 运维常用操作     分析方法:    1. 通过top.free.iostat.iftop等工具查看Linux服务器平均负载.CPU利用率.IO.内存.swap.网络流量等,先定位到压力源头. 2. 通过mongostat.mongotop等分析MongoDB读写压力.观察Page Faults.Connections.Queues等性能指标. 3. 日志中默认记录超过100ms的请求,过滤出Overflow查询,再使用Mtools跟踪分析MongoDB日志文件中的慢查询语句.

MongoDB与MySQL的操作对比表及区别介绍

MongoDB与MySQL的操作对比表及区别介绍 MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL的数据库.它们各有各的优点,关键是看用在什么地方.所以我们所熟知的那些SQL(全称Structured Query Language)语句就不适用于MongoDB了,因为SQL语句是关系型数据库的标准语言. 以我们公司项目为例,在早期的项目中,都在使用关系型数据库,用过SQLServer,Orac

Mongodb DB shell数据操作

shell命令操作语法和JavaScript很类似,其实控制台底层的查询语句都是用JavaScript脚本完成操作的. Ø 数据库 1.Help查看命令提示 help db.help(); db.yourColl.help(); db.youColl.find().help(); rs.help(); 2.切换/创建数据库 >use yourDB; 当创建一个集合(table)的时候会自动创建当前数据库 3.查询所有数据库 show dbs; 4.删除当前使用数据库 db.dropDatabas

php在mongodb中crud的操作

mongodb://[username:[email protected]]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]] mongodb:// 这是固定的格式,必须要指定. username:[email protected] 可选项,如果设置,在连接数据库服务器之后,驱动都会尝试登陆这个数据库 host1 必须的指定至少一个host, host1 是这个URI唯一要填写的.它指定了要连接服务器的

电商项目实战(架构七)——Mongodb实现文档操作

一.前言 对于频繁读写的功能,例如商品的浏览记录,Mongodb中的添加.删除.查询可以很好的解决.Mongodb是为快速开发互联网Web应用而构建的数据库系统,其数据模型和持久化策略就是为了构建高 读/写 吞吐量和高自动灾备伸缩性的系统. 二.Mongodb的安装和使用(windows系统下) 1.下载Mongodb安装包,下载地址:https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl-3.2.21-signed.

MongoDB 摆好正确操作数据库的姿势

上篇文章讲了如何安装MongoDB以及碰到的一些问题. 这次,讲一下MongoDB的一些常规操作. 设置可远程连接 服务开启后,查看设置的bind_ip是否可远程 总所周知,linux运维对端口信息的查看都是使用netstat netstat -nltp local:访问端口的方式,0.0.0.0是对外开放端口;127.0.0.1说明只对本机访问,外面访问不了 Address:端口 Foreign Address:对外开放,一般都是0.0.0.0:* Program name:此端口是使用的程序

MongoDB学习笔记(数据操作)

1.  批量插入:     以数组的方式一次插入多个文档可以在单次TCP请求中完成,避免了多次请求中的额外开销.就数据传输量而言,批量插入的数据中仅包含一份消息头,而多次单条插入则会在每次插入数据时封装消息头数据.对于数据导入而言,我们可以使用mongoimport完成. 2.  数据库清除:    > db.users.remove()     以上命令将会清除users集合中的所有数据,但是不会删除集合本身以及关联的索引.数据删除操作是不可恢复的,一旦删除就物理的删除了.对于全集合清除这种c