52 votes

Déterminer le fuseau horaire à partir de la latitude / longitude sans utiliser de services Web tels que Geonames.org

est-il possible de déterminer le fuseau horaire du point (lat / lon) sans utiliser les services Web? Geonames.org n'est pas assez stable pour que je puisse utiliser :( J'ai besoin de ça pour fonctionner en PHP.

Merci

56voto

Michael Borgwardt Points 181658

J'ai eu ce problème un temps, et fait exactement ce que adam a suggéré:

  • Télécharger la base de données des villes de geonames.org
  • convertir un compact lat/lon -> fuseau horaire liste
  • l'utilisation d'un R-Tree de la mise en œuvre efficace de la recherche de la ville la plus proche (ou plutôt, son fuseau horaire) à une coordonnée donnée

Autant que je me souvienne il a fallu moins de 1 seconde pour remplir le R-Tree, et il pourrait alors effectuer des milliers de recherches par seconde (sur 5 ans PC).

18voto

Quelle est la précision de vos résultats? Si une estimation approximative est suffisante, calculez le décalage vous-même:

 offset = direction * longitude * 24 / 360
 

où direction est 1 pour l'est, -1 pour l'ouest et la longitude est en (-180,180)

10voto

James D Points 1027

J'ai rencontré ce problème en travaillant sur un autre projet et le regarda dans les très profondément. J'ai trouvé toutes les solutions existantes afin de faire défaut dans les grandes voies.

Le téléchargement du GeoNames données et l'utilisation spatiale des index pour rechercher le point le plus proche est certainement une option, et il donnera le bon résultat de beaucoup de temps, mais il peut facilement échouer si une requête est sur le mauvais côté d'une heure de la frontière de la zone de point le plus proche dans la base de données.

Une méthode plus précise consiste à utiliser une carte numérique des fuseaux horaires et à écrire du code pour trouver le polygone de cette carte qui contient un point de requête. Heureusement, il ya une excellente carte des fuseaux horaires du monde au http://efele.net/maps/tz/world/. Pour écrire un efficace moteur de recherche, vous avez besoin de:

  • Analyser le format ESRI shapefile utile représentation interne.
  • Écrire des points dans un polygone de code pour tester si un point de requête est dans un polygone donné.
  • Écriture efficace d'un index spatial sur le dessus du polygone de données de sorte que vous n'avez pas besoin de vérifier chaque polygone de trouver le contenir.
  • Gérer les requêtes qui ne sont pas contenues par un polygone (par exemple, dans l'océan). Dans de tels cas, vous devez caler le plus proche polygone jusqu'à une certaine distance, et de revenir à la "naturelles" time zone " (celle qui est déterminée en fonction de la longitude seul) dans l'océan ouvert. Pour ce faire, vous aurez besoin de code pour calculer la distance entre un point de requête et un segment de ligne d'un polygone (ce qui est non négligeable puisque la latitude et la longitude sont un non-Euclidienne système de coordonnées), et votre index spatial devra être en mesure de revenir à proximité de polygones, et pas seulement potentiellement contenant des polygones.

Chacun de ceux qui sont dignes de leur propre Dépassement de Pile question/réponse de la page.

Après la conclusion qu'aucune des solutions existantes, y répondait à mes besoins, j'ai écrit ma propre solution et les a mis à disposition ici:

http://askgeo.com

AskGeo utilise une carte numérique et a une très optimisé index spatial qui permet pour l'exécution de plus de 10 000 requêtes par seconde sur mon ordinateur dans un seul thread. Et c'est thread-safe, de sorte que même un débit plus élevé est certainement possible. C'est un sérieux morceau de code, et il nous a fallu beaucoup de temps pour se développer, de sorte que nous offrons sous une licence commerciale.

Il est écrit en Java, afin de l'utiliser en PHP nécessiterait l'utilisation d':

http://php-java-bridge.sourceforge.net/doc/how_it_works.php

Nous sommes également ouverts à portage pour un bounty. Pour plus de détails sur le prix, et pour une documentation détaillée, voir http://askgeo.com.

J'espère que cela est utile. Il a certainement été utile pour le projet sur lequel je travaillais.

8voto

Jeffrey Vdovjak Points 174

Je sais que c'est vieux, mais j'ai passé du temps à chercher cette réponse. Trouvé quelque chose de très utile. Google fait des recherches de fuseau horaire par long / lat. Limite de 2 500 par jour (ou 100 000 pour les utilisateurs professionnels).

https://developers.google.com/maps/documentation/timezone/

5voto

Tim Parenti Points 462

Pour les zones terrestres, certaines cartes de fichiers de formes ont été créées pour les fuseaux horaires de la base de données tz (Olson). Elles ne sont pas mises à jour aussi régulièrement que la base de données tz elle-même, mais c'est un excellent point de départ et semble très précis dans la plupart des cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X