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
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
def show_data(lyr): """ 显示数据,提供图层参数 :param lyr: :return: """ vp = VectorPlotter(False) vp.plot(lyr, 'bo') vp.draw()
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
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
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()
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)
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')
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)
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
def show_point(self, point): vp = VectorPlotter(False) vp.plot(point, 'bo') vp.draw()
def show_polygon(self, polygon): vp = VectorPlotter(False) vp.plot(polygon, fill=False, edgecolor='blue') vp.draw()
def show_line(self, line): vp = VectorPlotter(False) vp.plot(line, 'b-') vp.draw()