从纬度/经度确定时区,而不使用像Geonames.org这样的网络服务

Jac*_*cuz 49 javascript php gis timezone geolocation

有没有可能在不使用webservices的情况下确定point(lat/lon)的时区?Geonames.org对我来说不够稳定:(我需要这个在PHP中工作.

谢谢

Mic*_*rdt 54

我有一段时间没遇到这个问题,并且确实完成了亚当建议:

  • 从geonames.org 下载城市数据库
  • 将其转换为紧凑的lat/lon - >时区列表
  • 使用R-Tree实现有效地查找最近的城市(或更确切地说,它的时区)到给定的坐标

IIRC花了不到1秒的时间来填充R-Tree,然后它可以每秒执行数千次查找(都是在一台5岁的PC上).

  • 我有太多的痛苦去做"将它转换为紧凑的纬度/经度 - >时区列表",这里是:https://gist.github.com/1769458.然后我使用postgis postgis,地理类型的Gist索引,然后查询:选择timezone_string其中ST_DWithin(ST_GeographyFromText('SRID = 4326; POINT(2.36 48.86)'),location,100000,false)顺序由st_distance(ST_GeographyFromText ('SRID = 4326; POINT(2.36 48.86)'),位置)限制1.我看起来在我想要的点(2.36 48.86)周围100公里的体面穿孔:30ms.如果它失败了,我做6000km:1秒:) (15认同)
  • 我创建了一个简单的Python脚本,将GeoNames.org数据(和其他)转换为各种格式,例如用于地理空间查询的MongoDB .json插入脚本.它可以在这里找到:https://github.com/NuSkooler/GeoToTimeZone (5认同)
  • @Markos Fragkakis:刚刚看到你的评论.我链接的R-Tree库有一个最近邻搜索.不确定它是如何实现的.但基本思想应该与不同的数据结构一样好用. (2认同)

Chr*_*ldt 13

您的结果有多准确?如果粗略估计足够,请自行计算偏移量:

offset = direction * longitude * 24 / 360
Run Code Online (Sandbox Code Playgroud)

东方向为1,西方方向为-1,经度方向为(-180,180)


Jam*_*s D 10

我在处理另一个项目时遇到了这个问题,并深入研究了这个问题.我发现所有现有的解决方案都缺乏主要方面.

下载GeoNames数据并使用一些空间索引来查找最近的点肯定是一个选项,它会在很多时候产生正确的结果,但如果查询点位于错误的一侧,它很容易失败区域边界距离数据库中最近的点.

更准确的方法是使用时区的数字地图并编写代码以在该地图中查找包含给定查询点的多边形.值得庆幸的是,http: //efele.net/maps/tz/world/上有一个很好的世界时区地图.要编写有效的查询引擎,您需要:

  • 将ESRI shapefile格式解析为有用的内部表示.
  • 写入多边形点代码以测试给定查询点是否在给定多边形中.
  • 在多边形数据之上写一个有效的空间索引,这样您就不需要检查每个多边形以找到包含多边形的多边形.
  • 处理任何多边形未包含的查询(例如,在海洋中).在这种情况下,您应该"捕捉"最近的多边形直到一定距离,然后在开阔的海洋中恢复到"自然"时区(仅由经度确定的时区).为此,您需要使用代码来计算查询点与多边形线段之间的距离(这是非平凡的,因为纬度和经度是非欧几里德坐标系),您的空间索引需要是能够返回附近的多边形,而不仅仅是可能包含多边形.

每个都值得他们自己的Stack Overflow问题/答案页面.

在断定现有解决方案都没有满足我的需求后,我编写了自己的解决方案,并在此处提供:

http://askgeo.com

AskGeo使用数字地图并具有高度优化的空间索引,允许在一个线程中在我的计算机上每秒运行超过10,000个查询.它是线程安全的,因此甚至可以实现更高的吞吐量.这是一段严肃的代码,我们花了很长时间来开发,所以我们在商业许可下提供它.

它是用Java编写的,因此在PHP中使用它将涉及使用:

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

我们也愿意将它移植到赏金中.有关定价的详细信息以及详细文档,请访问http://askgeo.com.

我希望这很有用.这当然对我正在进行的项目很有用.


Jef*_*jak 8

我知道这已经过时了,但我花了一些时间寻找这个答案.找到了非常有用的东西 Google通过long/lat执行时区查找.每天2,500个限制(或商业用户100,000个).

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


dan*_*lmb 5

如果您知道时区的多边形以查看给定的纬度/经度是否在其中,您应该能够.

世界时区数据库 在此输入图像描述

纬度/经度多边形数据 在此输入图像描述

  • 请注意,对于大多数用途,由于不同的夏令时开关及其历史更改,您确实需要区分超过400个管理时区,而不仅仅是基本偏移. (7认同)

Tim*_*nti 5

对于陆地上的区域,有一些shapefile映射已经为tz(Olson)数据库的时区制作.它们没有像tz数据库那样经常更新,但它是一个很好的起点,对于大多数用途来说似乎非常准确.

  • +1嗨Tim,谢谢 - 我在GeoTools的项目中成功使用了这些地图,将lat/long转换为时区ID,然后将Joda时间转换为瞬时时间加上时区ID,以提供本地历史时间.甜. (2认同)