การสร้าง shapefile รูปหลายเหลี่ยมแบบกริดด้วย Python หรือไม่


9

ฉันมีพิกัดต่อไปนี้

minx, maxx, miny ,maxy = 448262.080078, 450360.750122, 6262492.020081, 6262938.950073

ฉันต้องการสร้างตารางสี่เหลี่ยมขนาด 1 ม. โดยใช้ไพ ธ อน

import math


minx,maxx,miny,maxy = 448262.080078, 450360.750122, 6262492.020081, 6262938.950073
size = 1

def set_bbox(minx, maxx, miny, maxy, distx, disty):
    nx = int(math.ceil(abs(maxx - minx)/distx))
    ny = int(math.ceil(abs(maxy - miny)/disty))
    new_maxx = minx + (nx*distx)
    new_miny = maxy - (ny*disty)
    return ((minx, new_maxx, new_miny, maxy),ny,nx)

# shift the bottom (right - down)
coord, ny, nx = set_bbox(minx,maxx,miny,maxy,size,size)
# left-up origin
origin = coord[0],coord[3]
# number of tiles
ncell = ny*nx

นี่คือสิ่งที่แนบมากับแพลตฟอร์ม GIS ที่เฉพาะเจาะจงหรือเป็นความต้องการที่จะทำเช่นนี้ในหลามบริสุทธิ์โดยไม่ต้องมีรูปแบบผลลัพธ์ที่ระบุ (เช่น shapefile, textfile ฯลฯ ฯลฯ )

ขอบคุณ @Dan ฉันต้องการที่จะดำเนินการในหลามบริสุทธิ์และผลผลิตจะอยู่ในรูปแบบ shapefile
Gianni

ระดับสิทธิ์การใช้งาน ArcInfo ของ ArcMap มีเครื่องมือ Fishnet แต่คุณไม่ได้ระบุวิธีที่คุณต้องการสร้างรูปร่างไฟล์

ขออภัยฉันไม่ได้ใช้ซอฟต์แวร์เชิงพาณิชย์ ฉันชอบโปรแกรมในภาษาบริสุทธิ์ Java, Python, C ++
Gianni

1
แต่คุณไม่ทราบใช้ห้องสมุดเช่น GDAL / OGR ( pypi.python.org/pypi/GDAL ) หรือ pyshp ( pypi.python.org/pypi/pyshp )?
Snorfalorpagus

คำตอบ:


11

สคริปต์ต่อไปนี้จะทำงานกับ GDAL และ Python:

import os, sys
import ogr
from math import ceil

def main(outputGridfn,xmin,xmax,ymin,ymax,gridHeight,gridWidth):

    # convert sys.argv to float
    xmin = float(xmin)
    xmax = float(xmax)
    ymin = float(ymin)
    ymax = float(ymax)
    gridWidth = float(gridWidth)
    gridHeight = float(gridHeight)

    # get rows
    rows = ceil((ymax-ymin)/gridHeight)
    # get columns
    cols = ceil((xmax-xmin)/gridWidth)

    # start grid cell envelope
    ringXleftOrigin = xmin
    ringXrightOrigin = xmin + gridWidth
    ringYtopOrigin = ymax
    ringYbottomOrigin = ymax-gridHeight

    # create output file
    outDriver = ogr.GetDriverByName('ESRI Shapefile')
    if os.path.exists(outputGridfn):
        os.remove(outputGridfn)
    outDataSource = outDriver.CreateDataSource(outputGridfn)
    outLayer = outDataSource.CreateLayer(outputGridfn,geom_type=ogr.wkbPolygon )
    featureDefn = outLayer.GetLayerDefn()

    # create grid cells
    countcols = 0
    while countcols < cols:
        countcols += 1

        # reset envelope for rows
        ringYtop = ringYtopOrigin
        ringYbottom =ringYbottomOrigin
        countrows = 0

        while countrows < rows:
            countrows += 1
            ring = ogr.Geometry(ogr.wkbLinearRing)
            ring.AddPoint(ringXleftOrigin, ringYtop)
            ring.AddPoint(ringXrightOrigin, ringYtop)
            ring.AddPoint(ringXrightOrigin, ringYbottom)
            ring.AddPoint(ringXleftOrigin, ringYbottom)
            ring.AddPoint(ringXleftOrigin, ringYtop)
            poly = ogr.Geometry(ogr.wkbPolygon)
            poly.AddGeometry(ring)

            # add new geom to layer
            outFeature = ogr.Feature(featureDefn)
            outFeature.SetGeometry(poly)
            outLayer.CreateFeature(outFeature)
            outFeature.Destroy

            # new envelope for next poly
            ringYtop = ringYtop - gridHeight
            ringYbottom = ringYbottom - gridHeight

        # new envelope for next poly
        ringXleftOrigin = ringXleftOrigin + gridWidth
        ringXrightOrigin = ringXrightOrigin + gridWidth

    # Close DataSources
    outDataSource.Destroy()


if __name__ == "__main__":

    #
    # example run : $ python grid.py <full-path><output-shapefile-name>.shp xmin xmax ymin ymax gridHeight gridWidth
    #

    if len( sys.argv ) != 8:
        print "[ ERROR ] you must supply seven arguments: output-shapefile-name.shp xmin xmax ymin ymax gridHeight gridWidth"
        sys.exit( 1 )

    main( sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5], sys.argv[6], sys.argv[7] )

6

สคริปต์ Python นี้ใช้ไลบรารีpyshpตามที่แนะนำโดย user16044:

import shapefile as shp
import math

minx,maxx,miny,maxy = 448262.080078, 450360.750122, 6262492.020081, 6262938.950073
dx = 100
dy = 100

nx = int(math.ceil(abs(maxx - minx)/dx))
ny = int(math.ceil(abs(maxy - miny)/dy))

w = shp.Writer(shp.POLYGON)
w.autoBalance = 1
w.field("ID")
id=0

for i in range(ny):
    for j in range(nx):
        id+=1
        vertices = []
        parts = []
        vertices.append([min(minx+dx*j,maxx),max(maxy-dy*i,miny)])
        vertices.append([min(minx+dx*(j+1),maxx),max(maxy-dy*i,miny)])
        vertices.append([min(minx+dx*(j+1),maxx),max(maxy-dy*(i+1),miny)])
        vertices.append([min(minx+dx*j,maxx),max(maxy-dy*(i+1),miny)])
        parts.append(vertices)
        w.poly(parts)
        w.record(id)

w.save('polygon_grid')

หมายเหตุ:ตารางสี่เหลี่ยมจัตุรัสขนาด 1 ม. ที่มีขอบเขตดังกล่าวเท่ากับชั้นที่มีรูปหลายเหลี่ยมประมาณ 1 ล้านรูปดังนั้นประสิทธิภาพของสคริปต์จึงลดลงอย่างสมเหตุสมผล


1

คำถามนี้ตอบเมื่อเวลาผ่านไป แต่ฉันเพิ่มโซลูชันอื่นโดยใช้ไลบรารี shapely และ fiona:

import fiona
from shapely.geometry import mapping, LineString, MultiLineString

file = 'input.shp'
with fiona.open(file, 'r') as ds_in:
    num_tiles = 5
    schema = {
    "geometry": "MultiLineString",
    "properties": {"id": "int"}
     }
minx, miny, maxx, maxy = ds_in.bounds
dx = (maxx - minx) / num_tiles
dy = (maxy - miny) / num_tiles

lines = []
for x in range(num_tiles + 1):
    lines.append(LineString([(minx + x * dx, miny), (minx + x * dx, maxy)]))
for y in range(num_tiles + 1):
    lines.append(LineString([(minx, miny + y * dy), (maxx, miny + y * dy)]))
grid = MultiLineString(lines)
out = 'gridtest.shp'
with fiona.open(out, 'w', driver=ds_in.driver, schema=schema, crs=ds_in.crs) as ds_dst:
    ds_dst.write({'geometry': mapping(grid), "properties": {"id": 0}})

-1

คำตอบของการสร้าง Fishnet Grid Shapefile ใน QGIS? แสดงตัวเลือกสร้างกริดในกล่องเครื่องมือประมวลผล QGIS


OP ระบุว่าเขา / เธอต้องการตัวอย่างเช่นในหลามบริสุทธิ์มากกว่ากับซอฟต์แวร์
LaughU

ให้คำตอบอื่น ๆ ที่นำเข้าไลบรารีการนำเข้าโมดูล QGIS เป็นวิธีที่ถูกต้องส่งต่อเพื่อหลีกเลี่ยง GUI กดไลค์
965586

คำตอบอื่น ๆ ให้รหัสดังนั้นหากคุณทำเกินไปฉันคิดว่ามันจะได้รับดีกว่า
PolyGeo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.