52 votos

Determinar la zona horaria a partir de la latitud/longitud sin utilizar servicios web como Geonames.org

¿hay alguna posibilidad de determinar la zona horaria del punto (lat/lon) sin utilizar los servicios web? Geonames.org no es lo suficientemente estable como para que lo use :( Necesito que esto funcione en PHP.

Gracias

56voto

Michael Borgwardt Puntos 181658

Tuve este problema hace un tiempo e hice exactamente lo que sugirió adam:

  • Descargue el base de datos de ciudades de geonames.org
  • convertirlo en una lista compacta de lat/lon -> zona horaria
  • utilizar un R-Tree para buscar eficazmente la ciudad más cercana (o más bien, su zona horaria) a una coordenada dada

Recuerdo que tardaba menos de 1 segundo en rellenar el R-Tree, y luego podía realizar miles de búsquedas por segundo (ambos en un PC de 5 años).

10voto

James D Puntos 1027

Me encontré con este problema mientras trabajaba en otro proyecto y lo investigué a fondo. Encontré que todas las soluciones existentes tenían grandes carencias.

Descargar los datos de GeoNames y utilizar algún índice espacial para buscar el punto más cercano es definitivamente una opción, y dará el resultado correcto la mayor parte del tiempo, pero puede fallar fácilmente si un punto de consulta está en el lado equivocado de una frontera de zona horaria desde el punto más cercano en la base de datos.

Un método más preciso es utilizar un mapa digital de las zonas horarias y escribir un código para encontrar el polígono de ese mapa que contiene un punto de consulta determinado. Afortunadamente, existe un excelente mapa de los husos horarios del mundo disponible en http://efele.net/maps/tz/world/ (no se mantiene más ). Para escribir un motor de consulta eficiente, es necesario:

  • Parsear el formato shapefile de ESRI en una representación interna útil.
  • Escriba código de punto en polígono para comprobar si un punto de consulta dado está en un polígono determinado.
  • Escriba un índice espacial eficiente sobre los datos de los polígonos para que no tenga que comprobar cada polígono para encontrar el que lo contiene.
  • Manejar las consultas que no están contenidas por ningún polígono (por ejemplo, en el océano). En estos casos, debe "ajustarse" al polígono más cercano hasta una determinada distancia, y volver a la zona horaria "natural" (la determinada sólo por la longitud) en alta mar. Para ello, necesitará un código que calcule la distancia entre un punto de consulta y un segmento de línea de un polígono (esto no es trivial, ya que la latitud y la longitud son un sistema de coordenadas no euclidiano), y su índice espacial tendrá que ser capaz de devolver polígonos cercanos, no sólo polígonos que potencialmente los contengan.

Cada una de ellas merece su propia página de preguntas/respuestas en Stack Overflow.

Tras llegar a la conclusión de que ninguna de las soluciones existentes satisfacía mis necesidades, escribí mi propia solución y la puse a disposición aquí:

http://askgeo.com

AskGeo utiliza un mapa digital y tiene un índice espacial altamente optimizado que permite ejecutar más de 10.000 consultas por segundo en mi ordenador en un solo hilo. Y es un hilo seguro, por lo que es posible un rendimiento aún mayor. Se trata de una pieza de código seria, y nos ha llevado mucho tiempo desarrollarla, por lo que la ofrecemos bajo licencia comercial.

Está escrito en Java, por lo que usarlo en PHP implicaría usar:

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

También estamos abiertos a portarlo por una recompensa. Para más detalles sobre el precio, y para una documentación detallada, vea http://askgeo.com .

Espero que esto sea útil. Desde luego, fue útil para el proyecto en el que estaba trabajando.

8voto

Jeffrey Vdovjak Puntos 174

Sé que esto es viejo, pero he pasado un tiempo buscando esta respuesta. Encontré algo muy útil. Google hace búsquedas de zonas horarias por largo/lat. Ya no hay nivel gratuito :-/

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

5voto

Tim Parenti Puntos 462

Para las zonas en tierra, hay algunas mapas shapefile que se han realizado para las zonas horarias de la base de datos tz (Olson). No se actualizan con tanta regularidad como la propia base de datos tz, pero es un buen punto de partida y parece ser muy preciso para la mayoría de los propósitos.

5voto

daniellmb Puntos 10289

Deberías poder, si conoces el polígono de la zona horaria para ver si una determinada lat/lon está dentro de ella.

Base de datos de los husos horarios del mundo enter image description here

Datos del polígono de latitud/longitud enter image description here

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X