mongotemplate范围查询_mongodb地理坐标范围查询

本文介绍了如何使用MongoTemplate进行地理坐标范围查询,包括线(LineString)和面(Polygon)类型的查询,并展示了Java代码示例,演示了如何根据GeoJsonPolygon查询MongoDB中的数据。
摘要由CSDN通过智能技术生成

参考地址

线  LineString

{

"type": "LineString",

"coordinates": [ [1, 1],[2,1], [3,1]]

}

{

"type": "LineString",

"coordinates": [ [1, 1],[2,2], [3,3]]

}

{

"type": "LineString",

"coordinates": [ [1, 2],[2,3], [3,4]]

}

查询相交的线

db.geolocation.find({

"loc":{"$geoIntersects":{"$geometry":{

"type":"LineString",

"coordinates":[[1,2],[2,3],[3,4]]

}}}

})

面 Polygon

db.polygonCol.insert({

"name":"chengdu",

"loc":{

"type":"Polygon",

"coordinates":[[[1,2],[2,3],[3,2],[1,2]]]

}

})

db.polygonCol.insert({

"name":"shenzhen",

"loc":{

"type":"Polygon",

"coordinates":[[[4,2],[4,4],[5,4],[5,2]]]

}

})

查询有相交的数据

db.polygonCol.find({

"loc":{"$geoIntersects":{"$geometry":{

"type":"Polygon",

"coordinates":[[[1,2],[1,4],[2,4],[2,1],[1,2]]]

}}}

})

上面的查询语句只返回了name=shenzhen的数据

db.polygonCol.find({

"loc":{"$geoIntersects":{"$geometry":{

"type":"Polygon",

"coordinates":[[[2,2],[2,4],[5,1],[2,2]]]

}}}

})

返回两条数据

用java代码查询

import com.alibaba.fastjson.JSONObject;

import org.springframework.data.geo.Point;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.mongodb.core.MongoTemplate;

import org.springframework.data.mongodb.core.geo.GeoJsonPolygon;

import org.springframework.data.mongodb.core.query.Criteria;

import org.springframework.data.mongodb.core.query.Query;

import org.springframework.stereotype.Service;

import java.util.ArrayList;

import java.util.List;

@Service

public class GEOTestService {

@Autowired

MongoTemplate mongoTemplate;

public List find(String jsonObject){

Query query = new Query();

GEOPolygon geoPolygon = JSONObject.parseObject(jsonObject, GEOPolygon.class);

List points = new ArrayList<>();

List>> coordinates = geoPolygon.getCoordinates();

List> coordinate = coordinates.get(0);

for (List doubles : coordinate) {

Point point = new Point(doubles.get(0), doubles.get(1));

points.add(point);

}

GeoJsonPolygon geoJsonPolygon = new GeoJsonPolygon(points);

query.addCriteria(Criteria.where("loc").intersects(geoJsonPolygon));

List list = mongoTemplate.find(query, JSONObject.class, "polygonCol");

return list;

}

}

@Data

public class GEOPolygon {

String type;

List>> coordinates;

}

查询参数:

{     "type":"Polygon",     "coordinates":[[[2,2],[2,4],[5,1],[2,2]]] }

原文:https://www.cnblogs.com/james-roger/p/13207746.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值