Exemplo n.º 1
0
def polygonReading(fn, pg_lyrName_r):
    ds = ogr.Open(fn, 0)  #0为只读模式,1为编辑模式
    if ds is None:
        sys.exit('Could not open{0}'.format(fn))
    pg_lyr = ds.GetLayer(pg_lyrName_r)  #可以直接数据层(文件)名或者指定索引

    vp = VectorPlotter(True)  #显示vector数据
    vp.plot(pg_lyr)

    pg_schema = pg_lyr.schema  #查看属性表字段名和类型
    for field in pg_schema:
        print(field.name, field.GetTypeName())

    i = 0
    for feat in pg_lyr:  #循环feature
        print(
            ".................................................................."
        )
        atts = feat.items()
        print(atts)
        pg = feat.geometry()  #获取feature的几何对象
        #        ring=
        name = feat.GetField('NAME')  #读取feature的属性
        Shape_Area = feat.GetField('Shape_Area')
        print(name, Shape_Area, '\n', pg, '\n')

        for j in range(pg.GetGeometryCount()):  #循环几何对象获取ring,获取顶点坐标
            ring = pg.GetGeometryRef(j)
            for coordi in ring.GetPoints():
                print(coordi)
        i += 1
        if i == 12:
            break
    del ds
Exemplo n.º 2
0
def lineReading(fn, ln_lyrName_r):
    ds = ogr.Open(fn, 0)  #0为只读模式,1为编辑模式
    if ds is None:
        sys.exit('Could not open{0}'.format(fn))
    ln_lyr = ds.GetLayer(ln_lyrName_r)  #可以直接数据层(文件)名或者指定索引

    vp = VectorPlotter(True)  #显示vector数据
    vp.plot(ln_lyr, 'bo')

    ln_schema = ln_lyr.schema  #查看属性表字段名和类型
    for field in ln_schema:
        print(field.name, field.GetTypeName())

    i = 0
    for feat in ln_lyr:  #循环feature
        ln = feat.geometry()  #获取feature的几何对象
        name = feat.GetField('name')  #读取feature的属性
        Shape_Leng = feat.GetField('Shape_Leng')
        print(name, Shape_Leng, '\n', ln, '\n', ln.GetPointCount())
        for j in range(ln.GetPointCount()):  #循环几何对象(线)d的vertex顶点
            if j < 6:
                print((i, ln.GetX(i), ln.GetY(i)))  #只能通过GetX()和GetY()的方法获取顶点坐标
        i += 1
        if i == 12:
            break
    del ds
Exemplo n.º 3
0
def show_data(lyr):
    """
    显示数据,提供图层参数
    :param lyr: 
    :return: 
    """
    vp = VectorPlotter(False)
    vp.plot(lyr, 'bo')
    vp.draw()
Exemplo n.º 4
0
def pointReading(fn, pt_lyrName_r):
    ds = ogr.Open(fn, 0)  #0为只读模式,1为编辑模式
    if ds is None:
        sys.exit('Could not open{0}'.format(fn))
    pt_lyr = ds.GetLayer(pt_lyrName_r)  #可以直接数据层(文件)名或者指定索引
    vp = VectorPlotter(True)  #显示vector数据
    vp.plot(pt_lyr, 'bo')

    i = 0
    for feat in pt_lyr:  #循环feature
        pt = feat.geometry()
        pt_x = pt.GetX()
        pt_y = pt.GetY()
        name = feat.GetField('NAME')
        kind = feat.GetField('KIND')
        print(name, kind, (
            pt_x,
            pt_y,
        ))
        i += 1
        if i == 12:
            break
    del ds
Exemplo n.º 5
0
def main(sample_shp, img_shp, description=None):
    if description == None:
        sys.exit("缺少‘描述’ 程序不能运行!")
    vp = VectorPlotter(False)
    # 打开样本矢量
    sample_ds = ogr.Open(sample_shp, 1)
    sample_lyr = sample_ds.GetLayer(0)
    # 打开影像矢量
    image_ds = ogr.Open(img_shp)
    img_lyr = image_ds.GetLayer(0)
    # 过滤描述信息
    # sample_lyr.SetAttributeFilter('描述 = {}'.format(description))
    sample_lyr.ResetReading()
    sample_lyr.SetAttributeFilter("despict = {}".format("'" + description + "'"))
    count = 1
    total = sample_lyr.GetFeatureCount()
    for feat in sample_lyr:
        geom = feat.geometry().Clone()
        # 对影像矢量进行筛选
        img_lyr.ResetReading()
        img_lyr.SetSpatialFilter(geom)
        imgforfeat = []
        for img_feat in img_lyr:
            # 获取属性
            img_name = img_feat.GetField('browsefile')
            img_names = os.path.splitext(os.path.basename(img_name))[0].split("_")
            name_id = "_".join([img_names[0], img_names[4], img_names[5]])
            imgforfeat.append(name_id)
        img_lyr.SetSpatialFilter(None)
        str_name = "/".join(imgforfeat)
        feat.SetField('image', str_name)
        sample_lyr.SetFeature(feat)
        progress(count / total)
        count += 1
    sample_lyr.SetAttributeFilter(None)
    return None
Exemplo n.º 6
0
from osgeo import ogr
from matplotlib import pyplot as plt
from ospybook.vectorplotter import VectorPlotter

ring = ogr.Geometry(ogr.wkbLinearRing)
g = ogr.Geometry(ogr.wkbMultiPolygon)
ring.AddPoint(45, 78)
ring.AddPoint(23, 78)
ring.AddPoint(12, 56)
ring.AddPoint(56, 24)
polygon = ogr.Geometry(ogr.wkbPolygon)
polygon.AddGeometry(ring)
polygon.CloseRings()
g.AddGeometry(polygon)
vp = VectorPlotter(True)
ring = polygon.GetGeometryRef(0)
for i in range(ring.GetPointCount()):
    ring.SetPoint(i, ring.GetX(i) - 5, ring.GetY(i))
g.AddGeometry(polygon)
vp.plot(g, name='Polygon')

plt.ioff()
plt.show()
Exemplo n.º 7
0
box2 = ogr.Geometry(ogr.wkbLinearRing)
box2.AddPoint(89, 23)
box2.AddPoint(92, 23)
box2.AddPoint(92, 22)
box2.AddPoint(89, 22)
garden2 = ogr.Geometry(ogr.wkbPolygon)
garden2.AddGeometry(box2)

# 因为复合多边形是由一个人或多个多边形构成的,所以创建复合多边形向其中添加的是多边形。
gardens = ogr.Geometry(ogr.wkbMultiPolygon)
gardens.AddGeometry(garden1)
gardens.AddGeometry(garden2)
gardens.CloseRings()  # 一次性关闭所有的环
print(gardens)

vp = VectorPlotter(False)
vp.plot(gardens)

# 整体移动复合多边形
for i in range(gardens.GetGeometryCount()):
    ring = gardens.GetGeometryRef(i).GetGeometryRef(0)
    for j in range(ring.GetPointCount()):
        ring.SetPoint(j, ring.GetX(j) + 1, ring.GetY(j) + 0.5)
vp.plot(gardens, fill=False, ec='red', ls='dashed')

# 创建带有岛的多边形
lot = ogr.Geometry(ogr.wkbLinearRing)
lot.AddPoint(58, 38.5)
lot.AddPoint(53, 6)
lot.AddPoint(99.5, 19)
lot.AddPoint(73, 42)
Exemplo n.º 8
0
pb.print_attributes(fn, 3, ['NAME', 'POP_MAX'])

# Turn off geometries but skip field list parameters that come before the
# "geom" one.
#pb.print_attributes(fn, 3, geom=False)

# If you want to see what happens without the "geom" keyword in the last
# example, try this:
#pb.print_attributes(fn, 3, False)

# Import VectorPlotter and change directories
from ospybook.vectorplotter import VectorPlotter
os.chdir(os.path.join(data_dir, 'global'))

# Plot populated places on top of countries from an interactive session.
vp = VectorPlotter(True)
vp.plot('ne_50m_admin_0_countries.shp', fill=False)
vp.plot('ne_50m_populated_places.shp', 'bo')

# Plot populated places on top of countries non-interactively. Delete the vp
# variable if you tried the interactive one first.
del vp
vp = VectorPlotter(False)
vp.plot('ne_50m_admin_0_countries.shp', fill=False)
vp.plot('ne_50m_populated_places.shp', 'bo')
vp.draw()

#########################  3.4 Getting metadata  ##############################

# Open the large_cities data source.
fn = os.path.join(data_dir, 'Washington', 'large_cities.geojson')
Exemplo n.º 9
0
from osgeo import ogr, osr, gdal
import ospybook
from ospybook.vectorplotter import VectorPlotter
import pyproj
vp = VectorPlotter(False)  # 用于显示几何成果

# 创建控件参考对象
# sr = osr.SpatialReference() # 创建一个空的空间参考对象
# sr.ImportFromEPSG() # 使用EPSG码来定义空间参考系统,26912代表NAD83 UTM 12N
# # 使用proj4来定义空间参考系统
# #sr.ImportFromProj4('''+proj=utm +zone=12 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ''')
# print(sr.GetAttrValue('PROJCS'))

# 自定义空间坐标系
# sr = osr.SpatialReference()
# sr.SetProjCS('USER Albers') # 定义投影的名称
# sr.SetWellKnownGeogCS('NAD83') # 设定基准
# sr.SetACEA(29.5, 45.5, 23, -96, 0, 0) # 设定参数:标准平行线1, 标准平行线2, 中央纬线, 中央经线, 东移假定值, 北移假定值
# sr.Fixup() # 该函数用于为缺少的参数添加默认值,并重新排序项目,以使它们与标准匹配
# print(sr.Validate()) # 该函数用于确保没有缺少任何东西,返回一个0表示一切正常

# 几何对象重投影
# file_path = r"C:\Users\think\Desktop\python\python-for-GIS-DATA\osgeopy-data\osgeopy-data\global\ne_110m_land_1p.shp"
# world = ospybook.get_shp_geom(file_path) # 该方法可以从shape file中获得第一个几何对象
# tower = ogr.Geometry(wkt='POINT (2.294694 48.858093)') # 获取艾弗尔铁塔的位置
# # 使用AssignSpatialReference函数为几何对象分配SRS,但是它并不会将数据转换到该坐标系下,仅仅是提供空间信息
# tower.AssignSpatialReference(osr.SpatialReference(osr.SRS_WKT_WGS84)) # 因为WGS84坐标系很常用,所以在OSR模块中有一个常量,
#                                                                       # 用于表示该地理坐标系统的WKT。
# gdal.SetConfigOption('OGR_ENABLE_PARTIAL_REPROJECTION', 'TRUE') # 该方式可以修复,在进行web墨卡托投影时,南北极投影出错的问题
# web_mercator_sr = osr.SpatialReference() # 第一步还是创建空的空间参考对象
# web_mercator_sr.ImportFromEPSG(3857)
Exemplo n.º 10
0
def main(sample_shp1, out_shp):
    vp = VectorPlotter(False)
    water_ds = ogr.Open(sample_shp1)
    water_lyr = water_ds.GetLayer(0)
    # 准备输出的shp
    out_shp_ds = water_ds.GetDriver().CreateDataSource(out_shp)
    out_lyr = out_shp_ds.CreateLayer('category', srs=water_lyr.GetSpatialRef(), geom_type=water_lyr.GetGeomType())
    # 写入属性字段
    out_lyr.CreateFields(water_lyr.schema)
    # 新增字段
    coor_fld = ogr.FieldDefn('相交面', ogr.OFTString)
    coor_fld.SetWidth(50)
    out_lyr.CreateField(coor_fld)
    coor_fld.SetName("总品类")
    out_lyr.CreateField(coor_fld)
    # 创建初始要素
    out_defn = out_lyr.GetLayerDefn()
    out_feat = ogr.Feature(out_defn)

    mem_dri = ogr.GetDriverByName('Memory')
    mem_ds = mem_dri.CreateDataSource(' ')
    temp_lyr = mem_ds.CopyLayer(water_lyr, 'temp_lyr')
    water_lyr.ResetReading()
    for feat in water_lyr:
        geometry = feat.geometry().Clone()
        temp_lyr.SetSpatialFilter(geometry)
        for freq in range(temp_lyr.GetFeatureCount() - 1):
            pass







        # 拷贝feat
        category = new_feat.GetField('地类')
        objectid = new_feat.GetField('OBJECTID')
        for i in range(new_feat.GetFieldCount()):
            value = feat.GetField(i)
            out_feat.SetField(i, value)
        out_feat.SetField(out_feat.GetFieldCount() - 2, objectid)
        out_feat.SetField(out_feat.GetFieldCount() - 1, category)
        out_feat.SetGeometry(geometry)
        out_lyr.CreateFeature(out_feat)
        objectids = []
        categorys = []
        intersection_geom = []
        intersection_geom_temp = []
        objectids.append(str(objectid))
        categorys.append(category)
        intersection_geom_temp.append(geometry.Clone())

        for igeom in intersection_geom:
            for new_feat in temp_lyr:
                if new_feat.GetField('OBJECTID') in objectids:
                    continue
                category = new_feat.GetField('地类')
                objectid = new_feat.GetField('OBJECTID')
                new_geom = new_feat.geometry().Clone()
                intersection = new_geom.Intersection(geometry)
                if intersection.Area() != 0.0:
                    intersection_geom.append(intersection.Clone)
                    for i in range(new_feat.GetFieldCount()):
                        value = feat.GetField(i)
                        out_feat.SetField(i, value)
                    if category not in categorys:
                        categorys.append(category)
                    if objectid not in objectids:
                        objectids.append(str(objectid))
                    objectids.sort()
                    all_category = '/'.join(categorys)
                    all_objectid = '/'.join(objectids)

                    geometry = intersection.Clone()
                    out_feat.SetField(out_feat.GetFieldCount() - 2, all_objectid)
                    out_feat.SetField(out_feat.GetFieldCount() - 1, all_category)
                    out_feat.SetGeometry(intersection)
                    out_lyr.CreateFeature(out_feat)
            temp_lyr.SetSpatialFilter(None)
    out_shp_ds.SyncToDisk()
    out_shp_ds = None

    return None
Exemplo n.º 11
0
 def show_point(self, point):
     vp = VectorPlotter(False)
     vp.plot(point, 'bo')
     vp.draw()
Exemplo n.º 12
0
 def show_polygon(self, polygon):
     vp = VectorPlotter(False)
     vp.plot(polygon, fill=False, edgecolor='blue')
     vp.draw()
Exemplo n.º 13
0
 def show_line(self, line):
     vp = VectorPlotter(False)
     vp.plot(line, 'b-')
     vp.draw()