433 Stimmen

Wie man eine Zeitzone aus einem bestimmten Ort mithilfe von Breiten- und Längengradkoordinaten erhält?

Bei gegebenen Breiten- und Längengraden eines Ortes, wie erfährt man, welche Zeitzone in diesem Ort gültig ist?

In den meisten Fällen suchen wir nach einer IANA/Olson-Zeitzone-ID, obwohl einige Dienste nur einen UTC-Offset oder einen anderen Zeitzonenbezeichner zurückgeben können. Bitte lesen Sie die Zeitzone-Taginformationen für Details.

2voto

Onur Yıldırım Punkte 29717

Sie können geolocator.js verwenden, um einfach die Zeitzone und mehr zu erhalten...

Es verwendet Google APIs, die einen Schlüssel erfordern. Zuerst konfigurieren Sie geolocator:

geolocator.config({
    language: "de",
    google: {
        version: "3",
        key: "IHR-GOOGLE-API-SCHLÜSSEL"
    }
});

Zeitzone abrufen, wenn Sie die Koordinaten haben:

geolocator.getTimeZone(options, function (err, timezone) {
    console.log(err || timezone);
});

Beispiel-Ausgabe:

{
    id: "Europe/Paris",
    name: "Mitteleuropäische Normalzeit",
    abbr: "MEZ",
    dstOffset: 0,
    rawOffset: 3600,
    timestamp: 1455733120
}

Suchen Sie dann nach der Zeitzone und mehr

Wenn Sie die Koordinaten nicht haben, können Sie zuerst die Benutzerposition ermitteln.

Das folgende Beispiel wird zunächst versuchen, die HTML5-Geolokalisierungs-API zu verwenden, um die Koordinaten zu erhalten. Wenn dies fehlschlägt oder abgelehnt wird, werden die Koordinaten über die Geo-IP-Suche abgerufen. Schließlich wird die Zeitzone und mehr erhalten...

var options = {
    enableHighAccuracy: true,
    timeout: 6000,
    maximumAge: 0,
    desiredAccuracy: 30,
    fallbackToIP: true, // wenn HTML5 fehlschlägt oder abgelehnt wird
    addressLookup: true, // dies liefert vollständige Adressinformationen
    timezone: true,
    map: "my-map" // dies erstellt sogar eine Karte für Sie
};
geolocator.locate(options, function (err, location) {
    console.log(err || location);
});

Beispiel-Ausgabe:

{
    coords: {
        latitude: 37.4224764,
        longitude: -122.0842499,
        accuracy: 30,
        altitude: null,
        altitudeAccuracy: null,
        heading: null,
        speed: null
    },
    address: {
        commonName: "",
        street: "Amphitheatre Pkwy",
        route: "Amphitheatre Pkwy",
        streetNumber: "1600",
        neighborhood: "",
        town: "",
        city: "Mountain View",
        region: "Santa Clara County",
        state: "Kalifornien",
        stateCode: "CA",
        postalCode: "94043",
        country: "Vereinigte Staaten",
        countryCode: "US"
    },
    formattedAddress: "1600 Amphitheatre Parkway, Mountain View, CA 94043, USA",
    type: "DACH",
    placeId: "ChIJ2eUgeAK6j4ARbn5u_wAGqWA",
    timezone: {
        id: "America/Los_Angeles",
        name: "Pacific Standard Time",
        abbr: "PST",
        dstOffset: 0,
        rawOffset: -28800
    },
    flag: "//cdnjs.cloudflare.com/ajax/libs/flag-icon-css/2.3.1/flags/4x3/us.svg",
    map: {
        element: HTMLElement,
        instance: Object, // google.maps.Map
        marker: Object, // google.maps.Marker
        infoWindow: Object, // google.maps.InfoWindow
        options: Object // map options
    },
    timestamp: 1456795956380
}

1voto

Tobias Gassmann Punkte 10321

Hinweis: Ich bin der Autor des unten beschriebenen Docker-Images

Ich habe https://github.com/evansiroky/node-geo-tz in einem sehr einfachen Docker-Container verpackt

https://hub.docker.com/repository/docker/tobias74/timezone-lookup

Sie können den Docker-Container mit folgendem Befehl starten

docker run -p 80:3000 tobias74/timezone-lookup:latest

Dadurch wird der Lookup-Dienst auf Ihrem localhost unter Port 3000 verfügbar gemacht. Sie können dann ein Zeitzonensuche durchführen mit

curl "localhost:3000/timezone?latitude=12&longitude=34"

1voto

legel Punkte 2157

Es ist in der Tat wichtig zu erkennen, dass dieses Problem komplizierter ist, als die meisten vermuten würden. In der Praxis sind viele von uns auch bereit, einen Arbeitscode zu akzeptieren, der für "so viele Fälle wie möglich" funktioniert, bei dem zumindest seine fatalen Probleme gemeinsam identifiziert und minimiert werden können. Deshalb veröffentliche ich das alles im Hinblick auf den Geist des OP. Schließlich, für den praktischen Nutzen für andere, die versuchen, GPS in die Zeitzone umzuwandeln mit dem Ziel, ein ortsabhängiges Zeitobjekt zu haben (und noch wichtiger, um die Qualität durchschnittlicher Implementierungen mit Zeitobjekten, die sich aus diesem Wiki ergeben, zu verbessern), hier ist, was ich in Python generiert habe (bitte frei bearbeiten):

import pytz
from datetime import datetime
from tzwhere import tzwhere

def timezoned_unixtime(latitude, longitude, dt):
    tzw = tzwhere.tzwhere()
    timezone_str = tzw.tzNameAt(latitude, longitude)
    timezone = pytz.timezone(timezone_str)
    timezone_aware_datetime = timezone.localize(dt, is_dst=None)
    unix_time = (timezone_aware_datetime - datetime(1970, 1, 1, tzinfo=pytz.utc)).total_seconds()
    return unix_time

dt = datetime(year=2017, month=1, day=17, hour=12, minute=0, second=0)
print timezoned_unixtime(latitude=40.747854, longitude=-74.004733, dt=dt)

1voto

jtschoonhoven Punkte 1472
  1. Es gibt mehrere Online-Quellen, die GeoJSON-Daten für Zeitzonen haben (hier ist eine, hier ist eine andere)

  2. Verwenden Sie eine Geometriebibliothek, um Polygonobjekte aus den GeoJSON-Koordinaten zu erstellen (shapely [python], GEOS [c++], JTS [java], NTS [.net]).

  3. Konvertieren Sie Ihre Breitengrad/Längengrad in ein Punktobjekt (wie auch immer Ihre Bibliothek das darstellt) und überprüfen Sie, ob es das Zeitzonenpolygon schneidet.

    from shapely.geometry import Polygon, Point
    
    def get_tz_from_lat_lng(lat, lng):
        for tz, geojson in timezones.iteritems():
            coordinates = geojson['features'][0]['geometry']['coordinates']
            polygon = Polygon(coordinates)
            point = Point(lng, lat)
            if polygon.contains(point):
                return tz

0voto

Elchin Jafarov Punkte 11

Von Guppy:

import geocoders
g = geocoders.GoogleV3()
place, (lat, lng) = g.geocode('Fairbanks')
print place, (lat, lng)
Fairbanks, AK, USA (64.8377778, -147.7163889)
timezone = g.timezone((lat, lng))
print timezone.dst

Bound method America/Anchorage.dst of DstTzInfo

'America/Anchorage' LMT-1 day, 14:00:00 STD

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X