Кругосветное путешествие в Google Static Maps - PullRequest
2 голосов
/ 11 июля 2011

Я создаю Статические Карты Google с путем между маркерами и столкнулся с определенными комбинациями координат, которые нарушают путь.

В этом примере разрывы пути (маркеры @ Beijing, SF, NY, Azores, Rome):

http://maps.google.com/maps/api/staticmap?path=color:0xff0000cc|weight:3|39.904214,116.407413|37.77493,-122.419416|40.714353,-74.005973|38.721642,-27.220577|41.89052,12.494249&markers=39.904214,116.407413|37.77493,-122.419416|40.714353,-74.005973|38.721642,-27.220577|41.89052,12.494249&maptype=terrain&sensor=false&size=640x404

И работает в этом примере (маркер @ Рим удален)

http://maps.google.com/maps/api/staticmap?path=color:0xff0000cc|weight:3|39.904214,116.407413|37.77493,-122.419416|40.714353,-74.005973|38.721642,-27.220577&markers=39.904214,116.407413|37.77493,-122.419416|40.714353,-74.005973|38.721642,-27.220577&maptype=terrain&sensor=false&size=640x404

Причина не в том, чтобы пересечь Гринвичский меридиан, как я изначально думал. Это прерывается, даже если я добавлю маркер до этого, по-видимому, любую точку к востоку от автоматически вычисляемой центральной точки карты ... но только тогда, когда путь начинается с другой стороны от -180 долготы.

Чтобы доказать это, вы можете видеть, что путь Пекин, SF, Нью-Йорк, Азорские острова, Рим отображается правильно, когда я установил центральную точку карты на -170,35

http://maps.google.com/maps/api/staticmap?path=color:0xff0000cc|weight:3|39.904214,116.407413|37.77493,-122.419416|40.714353,-74.005973|38.721642,-27.220577|41.89052,12.494249&markers=39.904214,116.407413|37.77493,-122.419416|40.714353,-74.005973|38.721642,-27.220577|41.89052,12.494249&maptype=terrain&sensor=false&size=640x404&center=-170,35

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

Есть идеи?

1 Ответ

0 голосов
/ 14 апреля 2014

Во-первых: вы можете вычислить центр, даже если вы не знаете набор точек (местоположений) во время компиляции: во время выполнения вы знаете все точки (в противном случае было бы невозможно вставить координаты в URL)Поэтому вы можете легко перебрать все точки и вычислить центр.Вы можете вычислить среднее значение по всем координатам и получить геометрический центр (также называемый центроидом): это более простой способ.Другой способ сделать это - проверить наиболее удаленную пару местоположений (как для широты, так и для долготы), а затем установить среднюю точку как центр: для этого требуется немного больше кодирования (например, для вычисления расстояния по долготе, которое необходимо принять во вниманиеВы должны вычислить расстояние в двух направлениях, так как это возможно для обхода «вокруг света», и оно имеет более высокую сложность.

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

Аспект, который тривиален, но важно иметь в виду: статическая карта Google всегда рисует путь между двумя точками, рассматривая кратчайший путь, т.е. рисуя самую короткую прямую линию.

Поэтому, еслиВы находитесь в ситуации, когда ваш путь должен идти отот местоположения A до местоположения B, и кратчайший путь между A и B идет «вокруг света» (или, лучше, он проходит с одной стороны изображения), затем этот путь отображается как «borken», как на картах, которые вы показали,На практике A и B находятся рядом с левым и правым полями карты, и карта не может быть центрирована в некоторой точке вдоль кратчайшего пути между A и B из-за других точек пути.И это то, что происходит, когда вы удаляете «Рим»: без Рима карта может быть центрирована таким образом, чтобы путь не проходил.

Формально, я думаю, что проблема возникает (то есть путь нарушен), когда проекция пути на экваторе длиннее 360 градусов долготы, и путь всегда идет в одном и том же направлении (т.е. всегда с запада на восток или всегда с востока на запад).

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

  • вы не можете бесконечно уменьшать масштаб;

  • , если вы хотите также вставить маркеры в карту, они будутбыть нарисованным только на «главной» карте;

  • потенциально у вас может быть путь, который идет вокруг света (проходящий последовательно из Америки, Европы, Азии и Америки снова и т. д.)) много раз, и было бы действительно ужасно иметь так много маленьких карт друг за другом;

Я много гуглил об этой проблеме, и я не нашел никакого решения, естьошибка открыта на трекере ошибок, но она не решена.

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

Итак, я нашел первый обходной путь:

  • вы рисуете свой путьи с тем же стилем (цвет линии и т. д.)Вы также рисуете путь в обратном порядке (статическая карта Google позволяет рисовать несколько путей на одной карте), то есть путь = A | B | C & path = C | B | A, и это решит проблему во многих ситуациях (т.е.путь выходит с одной стороны изображения и входит с другой).К сожалению, это не всегда работает: если у вас есть путь, который пересекает поле изображения два раза подряд, то вы теряете часть своего пути

Чтобы решить эту проблему, я нашел второй обходной путь:- не рисовать просто путь и его обратный путь, а рисовать отдельный путь для каждой пары местоположений пути (и наоборот), то есть для пути A-> B-> C затем: path: A | B, path = B| C, путь = C | B, путь = B | A, и это работает всегда

Недостатком является то, что таким образом URL становится очень длинным и легко достигается ограничение в 2048 символов для URL.

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

...