Skip to content

Instantly share code, notes, and snippets.

@drocamor
Last active December 17, 2015 12:19
Show Gist options
  • Save drocamor/5609194 to your computer and use it in GitHub Desktop.
Save drocamor/5609194 to your computer and use it in GitHub Desktop.
This gets the timezone for a given latitude/longitude pair. Not efficient.
#!/usr/bin/env python
import shapefile
# Get the shapefile from here: http://efele.net/maps/tz/world/
sf = shapefile.Reader("/Users/drocamor/Downloads/world/tz_world.shp")
# I took this from here: http://geospatialpython.com/2011/08/point-in-polygon-2-on-line.html
# Improved point in polygon test which includes edge
# and vertex points
def point_in_poly(x,y,poly):
# check if point is a vertex
if (x,y) in poly: return "IN"
# check if point is on a boundary
for i in range(len(poly)):
p1 = None
p2 = None
if i==0:
p1 = poly[0]
p2 = poly[1]
else:
p1 = poly[i-1]
p2 = poly[i]
if p1[1] == p2[1] and p1[1] == y and x > min(p1[0], p2[0]) and x < max(p1[0], p2[0]):
return True
n = len(poly)
inside = False
p1x,p1y = poly[0]
for i in range(n+1):
p2x,p2y = poly[i % n]
if y > min(p1y,p2y):
if y <= max(p1y,p2y):
if x <= max(p1x,p2x):
if p1y != p2y:
xints = (y-p1y)*(p2x-p1x)/(p2y-p1y)+p1x
if p1x == p2x or x <= xints:
inside = not inside
p1x,p1y = p2x,p2y
if inside: return True
else: return False
# This iterates through the shapes and returns the name of the shape that the coordinates are inside of
# This is not efficient
def timezone(x,y):
n = 0
for shape in sf.shapes():
if point_in_poly(x,y,shape.points):
return sf.records()[n][0]
n += 1
return None
timezone(-74,42) # -> 'America/New_York'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment