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>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 ";
}
}
注:
@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, 最近点查询
@Testpublic 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
页:
[1]