That got me essentially all the way there. Herewith a gist: https://gist.github.com/urschrei/17cf0be92ca90a244a91
This simply calculates a grid of hexagon coordinates given LL and UR x, y values and side length. The returned list can easily generate Shapely polygons, from which the sky is the limit.
Post by Robert SansonHere is some code I wrote a while ago to create a Shape file of
import math
from osgeo import gdal
from osgeo import ogr
from osgeo import osr
from pyproj import Proj
#input lower left and upper right bounds and side length
sl = 5000.0 #side length
origx = 1772193.50482601
origy = 5495586.50355601
endx = 1892367.49517399
endy = 5617030.49644399
#output format
outpf = "esri"
#outpf = "wkt"
#calculate coordinates of the hexagon points
p = sl * 0.5 #sin(30)
b = sl * math.cos(math.radians(30))
w = b * 2
h = 2 * sl
#offsets for moving along and up rows
xoffset = b
yoffset = 3 * p
#Proj.4 coordinate system
tmpr = Proj('+proj=tmerc +lat_0=0 +lon_0=173 +k=0.9996 +x_0=1600000
+y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs')
#Create the output file object
fp = open("hex5km.txt", "w")
fp.write("Polygon\n")
#set up OGR stuff
driver = ogr.GetDriverByName('ESRI Shapefile')
newShp = driver.CreateDataSource('hex5km.shp')
layer = newShp.CreateLayer('hex1',geom_type=ogr.wkbPolygon)
field = ogr.FieldDefn('hex_id',ogr.OFTInteger)
field.SetWidth(9)
layer.CreateField(field)
out_ref = osr.SpatialReference()
out_ref.ImportFromEPSG(2193)
startx = origx
starty = origy
row = 1
counter = 0
startx = origx + xoffset
startx = origx
p1x = str(startx)
p1y = str(starty + p)
p2x = str(startx)
p2y = str(starty + (3 * p))
p3x = str(startx + b)
p3y = str(starty + h)
p4x = str(startx + w)
p4y = str(starty + (3 * p))
p5x = str(startx + w)
p5y = str(starty + p)
p6x = str(startx + b)
p6y = str(starty)
wkt = "POLYGON(("+p1x+" "+p1y+","+p2x+" "+p2y+","+p3x+"
"+p3y+","+p4x+" "+p4y+","+p5x+" "+p5y+","+p6x+" "+p6y+","+p1x+"
"+p1y+"))"
feature = ogr.Feature(layer.GetLayerDefn())
feature.SetField(0,counter)
geom = ogr.CreateGeometryFromWkt(wkt)
feature.SetGeometryDirectly(geom)
geom.AssignSpatialReference(out_ref)
layer.CreateFeature(feature)
fp.write("POLYGON(("+p1x+" "+p1y+","+p2x+" "+p2y+","+p3x+"
"+p3y+","+p4x+" "+p4y+","+p5x+" "+p5y+","+p6x+" "+p6y+","+p1x+"
"+p1y+"))\n")
fp.write(str(counter)+" 0\n")
fp.write("0 "+p1x+" "+p1y+"\n")
fp.write("1 "+p2x+" "+p2y+"\n")
fp.write("2 "+p3x+" "+p3y+"\n")
fp.write("3 "+p4x+" "+p4y+"\n")
fp.write("4 "+p5x+" "+p5y+"\n")
fp.write("5 "+p6x+" "+p6y+"\n")
fp.write("6 "+p1x+" "+p1y+"\n")
counter = counter + 1
startx = startx + w
starty = starty + yoffset
row = row + 1
fp.write("END\n")
print str(counter) + " Polygons created"
fp.close()
newShp.Destroy()
Regards,
Robert
Apologies for the general question, but I*m wondering if anyone*s
got a recipe to generate a grid of hexagon polygons (or any tessellating
shape!) for given coordinate bounds, using Shapely.
Essentially I want to emulate the MMQGIS *Create Grid Layer*
function*
Pointers and suggestions gladly accepted.
--
s
_______________________________________________
Community mailing list
http://lists.gispython.org/mailman/listinfo/community
This email and any attachments are confidential and intended solely for the addressee(s). If you are not the intended recipient, please notify us immediately and then delete this email from your system.
This message has been scanned for Malware and Viruses by Websense Hosted Security.
www.websense.com
_______________________________________________
Community mailing list
http://lists.gispython.org/mailman/listinfo/community