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.

590voto

Matt Johnson-Pint Punkte 212496

Zeitzonen Ort Web Services

Rohe Zeitzonen-Grenzdaten

  • Zeitzonen-Grenzbaukasten - erstellt Zeitzonen-Shapefiles aus OpenStreetMaps-Kartendaten. Beinhaltet Hoheitsgewässer in Küstennähe.

Die folgenden Projekte waren früher Quellen für Zeitzonen-Grenzdaten, werden aber nicht mehr aktiv gepflegt.

Offline-Implementierungen der Zeitzonen-Geolokalisierung

Implementierungen, die die Daten des Zeitzonen-Grenzbaukastens verwenden

Implementierungen, die die älteren tz_world-Daten verwenden

Bibliotheken, die einen der Webdienste aufrufen

  • timezone - Ruby-Gem, das GeoNames aufruft
  • AskGeo hat eigene Bibliotheken zum Aufrufen von Java oder .Net
  • GeoNames hat Client-Bibliotheken für so ziemlich alles

Selbstgehostete Webdienste

Weitere Ideen

Aktualisieren Sie diese Liste, wenn Sie noch weitere kennen

Beachten Sie auch, dass der Ansatz mit der nächstgelegenen Stadt möglicherweise nicht das "richtige" Ergebnis liefert, sondern nur eine Näherung.

Konvertierung in Windows-Zonen

Die meisten der aufgeführten Methoden geben eine IANA-Zeitzone-ID zurück. Wenn Sie dies in eine Windows-Zeitzone für die Verwendung mit der TimeZoneInfo-Klasse in .NET umwandeln müssen, verwenden Sie die TimeZoneConverter-Bibliothek.

Verwenden Sie keine zone.tab

Die Tz-Datenbank enthält eine Datei namens zone.tab. Diese Datei wird hauptsächlich verwendet, um eine Liste von Zeitzonen für einen Benutzer zur Auswahl anzuzeigen. Sie enthält die Breiten- und Längengradkoordinaten für den Bezugspunkt jeder Zeitzone. Dies ermöglicht die Erstellung einer Karte, die diese Punkte hervorhebt. Sehen Sie zum Beispiel die interaktive Karte auf der Startseite von der Moment-Timezone-Website.

Es mag verlockend sein, diese Daten zu nutzen, um die Zeitzone aus Breiten- und Längengradkoordinaten zu bestimmen, bedenken Sie jedoch, dass es sich um Punkte handelt - nicht um Grenzen. Das Beste, was man tun könnte, wäre, den nächstgelegenen Punkt zu bestimmen, der in vielen Fällen jedoch nicht der korrekte Punkt sein wird.

Betrachten Sie das folgende Beispiel:

                            Beispielbild Zeitzone

Die beiden Quadrate repräsentieren verschiedene Zeitzonen, wobei der schwarze Punkt in jedem Quadrat der Referenzort ist, wie er in zone.tab zu finden ist. Der blaue Punkt stellt den Ort dar, für den wir versuchen, eine Zeitzone zu finden. Offensichtlich liegt dieser Ort innerhalb der orangefarbenen Zone links, aber wenn wir nur den kürzesten Abstand zum Referenzpunkt betrachten, wird er sich zur grünen Zone rechts auflösen.

10voto

zbinsd Punkte 3884

Wie wäre es mit dieser Lösung für node.js https://github.com/mattbornski/tzwhere

Und sein Python-Gegenstück: https://github.com/pegler/pytzwhere

10voto

Joonathan Punkte 146

Wir bei Teleport haben gerade damit begonnen, unsere APIs zu öffnen und einer der Anwendungsfälle besteht auch darin, TZ-Informationen für Koordinaten zugänglich zu machen.

Beispielsweise könnte man alle verfügbaren TZ-Informationen für Koordinaten auf folgende Weise abrufen:

curl -s https://api.teleport.org/api/locations/59.4372,24.7453/?embed=location:nearest-cities/location:nearest-city/city:timezone/tz:offsets-now | jq '._embedded."location:nearest-cities"[0]._embedded."location:nearest-city"._embedded."city:timezone"'

Dies würde Folgendes zurückgeben

{
  "_embedded": {
    "tz:offsets-now": {
      "_links": {
        "self": {
          "href": "https://api.teleport.org/api/timezones/iana:Europe%2FTallinn/offsets/?date=2015-09-07T11%3A20%3A09Z"
        }
      },
      "base_offset_min": 120,
      "dst_offset_min": 60,
      "end_time": "2015-10-25T01:00:00Z",
      "short_name": "EEST",
      "total_offset_min": 180,
      "transition_time": "2015-03-29T01:00:00Z"
    }
  },
  "_links": {
    "self": {
      "href": "https://api.teleport.org/api/timezones/iana:Europe%2FTallinn/"
    },
    "tz:offsets": {
      "href": "https://api.teleport.org/api/timezones/iana:Europe%2FTallinn/offsets/{?date}",
      "templated": true
    },
    "tz:offsets-now": {
      "href": "https://api.teleport.org/api/timezones/iana:Europe%2FTallinn/offsets/?date=2015-09-07T11%3A20%3A09Z"
    }
  },
  "iana_name": "Europe/Tallinn"
}

Für das Beispiel habe ich ./jq zur JSON-Analyse verwendet.

3voto

Stiño Punkte 2633

So können Sie den Google Script Editor verwenden, um die timezoneName und timeZoneId in einem gsheet zu erhalten.

Schritt 1. Erhalten Sie einen API-Schlüssel für die Google-Zeitzone-API

Schritt 2. Erstellen Sie ein neues gsheet. Klicken Sie unter dem Menü 'Tools' auf 'Script-Editor'. Fügen Sie den folgenden Code hinzu:

function getTimezone(lat, long) {  
  var apiKey = 'API-SCHLÜSSEL HIER EINFÜGEN'
  var url = 'https://maps.googleapis.com/maps/api/timezone/json?location=' + lat + ',' + long + '×tamp=1331161200&key=' + apiKey 
  var response = UrlFetchApp.fetch(url);
  var data = JSON.parse(response.getContentText());
  return data["timeZoneName"];
}

Schritt 3. Speichern und veröffentlichen Sie Ihre getTimezone() Funktion und verwenden Sie sie wie im obigen Bild gezeigt.

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
}

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