Случайные географические координаты (на суше, избегая океана) - PullRequest
31 голосов
/ 02 февраля 2012

Какие-нибудь умные идеи о том, как генерировать случайные координаты (широта / долгота) мест на Земле? Широта Долгота. Точность до 5 баллов и избегать водоемов.

    double minLat = -90.00;
    double maxLat = 90.00;      
    double latitude = minLat + (double)(Math.random() * ((maxLat - minLat) + 1));
    double minLon = 0.00;
    double maxLon = 180.00;     
    double longitude = minLon + (double)(Math.random() * ((maxLon - minLon) + 1));
    DecimalFormat df = new DecimalFormat("#.#####");        
    log.info("latitude:longitude --> " + df.format(latitude) + "," + df.format(longitude));

Может быть, я живу в мире грез, и тема воды неизбежна ... но, надеюсь, есть более приятный, чистый и эффективный способ сделать это?

EDIT

Некоторые фантастические ответы / идеи - однако, в масштабе, скажем, мне нужно сгенерировать 25 000 координат. Переход к внешнему поставщику услуг может быть не лучшим вариантом из-за задержки, стоимости и нескольких других факторов.

Ответы [ 16 ]

0 голосов
/ 12 ноября 2017

Если предположить, что Атлантиды нет в базе данных, вы можете случайным образом выбирать города. Это также обеспечивает более реалистичное распределение баллов, если вы собираетесь имитировать деятельность человека: https://simplemaps.com/data/world-cities

В бесплатной версии всего 7300 городов.

0 голосов
/ 18 февраля 2012

Это чрезвычайно интересный вопрос, как с теоретической, так и с практической точки зрения.Наиболее подходящее решение будет во многом зависеть от ваших точных требований.Нужно ли учитывать каждый водоем или только основные моря и океаны?Насколько критичны точность и правильность;Будет ли идентификация моря как суши или наоборот катастрофической неудачей?

Я думаю, что методы машинного обучения были бы отличным решением этой проблемы, при условии, что вы не возражаете (вероятно, мала) вероятность того, что точкаводы неправильно классифицируется как земля.Если это не проблема, тогда этот подход должен иметь ряд преимуществ по сравнению с другими методами.

Использование растрового изображения - хорошее решение, простое и элегантное.Он может быть получен с заданной точностью, и классификация гарантированно будет правильной (или, по крайней мере, такой же правильной, как вы сделали растровое изображение).Но его практичность зависит от того, насколько точным должно быть решение.Вы упоминаете, что хотите, чтобы точность координат составляла 5 десятичных знаков (что было бы эквивалентно отображению всей поверхности планеты с точностью до ближайшего метра).При использовании 1 бита на элемент растровое изображение будет весить ~ 73,6 терабайта!

Хотя нам не нужно хранить все эти данные;Нам нужно только знать, где находятся береговые линии.Просто зная, где находится точка по отношению к побережью, мы можем определить, находится ли она на суше или на море.В качестве приблизительной оценки, Всемирный справочник ЦРУ сообщает, что на Земле имеется 22498 км береговой линии.Если бы мы сохраняли координаты для каждого метра береговой линии, используя 32-битное слово для каждой широты и долготы, для хранения потребовалось бы менее 1,35 ГБ.Это все еще много, если это для тривиального приложения, но на несколько порядков меньше, чем при использовании растрового изображения.Однако, если такая высокая степень точности не является необходимой, эти цифры могут значительно снизиться.Сокращение отображения только до ближайшего километра сделает растровое изображение всего ~ 75 ГБ, а координаты береговой линии мира могут поместиться на дискете.

Я предлагаю использовать алгоритм кластеризации, чтобы определить, является ли точкана земле или нет.Сначала нам потребуется достаточно большое количество координат, которые, как мы уже знаем, находятся либо на суше, либо на море.Существующие базы данных ГИС подойдут для этого.Затем мы можем проанализировать точки, чтобы определить скопления суши и моря.Граница принятия решения между кластерами должна проходить по береговой линии, и все точки, не определяющие границы решения, могут быть удалены.Этот процесс можно повторять, чтобы получить постепенно более точную границу.

Необходимо сохранять только точки, определяющие границу решения / береговую линию, и, используя простую метрику расстояния, мы можем быстро и легко решить, является ли наборкоординат на суше или на море.Для обучения системы потребуется большое количество ресурсов, но после завершения работы классификатора потребуется очень мало места или времени.

0 голосов
/ 18 февраля 2012

Должны ли случайные точки быть равномерно распределены по всему миру?Если бы вы могли согласиться на равномерное распределение на вид , вы можете сделать это:

Откройте ваш любимый картографический сервис, нарисуйте прямоугольник внутри Соединенных Штатов, России, Китая, Западной Европы и определенносеверная часть Африки - убедитесь, что внутри прямоугольников нет больших озер или каспийских морей.Возьмите угловые координаты каждого прямоугольника, а затем выберите случайные координаты внутри этих прямоугольников.

Вам гарантировано, что ни одна из этих точек не будет находиться на любом море или озере.Вы можете найти случайную реку, но я не уверен, сколько геосервисов будет достаточно точным для этого.

0 голосов
/ 17 февраля 2012

Генерировать легко, проблема в том, что их не должно быть на воде. Я хотел бы импортировать «Open Streetmap», например, здесь http://ftp.ecki -netz.de / osm / и импортировать его в базу данных (очень простая структура данных). Я бы предложил PostgreSQL, он поставляется с некоторыми гео-функциями http://www.postgresql.org/docs/8.2/static/functions-geometry.html. Для этого вам нужно сохранить точки в столбце «полигон», затем вы можете проверить с помощью оператора «&&», находится ли он в многоугольнике «Вода». Для атрибутов путевого входа OpenStreetmap вы должны взглянуть на http://wiki.openstreetmap.org/wiki/Category:En:Keys

0 голосов
/ 02 февраля 2012

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

Возможно, у поставщика услуг уже есть ответ на ваш вопрос: например, https://www.google.com/enterprise/marketplace/viewListing?productListingId=3030+17310026046429031496&pli=1

Высота API? http://code.google.com/apis/maps/documentation/elevation/ над уровнем моря или ниже? (нет голландских баллов для вас!)

0 голосов
/ 02 февраля 2012

Полагаю, вы могли бы использовать карту мира, определить несколько точек на ней, чтобы разграничить большинство водных объектов, как вы говорите, и использовать метод polygon.contains для проверки координат.

Более быстрый алгоритм будетчтобы использовать эту карту, возьмите какую-нибудь случайную точку и проверьте цвет внизу, если он синий, то вода ... когда у вас есть координаты, вы конвертируете их в широту / долготу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...