Как определить вершины для многоугольника, внешний край которого является заданным расстоянием от линии или области в javascript на картах Google? - PullRequest
0 голосов
/ 11 февраля 2012

У меня есть упражнение по решению проблем для тех, кто любит такие вещи.Я работаю над картографическим приложением, которое использует Google Maps.Пользователь сначала вводит серию координат и «радиус».Затем пользователь запрашивает линию или область.Сюжеты размещаются на Картах Google с использованием полигонов.Другими словами, учитывая синюю линию (или область), определенную синими точками и расстоянием, вычислите красные точки и нарисуйте красный многоугольник, где ребра находятся на заданном расстоянии от предоставленных пользователем ребер:

линия http://i39.tinypic.com/34h8cus.jpg площадь http://i40.tinypic.com/11git15.jpg

Мне удалось заставить это работать в "большинстве" ситуаций путем вычисления подшипников прямого и обратного хода, а затем нахождения точек с подшипником на 90 градусов относительно этихв соответствующем направлении.Для дуг я только что рассчитал точки расположения вдоль этой дуги с интервалами в 5 градусов.В случае внутренней части острого угла я определяю, где две линии пересекаются, и использую эту точку, но иногда это с треском проваливается, когда расстояние в поперечном направлении в этой точке превышает предоставленный радиус.

Надеюсь, кто-нибудь знает более легкий путь?Может быть, тот, который работает все время, независимо от отношения кросс-трека к радиусу расстояния?Или, может быть, библиотека для этого уже существует?

Я надеюсь, что то, что я пытаюсь сделать, имеет смысл ... Трудно выразить словами.Возможно, если бы у меня были слова, поиск был бы полезен даже.

Ответы [ 2 ]

0 голосов
/ 02 марта 2012

Ну, ответ оказался проще, чем я думал. Это вернуло меня к уроку, который я преподавал во время CompSci 101 почти 15 лет назад:

"Использовать существующие библиотеки, когда это возможно."

Как только я обнаружил (через поиск в Google), что то, что я ищу, не называется «смещением» или «масштабом», а фактически называется «буфером» в ГИС-вычислениях, это было просто. Есть несколько замечательных библиотек, таких как Clipper by Angus Johnson , которые могут это сделать, но я хотел что-то специфичное для JavaScript.

Это привело меня к ArcGIS GeometryService. У них даже есть Google Maps версия , но это только API v2. К счастью, есть официальная неподдерживаемая версия, которую я нашел на форумах arcGIS, которая работает с GMaps API v3.

Итак, мое решение состояло в том, чтобы использовать это, называемое arcgislink , и его буферная функция прекрасно работает с точками Google Maps LatLng, полигонами / полилиниями Google Maps и любыми стандартными типами arcGIS. Всем, кому нужно сделать это с помощью Google Maps, я настоятельно рекомендую просмотреть их библиотеки.

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

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

Существует решение, которое является довольно неэффективным, но безопасным: предположим, что у вас есть общий алгоритм объединения многоугольников (например, http://gvu.gatech.edu/~jarek/graphics/papers/04PolygonBooleansMargalit.pdf);, вы будете добавлять раздутые версии каждого ребра одну за другой (каждый раз, когда прямоугольник и две половины диски, аппроксимированные полигонами) вместе с оригинальным полигоном для замкнутых форм.

Ради эффективности вы можете разработать алгоритм «линии разметки», который работает, разрезая плоскость с горизонтальными линиями в каждой «точке события», то есть конечных точках сегмента / дуги и вершинах дуги, чтобы конфигурация в каждом срезе была проще. Вы понимаете, о чем я?

Кстати, что вы называете "расстоянием между треками"?

...