Last active
December 17, 2015 12:19
-
-
Save drocamor/5609194 to your computer and use it in GitHub Desktop.
This gets the timezone for a given latitude/longitude pair. Not efficient.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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