GPS положение в часовой пояс - PullRequest
10 голосов
/ 30 ноября 2011

Я хотел бы знать местное время, когда мой пользователь отправляет свой запрос.По сути, есть ли такая функция как эта

var localTime = getLocalTime( lat, long );

Я не уверен, что сработает простое деление на лат, поскольку в большинстве стран нет идеальных геометрических фигур.1004 *

Любая помощь будет отличной.Любой язык принят.Я хотел бы избежать вызова удаленных API.

Ответы [ 5 ]

4 голосов
/ 10 декабря 2013

API часовых поясов Google - это то, что вам нужно.Однако он не имеет уровня бесплатного пользования .

API часовых поясов предоставляет данные о смещении времени для местоположений на поверхности земли.Запрос информации о часовом поясе для конкретной пары широта / долгота вернет название этого часового пояса, смещение времени от UTC и смещение летнего времени.

3 голосов
/ 25 мая 2015

Шейп-файл, используемый для вычисления часового пояса, не поддерживается больше.

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

https://github.com/cstich/gpstotz

Редактировать:

Как уже упоминалось в комментариях, я также должен опубликовать код. Код основан на шейп-файле часовых поясов Эрика Мюллера, который вы можете получить здесь - http://efele.net/maps/tz/world/.

Редактировать 2:

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

from rtree import index  # requires libspatialindex-c3.deb
from shapely.geometry import Polygon
from shapely.geometry import Point

import os
import fiona

''' Read the world timezone shapefile '''
tzshpFN = os.path.join(os.path.dirname(__file__),
                   'resources/world/tz_world.shp')

''' Build the geo-index '''
idx = index.Index()
with fiona.open(tzshpFN) as shapes:
    for i, shape in enumerate(shapes):
        assert shape['geometry']['type'] == 'Polygon'
        exterior = shape['geometry']['coordinates'][0]
        interior = shape['geometry']['coordinates'][1:]
        record = shape['properties']['TZID']
        poly = Polygon(exterior, interior)
        idx.insert(i, poly.bounds, obj=(i, record, poly))


def gpsToTimezone(lat, lon):
    '''
    For a pair of lat, lon coordiantes returns the appropriate timezone info.
    If a point is on a timezone boundary, then this point is not within the
    timezone as it is on the boundary. Does not deal with maritime points.
    For a discussion of those see here:
    http://efele.net/maps/tz/world/
    @lat: latitude
    @lon: longitude
    @return: Timezone info string
    '''
    query = [n.object for n in idx.intersection((lon, lat, lon, lat),
                                                objects=True)]
    queryPoint = Point(lon, lat)
    result = [q[1] for q in query
              if q[2].contains(queryPoint)]

    if len(result) > 0:
        return result[0]
    else:
        return None

if __name__ == "__main__":
    ''' Tests '''
    assert gpsToTimezone(0, 0) is None  # In the ocean somewhere
    assert gpsToTimezone(51.50, 0.12) == 'Europe/London'
2 голосов
/ 30 ноября 2011

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

Единственное, что я нашел, описано здесь: Определение часового пояса по широте / долготе без использования веб-сервисов, таких как Geonames.org .По сути, вам нужна база данных с информацией о часовых поясах, и вы пытаетесь определить, какая из них ближе всего к вашим интересам.

Однако я искал статические решения (без использования Интернета), так что если вы можете использоватьИнтернет-соединение, которое вы можете использовать: http://www.earthtools.org/webservices.htm, которое предоставляет веб-сервис для предоставления вам часового пояса с указанием координат широты и долготы.

0 голосов
/ 30 апреля 2019

Начиная с 2019 года Google API не имеет бесплатного уровня, и источник данных ответа @cstich больше не поддерживается.

Если вам нужен API, timezonedb.com предлагает бесплатную скорость на уровне, ограниченную 1 запросом в секунду.

Первоначальный сопровождающий данных, используемый @cstich ссылкой на этого проекта , который получает данные из OpenStreetMap. В файле readme содержится ссылка для поиска библиотек на разных языках.

0 голосов
/ 30 ноября 2011

Не могли бы вы просто использовать IP-адрес пользователя, чтобы определить, в котором он живет?А затем вы используете массив (Страны | Разница с GMT), чтобы получить местное время.

...