mongodb-mongotemplate进行地理坐标操作
Posted bronk
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于mongodb-mongotemplate进行地理坐标操作的主要内容,如果未能解决你的问题,请参考以下文章