2011-11-30 11 views
9

私のユーザーがリクエストを送信している現地時間を知りたいと思います。 基本的には、緯度上の単純な割り算が働くことができれば国のほとんどは、完璧な幾何学的形状を持っていないので、私は、わからないんだけど、このGPS位置からタイムゾーン

var localTime = getLocalTime(lat, long); 

のような関数のようなものがあります。

助けがあれば助かります。どんな言語でも受け入れられます。私は離れたAPIを呼び出すことを避けたいと思います。

+0

まあ、それはリモートAPIを含みますが、この質問に対する答えを見てください。それはあなたが望むものを与えるかもしれません:http://stackoverflow.com/questions/41504/timezone-lookup-from-latitude-longitude。 –

答えて

-3

ユーザーIPを使用して、自分がどこに住んでいるかを判断できませんでしたか?そして、地方の時間を得るために(Countries | Difference with GMT)の配列を使用します。

2

私は数日前に同じことを探していましたが、残念ながらAPIやその機能を見つけることができませんでした。その理由は、国が完全な幾何学的形状を持っていないと言ったからです。各タイムゾーンの領域の表現を作成し、ポイントがどこにあるのかを確認する必要があります。私はこれが痛みになると思うし、それがまったくできないのかどうかわからない。

私が見つけた唯一のものは、Determine timezone from latitude/longitude without using web services like Geonames.orgです。基本的には、タイムゾーンに関する情報を持つデータベースが必要であり、あなたの関心のポイントに最も近いものを探すことを試みています。

しかし、私は静的なソリ​​ューション(インターネットを使用しないで)を探していましたので、インターネット接続を使用することができます:http://www.earthtools.org/webservices.htmこれはあなたにタイムゾーン与えられた緯度/経度座標を与えるwebserviceを提供します。

4

Google Time Zone APIはあなたが何をしているかのようです。

タイムゾーンAPIは、地球表面上の位置の時間オフセットデータを提供します。特定のLatitude/Longitudeペアのタイムゾーン情報を要求すると、そのタイムゾーンの名前、UTCからの時間オフセット、および夏時間オフセットが返されます。

3

私はちょうど今日同じ問題に直面していましたが、私の答えはこの後すべてどのように関係しているのか分かりませんが、基本的にはあなたが望むことをするPython関数を書いています。ここで見つけることができます。

https://github.com/cstich/gpstotz

編集:私は、コードをポストする必要があり、コメントで述べたように

。このコードはEric Mullerのタイムゾーンの形状ファイルに基づいています。ここには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' 
+0

あなたはオフサイトに行くことを要求するのではなく、ここに関連するコードを掲示するべきです。他のサイトへのリンクは古くなり、SO検索機能では検索できません。 –

+0

これは意味があり、コードを投稿したばかりです。回答をファイルに添付する方法はありますか? – cstich

関連する問題