GPS 좌표를 저장하고 NoSQL DBMS (예 : DynamoDB)의 반경에 위치를 저장하는 방법

StackOverflow https://stackoverflow.com//questions/10691547

문제

내 팀은 많은 양의 데이터, 주로 위치 및 좌표를 저장할 DynamoDB와 같은 DynamoDB와 같은 DBMS를 필요로합니다. 저는 점의 인덱스가있는 GIS 기반 DBMS (PostGIS와 같은)를 사용하는 것으로 간주했지만 DynamoDB는 우리의 사용에 좋습니다.

좌표를 저장하고 특정 반경에서 모든 객체를 빠르게 검색하는 가장 좋은 방법은 무엇입니까?

Postgis에서는 쉽습니다.

SELECT *
FROM places
WHERE ST_DWithin(coordinate, ST_GeomFromText('POINT(45.07085 7.68434)', 4326), 100.0);
.

NoSQL DBMS에서 그런 식을 어떻게 할 수 있습니까?

도움이 되었습니까?

해결책

우리는 동일한 문제가 있었고 특히 AWS와 DynamoDB를 사용하고 있습니다. 우리는 CloudSearch 서비스를 사용하여 해당 문제를 해결했습니다. 데이터베이스에 '지리적 검색 가능'데이터를 저장할 때마다 CloudSearch 인스턴스의 데이터가 Lin Lon을 필터로 표시합니다 (LAT에서 변환을 수행해야합니다. 그것을 uint로 바꾸려고).

특정 lat / lon 및 반경에 대한 검색을 원할 것을 원한다고 가정 해 봅시다. 해당 GeoBox (latmin, latmax, lonmin, lonmax)를 계산하고 특정 필터로 CloudSearch 인스턴스를 쿼리하여 키 스키마를 검색하십시오. 데이터를 쿼리하여 DynamoDB를 쿼리하여 정보를 얻을 수 있습니다.

Java의 일부 코드는 위의 작업을 수행합니다.

com.javadocmd.simplelatlng.window 패키지에서 tyler coles에 의해 직사각형 Windows를 사용하여 경계 상자를 계산하고 lat / lon의 변환을 수행합니다.

RectangularWindow rectangularWindow = new RectangularWindow(newLatLng(location.getLat().doubleValue(), location.getLon().doubleValue()), radius.doubleValue(), radius.doubleValue(), LengthUnit.KILOMETER);
latMin = (long) ((180 + rectangularWindow.getMinLatitude()) * 100000);     
latMax = (long) ((180 + rectangularWindow.getMaxLatitude()) * 100000);
lonMin = (long) ((360 + rectangularWindow.getLeftLongitude()) * 100000);
lonMax = (long) ((360 + rectangularWindow.getRightLongitude()) * 100000);
. 그런 다음 CloudSearch 인스턴스의 쿼리의 예 :

http : // [searchurl] / 2011-02-01 / Search? BQ= (및 LAT : 22300347..22309340 (LON : 28379282.28391589))

나는 그것이 가장 좋은 해결책이라고 확신하지 못합니다. 그러나 그것이 우리가 일어난 일입니다

다른 팁

지리적을 사용하여 계산보다는 문자열을 기반으로 인근 개체의 쿼리를 수행 할 수 있습니다.

지구의 위치는 노드의 위치를 "버킷"에 저장할 수있게 해주는 다음 문자열을 DynamoDB에서 범위 또는 해시 키로 사용하여 쿼리 할 수 있습니다.

좋은 예가 좋은 예입니다 https://github.com/davetroy/geohash-js 다른 언어로 쉽게 다시 작성할 수있는 JavaScript에서 수행되었습니다.

현재이 주제를 나 자신을 연구하고 있습니다.나는 MongoDB를 사용하고 있습니다 (나는 당신이 DynamoDB를 요구했지만, 당신은 또한 일반 NoSQL 사용을 요구합니다).이 코드는 다음과 같습니다.

기록 구조 :

public class FrameDocument
{
    [BsonId]
    public Guid Id { get; set; }

    [BsonElement("coordinates")]
    public Point[] Polygon { get; set; }
}

public class Point
{
    [BsonElement("name")]
    public string Orientation { get; set; }

    [BsonElement("loc")]
    public double[] Location { get; set; }
}
.

인덱스 연결 및 보장 :

MongoServer server = MongoServer.Create(connectionString);
MongoDatabase database = server.GetDatabase(databaseName);
database.GetCollection(collectionName).EnsureIndex(IndexKeys.GeoSpatial("coordinates.loc"));
.

쓰기 :

var items = database.GetCollection(collectionName);
items.InsertBatch(itemsToInsert);
.

검색 :

double[,] points; // define you search coordinates
var items = database.GetCollection<FrameDocument>(collectionName);
var query = Query.WithinPolygon("coordinates.loc", points);
var cursor = items.Find(query);
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top