Позиция GPS для часового пояса
Я хотел бы узнать местное время, когда мой пользователь отправляет свой запрос.
В принципе, есть такая вещь, как функция, подобная этой
var localTime = getLocalTime( lat, long );
Я не уверен, может ли простое разделение на лат работать, поскольку большинство стран не имеют идеальных геометрических форм.
Любая помощь будет отличной. Любой язык принимается. Я хотел бы избежать вызова удаленных API.
Ответы
Ответ 1
Похоже, вам нужен API часового пояса Google. Это, однако, не имеет никакого свободного уровня.
API часового пояса предоставляет данные о смещении времени для местоположений на поверхности земли. Запрос информации о часовом поясе для конкретной пары широта/долгота вернет имя этого часового пояса, смещение времени от UTC и смещение летнего времени.
Ответ 2
Шейп файл, используемый для вычисления часового пояса, больше не поддерживается.
Я только что столкнулся с той же проблемой сегодня, и я не уверен, насколько уместен мой ответ после всего этого времени, но я просто написал функцию 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'
Ответ 3
Я искал то же самое пару дней назад, и, к сожалению, я не смог найти API или простую функцию, которая это делает. Причина в том, что вы сказали, что страны не имеют идеальных геометрических форм. Вы должны создать представление области каждого часового пояса и посмотреть, где находится ваша точка. Я думаю, что это будет боль, и я понятия не имею, можно ли вообще это сделать.
Описан только один из них: Определить часовой пояс с широты/долготы без использования веб-сервисов, таких как Geonames.org. В основном вам нужна база данных с информацией о часовых поясах, и вы пытаетесь увидеть, какая из них ближе всего к вашей точке интереса.
Однако я искал статические решения (без использования Интернета), поэтому, если вы можете использовать интернет-соединение, вы можете использовать: http://www.earthtools.org/webservices.htm, который предоставляет веб-сервис, чтобы дать вам часовой пояс с учетом координат lat/lon.
Ответ 4
Начиная с 2019 года Google API не имеет никакого бесплатного уровня, и источник данных ответа @cstich больше не поддерживается.
Если вы хотите API, timezonedb.com предлагает бесплатный уровень, ограниченный 1 запросом в секунду.
Первоначальный сопровождающий данных, используемый @cstich, ссылается на этот проект, который извлекает данные из OpenStreetMap. В файле readme содержится ссылка для поиска библиотек на разных языках.
Ответ 5
Не могли бы вы просто использовать IP-адрес пользователя, чтобы определить, в котором они живут? И затем вы используете массив (Страны | Разница с GMT), чтобы получить местное время.