Как хранить GPS координаты и места поиска в радиусе от DBMS NoSQL (например, Dynamodb)

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

Вопрос

Моя команда нуждается в СУБД, как Dynamodb, чтобы хранить большое количество данных, главным образом мест и координаты. Я подумал использовать несколько СУБД на основе GIS (например, 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, каждый раз, когда мы храним некоторые данные «геосистемы» в нашей базе данных, мы индексируем данные в экземпляре облака с помощью LAT, LON в качестве фильтров (чтобы сделать это, вы должны сделать преобразование на лат и Лон, чтобы превратить его в UINT).

Тогда давайте скажем, вы хотите сделать поиск на определенной Lat / Lon и RADIUS, вы вычисляете соответствующую Geobox (Latmin, Latmax, Lonmin, Lonmax) и запрашивать свой экземпляр облака с помощью определенных фильтров для получения ключа схема вашего Данные, вы можете затем запрашивать dynamodb, чтобы получить информацию.

Какой-то код в Java сделать только выше:

Использование прямоугольныхwindows из пакета com.javadocmd.simplelatlng.window с помощью tyler coles, вычисляя ограничивающую коробку и выполнение преобразования для 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);
.

Тогда пример запроса на облачный экземпляр обладания:

http:// [searchurl] / 2011-02-01 / поиск? bq= (и lat: 22300347..2309340 (и lon: 28379282..28391589))

Я не уверен, что это лучшее решение, но это то, что мы придумали

Другие советы

Вы можете использовать Geohashing, чтобы сделать запросы ближайших объектов на основе строк, а не расчетов.

Geohash позволит вам хранить местоположение узлов в «ведра», которые затем могут быть запрошены с помощью строк в качестве диапазона или хеш-ключа в DynociOdb.

Вот хороший пример 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