Определение уровня масштабирования от одного LatLong в Google Maps API - PullRequest
6 голосов
/ 23 ноября 2008

У меня проблемы с API Карт Google; Я хочу определить LatLong для определенного места (например, по названию города), а затем сфокусировать на нем свою карту. Часть LatLong работает, и поэтому центрирует карту в этой точке. Однако я не могу понять, как определить, каким может быть хороший уровень масштабирования, когда у меня есть только эта единственная точка. Я не могу просто перейти на какой-нибудь стандартный уровень масштабирования, который может выглядеть хорошо в большинстве случаев, потому что, например, когда пользователь вводит «Россия» вместо «Амстердам»? Была бы признательна за помощь:)

Ответы [ 7 ]

2 голосов
/ 28 мая 2009

Я только что задал этот вопрос в Google IO. Эта функция существует, но недокументирована и еще не имеет доступа к ней. То, что вы хотите сделать, это получить структурированный адрес . Проверьте структуру json, которую вы вернули, и найдите эти новые параметры. Я опубликую больше информации, когда у меня будет возможность попробовать это.

1 голос
/ 11 августа 2009

У меня был тот же вопрос, и ответ Ника Реталлака мне помог. Чтобы предоставить более подробную информацию, имя недокументированного свойства называется «ExtendedData», и внутри него имеется «LatLonBox», который содержит северную, южную, восточную и западную границы соответствующего уровня масштабирования.

Например, если вы выполняете поиск по «90210», вот вывод (который я отформатировал для удобства чтения):

{
    "id":"p1",
    "address":"Beverly Hills, CA 90210, USA",
    "AddressDetails":{
        "Accuracy":5,
        "Country":{
            "AdministrativeArea":{
                "AdministrativeAreaName":"CA",
                "SubAdministrativeArea":{
                    "Locality":{
                        "LocalityName":"Beverly Hills",
                        "PostalCode":{"PostalCodeNumber":"90210"}
                    },
                    "SubAdministrativeAreaName":"Los Angeles"
                }
            },
            "CountryName":"USA",
            "CountryNameCode":"US"
        }
    },
     // This is what you're looking for
     "ExtendedData":{
         "LatLonBox":{
             "north":34.13919,
             "south":34.067018, 
             "east":-118.38971, 
             "west":-118.442796
         }
     },
    "Point":{
        "coordinates":[-118.4104684,34.1030032,0]
    }
}

Это недокументировано, так что я не уверен, что оно переживет изменения API. Лучше не предполагать, что это будет всегда, и определить разумное значение увеличения по умолчанию.

1 голос
/ 22 апреля 2009

Следующий вызов даст вам уровень масштабирования, если вы можете предоставить ему соответствующий объект прямоугольных границ:

GMap2.getBoundsZoomLevel(bounds)

а как рассчитать границы?

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

В идеале вам нужны данные, и, к счастью, в DBPedia есть много данных.

Моя геометрия и алгебра немного ржавые, но с некоторыми из них я уверен, что вы можете вычислить прямоугольник, учитывая область местоположения, которое вы хотите просмотреть. (Может начинаться с квадратного корня, если предполагается квадратный город, или переставить πr 2 , если предположить круговой)

Попробуйте этот запрос, чтобы извлечь области регионов.

PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dbpedia2: <http://dbpedia.org/property/>
SELECT ?url, ?label, ?lat, ?long, ?area WHERE {
   ?url geo:lat ?lat .
   ?url geo:lat ?long .
   ?url rdfs:label ?label . FILTER ( lang(?label) = 'en' ) .
   ?url dbpedia2:area ?area . FILTER ( datatype(?area) = xsd:double ) 
} LIMIT 10

Вам нужно будет кэшировать результаты или загружать их в более быстрый, более локальный источник данных, так как DBPedia ищет миллионы троек неструктурированных данных (в том числе данных RDF). Вы можете загрузить наборы данных Titles, Infobox и координат из DBPedia и загрузить их, например, в. Jena. Не забудьте отключить все параметры проверки во время загрузки: -)

Вы также можете получить доступ к этим данным, используя RESTful API , который имеет достаточно удобную веб-форму и позволяет получить URL-адрес, который генерируется с помощью «Копировать кнопку ссылки для загрузки» в окне загрузок Firefox или настройки формат вывода в HTML. Он также генерирует XML и JSON .

Не забудьте добавить поля для городов шаткой формы ...

1 голос
/ 23 ноября 2008

В вашем вопросе отсутствует входной параметр. Вы говорите LatLon point, но на самом деле вам нужен LatLonBounds, чтобы выполнить фокусировку для доступного размера окна карты. Я предполагаю, что вы хотите имитировать официальное поведение карты Google. Помимо геокодирования они полагаются на другие данные, к которым у Gmap API нет доступа. Таким образом, вы должны предоставить свой собственный.

0 голосов
/ 14 июня 2017

У меня была та же проблема здесь , но с более новой версией API. Новое решение - map.fitBounds(autocomplete.getPlace().geometry.viewport);.

0 голосов
/ 05 ноября 2010

Я реализовал версию решения Ника Реталлака в Objective-C здесь.

Эквивалентный код Objective C для Google Maps GMap2.getBoundsZoomLevel (в границах)?

0 голосов
/ 03 августа 2009

Получаете ли вы баллы от Geocoder? Если это так, вы можете получить точность точки и основать свой масштаб на этом (более высокая точность = более высокий масштаб).

...