示例#1
0
def GetXYValueToRowsCols(PanPath,shapePath):
    #获得给定数据的投影参考系和地理参考系
    def getSRSPair(dataset):
        prosrs = osr.SpatialReference()
        prosrs.ImportFromWkt(dataset.GetProjection())
        geosrs = prosrs.CloneGeogCS()
        return prosrs, geosrs;
    #将经纬度坐标转为投影坐标(具体的投影坐标系由给定数据确定)
    def lonlat2geo(dataset, lon, lat):
        prosrs, geosrs = getSRSPair(dataset);
        ct = osr.CoordinateTransformation(geosrs, prosrs);
        coords = ct.TransformPoint(lon, lat);
        return coords[:2];
    #根据GDAL的六参数模型将给定的投影转为影像图上坐标(行列号)
    def geo2imagexy(dataset, x, y):
        trans = dataset.GetGeoTransform();
        a = np.array([[trans[1], trans[2]], [trans[4], trans[5]]]);
        b = np.array([x - trans[0], y - trans[3]]);
        return np.linalg.solve(a, b);  # 使用numpy的linalg.solve进行二元一次方程的求解
    #获取每个样本点shape的所有点的坐标,并转为全色影像对应的行列号
    ogr.RegisterAll();  # 注册所有的驱动
    ds = ogr.Open(shapePath,0);      lyr = ds.GetLayer(0);     
    DSpan = gdal.Open(PanPath);        # print(DSpan.GetProjection());
    RowsCols = [];       allLabel = [];
    for feat in lyr:
        pt = feat.geometry();    OneLabel = feat.GetField('LC'); 
        allLabel.append( int(OneLabel) );
        CoordsXY = lonlat2geo(DSpan,pt.GetX(),pt.GetY()); 
        tempRowCol = geo2imagexy(DSpan, CoordsXY[0], CoordsXY[1]);
        Row =int(math.floor( tempRowCol[1] ));  Col =int( math.floor( tempRowCol[0] ));
        RowsCols.append( [Row,Col] );
    return RowsCols,allLabel;
示例#2
0
def read_pointshp(filepath, filename):
    gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO")
    gdal.SetConfigOption("SHAPE_ENCODING", "")
    ogr.RegisterAll()
    driver = ogr.GetDriverByName('ESRI Shapefile')
    ds = ogr.Open(os.path.join(filepath, filename), 0)
    if ds == None:
        print('打开文件%s失败!' % os.path.join(filepath, filename))
    else:
        print('打开文件%s成功!' % os.path.join(filepath, filename))
    lyr = ds.GetLayer(0)
    feanum = lyr.GetFeatureCount()
    print('点个数', feanum)
    data_list = []
    field_index = []   #属性表表头索引
    defn = lyr.GetLayerDefn()
    iFieldCount = defn.GetFieldCount()
    for index in range(iFieldCount):
        oField = defn.GetFieldDefn(index)
        field_index.append(oField.GetNameRef())
    for i in range(feanum):
        feat = lyr.GetNextFeature()
        # data_list.append([])
        temp = []
        for index in field_index:
            temp.append(feat.GetField(index))
        temp.append(feat.geometry().GetX())
        temp.append(feat.geometry().GetY())
        temp.append(feat.geometry().GetZ())
        data_list.append(temp)
    listname_part = ['X','Y','Z']
    list_name = field_index + listname_part
    data_list.insert(0, list_name)
    return(data_list)
示例#3
0
def testLoad(serverDS, table, sourceFile):
    ogr.RegisterAll()
    shapeDS = ogr.Open(sourceFile)
    sourceLayer = shapeDS.GetLayerByIndex(0)
    options = []
    name = serverDS.CopyLayer(sourceLayer, table, options).GetName()
    return name
示例#4
0
    def readShp(self, shp):
        # 支持中文路径
        gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES")
        # 属性表字段支持中文
        gdal.SetConfigOption("SHAPE_ENCODING", "UTF-8")
        # 注册所有驱动
        ogr.RegisterAll()
        # 打开data
        dataS = ogr.Open(shp)
        # 获取该数据源中图层个数,一般shp数据图层只有一个。mdb,dxf等图层会有多个
        lyCount = dataS.GetLayerCount()
        # 获取第一个图层
        oLayer = dataS.GetLayerByIndex(0)
        # 图层初始化
        oLayer.ResetReading()
        # 获取图层中属性表表头并输出,可以定义建表语句
        print("属性表信息:")
        # 获取schema information,OGRFeatureDefn
        oDefn = oLayer.GetLayerDefn()
        # 获取字段数
        iFieldCount = oDefn.GetFieldCount()
        arrayF = []
        for i in range(len(iFieldCount)):
            # 获取对应i的字段FieldDefn
            oField = oDefn.GetFieldDefn(i)
            print("%s:%s(%d,%d)" % (
                # 获取对应字段的name
                oField.GetNameRef(),
                # 返回OGRFieldType type  fType=oField.GetType()
                # 返回char
                oField.GetFieldTypeName(oField.GetType()),
                # 返回int
                oField.GetWidth(),
                oField.GetPrecision()))
            # fetch field name
            arrayF.append(oField.GetNameRef())
        arrayF.append('geom')
        # feature number
        iFeatureCount = oLayer.GetFeatureCount(0)
        print(iFeatureCount)
        # fetch next feature
        oFeature = oLayer.GetNextFeature()
        result = []
        result.append(arrayF)
        while oFeature is not None:
            # 清空list
            arrayF.clear()
            # fetch the content of attribute table
            for i in range(len(iFeatureCount)):
                # fetch field value(string)
                arrayF.append(oFeature.GetfieldAsString)
                if i == 1: print(result)  #test
            # fetch geometry(object)
            oGeometry = oFeature.GetGeometryRef()
            arrayF.append(str(oGeometry))
            result.append(arrayF)

            oFeature = oLayer.GetNextFeature()

        return result
示例#5
0
def createShap():
    # 为了支持中文路径,请添加下面这句代码
    gdal.SetConfigOption( "GDAL_FILENAME_IS_UTF8", "NO" )
    # 为了使属性表字段支持中文,请添加下面这句
    gdal.SetConfigOption( "SHAPE_ENCODING", "" )
    # 注册所有的驱动
    ogr.RegisterAll()
    # 数据格式的驱动
    driver = ogr.GetDriverByName( 'ESRI Shapefile' )
    ds = driver.CreateDataSource( "E:\\arcgis\\point" )
    shapLayer = ds.CreateLayer( "poi", geom_type = ogr.wkbPoint );
    # 添加字段
    fieldDefn = ogr.FieldDefn( 'id', ogr.OFTString )
    fieldDefn.SetWidth( 4 )
    shapLayer.CreateField( fieldDefn );
    # 创建feature
    defn = shapLayer.GetLayerDefn()
    feature = ogr.Feature( defn ) ;
    # 添加属性
    feature.SetField( "id", "liu" )
    # 添加坐标
    point = ogr.Geometry( ogr.wkbPoint )
    point.AddPoint( float( 113.56647912 ), float( 22.16128203 ) )
    feature.SetGeometry( point );
    shapLayer.CreateFeature( feature )
    feature.Destroy()
    # 指定投影
    sr = osr.SpatialReference();
    sr.ImportFromEPSG( 32612 );
    prjFile = open( "E:\\arcgis\\point\\poi.prj", 'w' );
    sr.MorphToESRI();
    prjFile.write( sr.ExportToWkt() );
    prjFile.close();
    ds.Destroy()
示例#6
0
def main(argv):
    parser = argparse.ArgumentParser(prog=argv[0])
    parser.add_argument('-src', '--srcdir', dest='srcdir', required=True)
    parser.add_argument('-dst', '--dstdir', dest='dstdir', required=True)
    parser.add_argument('-v', '--vector', dest='vector', default=None)
    parser.add_argument('-p', '--plant', dest='plant', required=True)
    args = parser.parse_args(argv[1:])
    if not os.path.exists(args.dstdir):
        os.makedirs(args.dstdir)
    # 支持中文路径
    gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES")
    # 支持中文属性字段
    gdal.SetConfigOption("SHAPE_ENCODING", "GBK")
    # 注册所有ogr驱动
    ogr.RegisterAll()
    # 注册所有gdal驱动
    gdal.AllRegister()
    start_time = time.time()
    H8_dir_path = args.srcdir
    out_dir_path = args.dstdir
    shp = args.vector
    vegetation_mask = args.plant
    action(H8_dir_path, out_dir_path, veg_msk=vegetation_mask, shp_file=shp)
    end_time = time.time()
    print("time: %.4f secs." % (end_time - start_time))
示例#7
0
def _openVectorLayer(dlocation):
    ogr.RegisterAll()
    drv = ogr.GetDriverByName('ESRI Shapefile')
    try:
        ds = drv.Open(dlocation)
    except Exception, e:
        raise Exception, 'Invalid datasource, %s: %s' % (dlocation, str(e))
示例#8
0
def renameVector(strOldFile, strNewFile):
    # 注册所有的驱动
    ogr.RegisterAll()

    # 打开矢量
    oDS = ogr.Open(strOldFile, 0)
    if oDS == None:
        return

    oDriver = oDS.GetDriver()

    if oDriver == None:
        return

    oDDS = oDriver.CopyDataSource(oDS, strNewFile, [])
    oDDS.Destroy()
    # 重要:此处需要关闭数据源,如果不关闭,会导致删除shp时,无法完全删除shp文件
    oDS.Destroy()

    if oDDS == None:
        os.rename(strOldFile, strNewFile)

    if oDriver.DeleteDataSource(strOldFile) == ogr.OGRERR_NONE:
        return
    else:
        os.rename(strOldFile, strNewFile)
示例#9
0
def create_shape_file(file_url, shp_name, spatial_ref, shp_type, field_list):
    """
    产生ShpFile格式的文件
    :param file_url:ShapeFile存放地址
    :param shp_name:shp文件名称
    :param spatial_ref:shp文件空间坐标系
    :param shp_type:shp类型
    :param field_list:字段列表,field_list[i][0]字段名称,field_list[i][1]字段类型,field_list[i][2]字段宽度
    :return:数据源、数据层、要素类
    """
    gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "Yes")
    ogr.RegisterAll()
    driver = ogr.GetDriverByName("ESRI ShapeFile")
    target_data_source = driver.CreateDataSource(file_url)
    target_lyr = target_data_source.CreateLayer(shp_name, spatial_ref,
                                                shp_type)
    for field in field_list:
        field_defined = ogr.FieldDefn(field[0], field[1])
        field_defined.SetWidth(field[2])
        field_defined.SetPrecision(4)
        target_lyr.CreateField(field_defined)
    feature_defined = target_lyr.GetLayerDefn()
    feature = ogr.Feature(feature_defined)

    return target_data_source, target_lyr, feature
示例#10
0
 def get_intersection(self):
     gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO")  # 为了支持中文路径
     gdal.SetConfigOption("SHAPE_ENCODING", "CP936")  # 为了使属性表字段支持中文
     strVectorFile = self.out_name  # 定义写入路径及文件名
     ogr.RegisterAll()  # 注册所有的驱动
     strDriverName = "ESRI Shapefile"  # 创建数据,这里创建ESRI的shp文件
     oDriver = ogr.GetDriverByName(strDriverName)
     if oDriver == None:
         print("%s 驱动不可用!\n", strDriverName)
     oDS = oDriver.CreateDataSource(strVectorFile)  # 创建数据源
     if oDS == None:
         print("创建文件【%s】失败!", strVectorFile)
     srs = osr.SpatialReference()  # 创建空间参考
     srs.ImportFromEPSG(4326)  # 定义地理坐标系WGS1984
     papszLCO = []
     # 创建图层,创建一个多边形图层,"TestPolygon"->属性表名
     oLayer = oDS.CreateLayer(self.layer_name, srs, ogr.wkbPoint, papszLCO)
     if oLayer == None:
         print("图层创建失败!\n")
     oLayer.CreateField(ogr.FieldDefn("Latitude", ogr.OFTReal))
     # 创建 名为Latitude 的字段数据类型为 Double 23/15 . ogr.OFTReal->shapefile Double
     oLayer.CreateField(ogr.FieldDefn("Longitude", ogr.OFTReal))
     oLayer.CreateField(ogr.FieldDefn("shp_i_j", ogr.OFTString))
     self.handle_intersection(oLayer, oDS)
     return os.path.join(self.out_name, '{}.shp'.format(self.layer_name))
示例#11
0
def getBoxFromShp(shapeFile):
    """
    把shapefile的格网生成grid列表
    返回boxs的列表(fid,Box2d)
    """
    boxlist=[]
    gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","NO")
    gdal.SetConfigOption("SHAPE_ENCODING","")
    #i=0
    ogr.RegisterAll()
    ds=ogr.Open(shapeFile,0)
    if ds==None:
        return boxlist
    olayer=ds.GetLayerByIndex(0)
    if olayer==None:
        return boxlist
    olayer.ResetReading()
    oFeature=olayer.GetNextFeature()
    if not (olayer.GetGeomType()==3):
        return boxlist    
    while oFeature is not None:
        fid=oFeature.GetFID()
        print fid
        oGeometry=oFeature.GetGeometryRef()
        envelope=oGeometry.GetEnvelope()
        box=mapnik.Box2d(envelope[0],envelope[2],envelope[1],envelope[3])       
        boxlist.append((fid,box))
        oFeature=olayer.GetNextFeature()
    return boxlist
示例#12
0
def imagexy2shp(img_path, strVectorFile, bboxes, scores, clss, cls_dict):
    im_width, im_height, im_proj, im_geotrans, im_data, dataset = read_img(
        img_path)
    gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO")  # 为了支持中文路径
    gdal.SetConfigOption("SHAPE_ENCODING", "CP936")  # 为了使属性表字段支持中文
    ogr.RegisterAll()
    strDriverName = "ESRI Shapefile"  # 创建数据,这里创建ESRI的shp文件
    oDriver = ogr.GetDriverByName(strDriverName)
    if oDriver == None:
        print("%s 驱动不可用!\n", strDriverName)

    oDS = oDriver.CreateDataSource(strVectorFile)  # 创建数据源
    if oDS == None:
        print("创建文件【%s】失败!", strVectorFile)

    # srs = osr.SpatialReference()  # 创建空间参考
    # srs.ImportFromEPSG(4326)  # 定义地理坐标系WGS1984
    srs = osr.SpatialReference(
        wkt=dataset.GetProjection()
    )  #我在读栅格图的时候增加了输出dataset,这里就可以不用指定投影,实现全自动了,上面两行可以注释了,并且那个proj参数也可以去掉了,你们自己去掉吧
    papszLCO = []
    # 创建图层,创建一个多边形图层,"TestPolygon"->属性表名
    oLayer = oDS.CreateLayer("TestPolygon", srs, ogr.wkbPolygon, papszLCO)
    if oLayer == None:
        print("图层创建失败!\n")
    '''下面添加矢量数据,属性表数据、矢量数据坐标'''
    oFieldID = ogr.FieldDefn("cls", ogr.OFTString)  # 创建一个叫FieldID的整型属性
    oLayer.CreateField(oFieldID, 1)

    oFieldID = ogr.FieldDefn("Confidence", ogr.OFTInteger)  # 创建一个叫FieldID的整型属性
    oLayer.CreateField(oFieldID, 1)
    # oFieldName = ogr.FieldDefn("FieldName", ogr.OFTString)  # 创建一个叫FieldName的字符型属性
    # oFieldName.SetWidth(100)  # 定义字符长度为100
    # oLayer.CreateField(oFieldName, 1)

    oDefn = oLayer.GetLayerDefn()  # 定义要素
    # 创建单个面
    for bbox, score, cls in zip(bboxes, scores, clss):
        oFeatureTriangle = ogr.Feature(oDefn)
        oFeatureTriangle.SetField(
            0, cls_dict[int(cls)])  # 第一个参数表示第几个字段,第二个参数表示字段的值
        oFeatureTriangle.SetField(1, score)
        # oFeatureTriangle.SetField(1, "单个面")
        ring = ogr.Geometry(ogr.wkbLinearRing)  # 构建几何类型:线
        ring.AddPoint(bbox[0], bbox[1])  # 添加点01
        ring.AddPoint(bbox[2], bbox[1])  # 添加点02
        ring.AddPoint(bbox[2], bbox[3])  # 添加点03
        ring.AddPoint(bbox[0], bbox[3])  # 添加点04
        yard = ogr.Geometry(ogr.wkbPolygon)  # 构建几何类型:多边形
        yard.AddGeometry(ring)
        yard.CloseRings()

        geomTriangle = ogr.CreateGeometryFromWkt(str(yard))  # 将封闭后的多边形集添加到属性表
        oFeatureTriangle.SetGeometry(geomTriangle)
        oLayer.CreateFeature(oFeatureTriangle)

    oDS.Destroy()
    print("数据集创建完成!\n")
示例#13
0
def WriteVectorFile(shp_path, name, polygon):

    # 解决中文路径
    gdal.SetConfigOption('GDAL_FILENAME_IS_UTF8', 'YES')
    # 解决 SHAPE 文件的属性值
    gdal.SetConfigOption('SHAPE_ENCODING', 'GBK')

    # 注册所有的驱动
    ogr.RegisterAll()

    # 创建ESRI的shp文件
    strDriverName = "ESRI Shapefile"
    oDriver = ogr.GetDriverByName(strDriverName)
    if oDriver == None:
        print("驱动不可用!", )
        return

    # 创建数据源
    oDS = oDriver.CreateDataSource(shp_path)
    if oDS == None:
        print("创建文件失败!")
        return

    # 创建空间参考系,WGS84
    srs = osr.SpatialReference()
    srs.ImportFromEPSG(4326)

    # 创建图层,创建一个多边形图层
    papszLCO = []
    oLayer = oDS.CreateLayer("TestPolygon", srs, ogr.wkbPolygon, papszLCO)
    if oLayer == None:
        print("图层创建失败!\n")
        return

    # 下面创建属性表
    # 先创建一个叫FieldID的整型属性
    oFieldID = ogr.FieldDefn("FieldID", ogr.OFTInteger)
    oLayer.CreateField(oFieldID, 1)

    # 再创建一个叫FieldName的字符型属性,字符长度为100
    oFieldName = ogr.FieldDefn("FieldName", ogr.OFTString)
    oFieldName.SetWidth(100)
    oLayer.CreateField(oFieldName, 1)

    oDefn = oLayer.GetLayerDefn()

    # 创建要素
    oFeatureTriangle = ogr.Feature(oDefn)
    oFeatureTriangle.SetField(0, 0)
    oFeatureTriangle.SetField(1, name)
    #    geomTriangle =ogr.CreateGeometryFromWkt("POLYGON ((0 0,20 0,10 15,0 0))")
    geomTriangle = ogr.CreateGeometryFromWkt(polygon)
    oFeatureTriangle.SetGeometry(geomTriangle)
    oLayer.CreateFeature(oFeatureTriangle)

    oDS.Destroy()
    print("数据集创建完成!")
示例#14
0
def transform_shp(same_point, shp_path, res_path):
    road_tran = affine_fit(
        same_point[['x_before', 'y_before']].values.tolist(),
        same_point[['x_after', 'y_after']].values.tolist())
    # copy_shp(shp_path, res_path)
    gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO")
    # 为了使属性表字段支持中文,请添加下面这句
    gdal.SetConfigOption("SHAPE_ENCODING", "")
    res_name = os.path.basename(shp_path)
    strVectorFile = os.path.join(res_path, res_name)
    # 注册所有的驱动
    ogr.RegisterAll()
    # 创建数据,这里以创建ESRI的shp文件为例
    strDriverName = "ESRI Shapefile"
    oDriver = ogr.GetDriverByName(strDriverName)
    if oDriver == None:
        print("%s 驱动不可用!\n", strDriverName)
        return
    # 创建数据源
    oDS = oDriver.CreateDataSource(strVectorFile)
    if oDS == None:
        print("创建文件【%s】失败!", strVectorFile)
        return

    # 创建图层,创建一个多边形图层,这里没有指定空间参考,如果需要的话,需要在这里进行指定
    papszLCO = []
    oLayer = oDS.CreateLayer("road", None, ogr.wkbLineString, papszLCO)
    if oLayer == None:
        print("图层创建失败!\n")
        return

    # 下面创建属性表
    # 先创建一个叫FieldID的整型属性
    oLayer.CreateField(ogr.FieldDefn("FieldID", ogr.OFTInteger))
    # 再创建一个叫FeatureName的字符型属性,字符长度为50
    oLayer.CreateField(ogr.FieldDefn("FieldName", ogr.OFTString))
    oDefn = oLayer.GetLayerDefn()

    file = shapefile.Reader(shp_path)
    polygons = file.shapes()  # 一个shp由多个多边形组成
    for i, shp_i in enumerate(polygons):
        poly_list = []
        polygon_point = shp_i.points  # 第一个多边形的点集
        for j, point in enumerate(polygon_point):
            x, y = road_tran.transform([point[0], point[1]])
            poly_list.append('{} {}'.format(x, y))
        oFeature = ogr.Feature(oDefn)
        oFeature.SetField("FieldID", i)
        oFeature.SetField("FieldName", "test")
        geomLine = ogr.CreateGeometryFromWkt("LINESTRING ({})".format(
            ",".join(poly_list)))
        oFeature.SetGeometry(geomLine)
        oLayer.CreateFeature(oFeature)
    file.close()
    oDS.Destroy()
    print("数据集创建完成!\n")
示例#15
0
    def _vector_transform(self,src_file,dst_file,transform_method,format="shp"):
        '''

        :param src_file:
        :param dst_file:
        :param transform_method:
        :param format:
        :return:
        '''
        gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES")
        gdal.SetConfigOption("SHAPE_ENCODING", "GBK")
        ogr.RegisterAll()
        ds = ogr.Open(src_file, 0)
        if ds is None:
            print('Error: Could not open {}'.format(src_file))
            sys.exit(1)
        oLayer = ds.GetLayer()  # shp默认是一个layer
        if oLayer == None:
            print("Error: The layer did not open correctly!")
            sys.exit(1)
        sr = oLayer.GetSpatialRef()
        judge = self._judeg_isornot_wgs84(sr)
        if judge == 1:
            geom_type = oLayer.GetGeomType()  # 图层几何类型
            sr = oLayer.GetSpatialRef()
            # 创建输出的layer
            outds, outlayer = self._write_vector(dst_file, geom_type, sr)
            '''属性表结构获取与创建'''
            oDefn = oLayer.GetLayerDefn()
            iFieldCount = oDefn.GetFieldCount()  # 字段个数
            for i in range(iFieldCount):
                field_obj = oDefn.GetFieldDefn(i)
                (fieldname, fieldtype, fieldlength) = self._get_attribute_fieldname(field_obj)
                self._set_attribute_fieldname(outlayer, fieldname, fieldtype, fieldlength)  # 输出图层的属性表结构创建

            feature_count = oLayer.GetFeatureCount()
            outfeatureddefn = outlayer.GetLayerDefn()
            for j in tqdm(range(feature_count)):
                feature = oLayer.GetFeature(j)
                geom = feature.GetGeometryRef()  # wktvalue的字符串
                wkt_json = json.loads(geom.ExportToJson())  # json格式字符串

                '''计算wkt坐标的偏转'''
                self._vector_coord_transform(wkt_json, transform_method)
                new_geom = asShape(wkt_json)
                shape = ogr.CreateGeometryFromWkt(str(new_geom))
                outfeature = ogr.Feature(outfeatureddefn)
                outfeature.SetFrom(feature)
                outfeature.SetGeometry(shape)
                outlayer.CreateFeature(outfeature)
            outds.Destroy()
        else:
            print("Warning: The coordinate system of sourse vector file is not WGS84!")
            sys.exit(1)
示例#16
0
def createShap_point():
    '''
    原始数据的可视化
    :return: 
    '''
    data = read_point()
    path_out = r'../DATA/result/SHP'
    # 为了支持中文路径,请添加下面这句代码
    gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO")
    # 为了使属性表字段支持中文,请添加下面这句
    gdal.SetConfigOption("SHAPE_ENCODING", "")
    # 注册所有的驱动
    ogr.RegisterAll()
    # 数据格式的驱动
    driver = ogr.GetDriverByName('ESRI Shapefile')
    ds = driver.CreateDataSource(path_out)
    shapLayer = ds.CreateLayer("didi_point", geom_type=ogr.wkbPoint25D)
    # 添加字段
    # 先创建一个叫FieldID的整型属性
    oFieldID = ogr.FieldDefn("car_ID", ogr.OFTInteger)
    shapLayer.CreateField(oFieldID, 1)

    oFieldtype = ogr.FieldDefn("x", ogr.OFTString)
    shapLayer.CreateField(oFieldtype, 1)

    oFieldstart = ogr.FieldDefn("y", ogr.OFTString)
    shapLayer.CreateField(oFieldstart, 1)

    oFieldend = ogr.FieldDefn("t", ogr.OFTInteger)
    shapLayer.CreateField(oFieldend, 1)

    oFieldend = ogr.FieldDefn("type", ogr.OFTString)
    shapLayer.CreateField(oFieldend, 1)

    oDefn = shapLayer.GetLayerDefn()
    feature = ogr.Feature(oDefn)
    for line in data:
        feature.SetField(0, line[0])
        feature.SetField(1, line[1])
        feature.SetField(2, line[2])
        feature.SetField(3, int(line[3]))
        feature.SetField(4, line[4])

        line_f = ogr.Geometry(ogr.wkbPoint25D)

        x = float(line[1])
        y = float(line[2])
        t = (int(line[3]) - 1448380800) / 86400.0
        line_f.AddPoint(x, y, t)

        feature.SetGeometry(line_f)
        shapLayer.CreateFeature(feature)
    feature.Destroy()
    ds.Destroy()
示例#17
0
def writeRecShpFile(GF2Json, outPath, EPSG=4326):
    """
    将字典形式的矩形范围写入Shp文件当中
    :param GF2Json: 字典形式矩阵范围的Json文件,格式为{GridName:[左上经,左上纬,右下经,右下纬]}
    :param outPath: 输出shp路径
    :return: None
    """
    with open(GF2Json, 'r') as f:
        extentDict = json.load(f)

    ogr.RegisterAll()
    strDriverName = "ESRI Shapefile"
    oDriver = ogr.GetDriverByName(strDriverName)

    if oDriver == None:
        print("%s 驱动不可用!\n", strDriverName)
        return
    oDS = oDriver.CreateDataSource(outPath)
    if oDS == None:
        print("创建文件【%s】失败!", outPath)
        return
    # 创建WGS84坐标
    srs = osr.SpatialReference()
    srs.ImportFromEPSG(EPSG)
    oLayer = oDS.CreateLayer("GridRec",srs, ogr.wkbPolygon)
    if oLayer is None:
        print("图层创建失败!")
        return

    # oFieldID = ogr.FieldDefn("ID",ogr.OFTInteger)
    # oLayer.CreateField(oFieldID,1)
    oFieldName = ogr.FieldDefn('GridName',ogr.OFTString)
    oFieldName.SetWidth(100)
    oLayer.CreateField(oFieldName,1)
    for c,(k,v) in enumerate(extentDict.items()):
        for i,j in enumerate(v):
            print('Writing %s %d'%(k,i+1))
            extent = j['WGSExtent']
            feature = ogr.Feature(oLayer.GetLayerDefn())
            # feature.SetField(0,i)
            feature.SetField(0,p.get_pinyin(k,'')+str(i+1))
            wkt = 'POLYGON((%f %f,%f %f,%f %f,%f %f,%f %f))'%(
                extent[0],extent[1],extent[0],extent[3],
                extent[2],extent[3],extent[2],extent[1],extent[0],extent[1]
            )
            geoRec = ogr.CreateGeometryFromWkt(wkt)
            feature.SetGeometry(geoRec)
            oLayer.CreateFeature(feature)
            feature=None
    oDS.Destroy()
    print("%d 个城市已被统计!"%(c+1))
    print("shp文件生成完成!")
示例#18
0
 def init_create_shp(self):
     gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO")  # 为了支持中文路径
     gdal.SetConfigOption("SHAPE_ENCODING", "CP936")  # 为了使属性表字段支持中文
     strVectorFile = self.new_shp_path  # 定义写入路径及文件名
     ogr.RegisterAll()  # 注册所有的驱动
     strDriverName = "ESRI Shapefile"  # 创建数据,这里创建ESRI的shp文件
     oDriver = ogr.GetDriverByName(strDriverName)
     if oDriver == None:
         print("%s 驱动不可用!\n", strDriverName)
     oDS = oDriver.CreateDataSource(strVectorFile)  # 创建数据源
     if oDS == None:
         print("创建文件【%s】失败!", strVectorFile)
     return oDS
示例#19
0
    def PolygonToRaster(in_path,
                        out_path,
                        x_res,
                        y_res,
                        field_name,
                        out_bounds=None,
                        no_data=65535):
        """
        面矢量转为栅格
        :param in_path: str 输入矢量文件路径
        :param out_path: str 输出栅格文件路径
        :param x_res: float 输出栅格x向分辨率
        :param y_res: float 输出栅格y向分辨率
        :param field_name: str 栅格赋值的矢量字段名
        :param out_bounds: tuple 输出栅格范围  [xmin, ymin, xmax, ymax]
        :param no_data: int 无效值大小
        :return:
        """
        try:
            if not out_bounds:
                gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8",
                                     "NO")  # 为了支持中文路径,请添加
                gdal.SetConfigOption("SHAPE_ENCODING",
                                     "GBK")  # 为了使属性表字段支持中文,请添加
                ogr.RegisterAll()  # 注册所有的驱动
                layer = ogr.Open(in_path, gdal.GA_ReadOnly).GetLayer(0)
                shp_extent = layer.GetExtent()
                out_bounds = (shp_extent[0], shp_extent[2], shp_extent[1],
                              shp_extent[3])

            options = gdal.RasterizeOptions(outputBounds=out_bounds,
                                            outputType=gdal.GDT_UInt16,
                                            noData=no_data,
                                            attribute=field_name,
                                            useZ=False,
                                            xRes=x_res,
                                            yRes=y_res,
                                            format="GTiff")
            ds = gdal.Rasterize(out_path, in_path, options=options)

            if not ds:
                return False
            del ds
            return True

        except Exception as e:
            print(e)
            return False
示例#20
0
def ReadVectorFile(strVectorFile):
    # 为了支持中文路径,请添加下面这句代码
    gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO")
    # 为了使属性表字段支持中文,请添加下面这句
    gdal.SetConfigOption("SHAPE_ENCODING", "GB2312")

    # 注册所有的驱动
    ogr.RegisterAll()
    # 打开数据
    ds = ogr.Open(strVectorFile, 0)
    #判断文件是否存在
    if ds == None:
        print("打开文件【%s】失败!" % (strVectorFile))
        return
    #提示打开成功
    print("打开文件【%s】成功!" % (strVectorFile))
def open_vector_file(vec_file):
    # 支持文件中文路径
    gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO")
    # 支持文件中文字段
    gdal.SetConfigOption("SHAPE_ENCODING", "GB2312")
    # 注册驱动
    ogr.RegisterAll()
    # 打开数据源(以只读的方式)
    ds = ogr.Open(vec_file, 0)
    # 判断文件是否打开成功
    if ds is None:
        # 提出文件打开失败
        print("打开文件【%s】失败!" % vec_file)
        # 跳出循环
        return
    # 提示文件打开成功
    print("打开文件【%s】成功!" % vec_file)
示例#22
0
    def shp_file_create(self):
        gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES")
        gdal.SetConfigOption("SHAPE_ENCODING", "GBK")
        ogr.RegisterAll()
        # 注册驱动,打开测试文件和图层
        driver = ogr.GetDriverByName("ESRI Shapefile")
        # shp_file_path = SHP_FILE_PATH

        # 打开输出文件及图层
        # 输出模板shp 包含待写入的字段信息
        self.outds = driver.CreateDataSource(self.shp_path)
        # 创建空间参考
        srs = osr.SpatialReference()
        srs.ImportFromEPSG(4326)
        # 创建图层
        self.out_layer = self.outds.CreateLayer("out_polygon", srs,
                                                ogr.wkbMultiPolygon)
示例#23
0
def readShap():
    # 为了支持中文路径,请添加下面这句代码
    gdal.SetConfigOption( "GDAL_FILENAME_IS_UTF8", "NO" )
    # 为了使属性表字段支持中文,请添加下面这句
    gdal.SetConfigOption( "SHAPE_ENCODING", "" )
    # 注册所有的驱动
    ogr.RegisterAll()
    # 数据格式的驱动
    driver = ogr.GetDriverByName( 'ESRI Shapefile' )
    ds = driver.Open( 'E:\\arcgis\\data\\Export_Output.shp' );
    if ds is None:
        print 'Could not open 1km地铁站试验2.shp'
        sys.exit( 1 )
    # 获取第0个图层
    layer0 = ds.GetLayerByIndex( 0 );
    # 投影
    spatialRef = layer0.GetSpatialRef();
    # 输出图层中的要素个数
    print( '要素个数=%d', layer0.GetFeatureCount( 0 ) )
    print( '属性表结构信息' )
    defn = layer0.GetLayerDefn()
    iFieldCount = defn.GetFieldCount()
    for index in range( iFieldCount ):
        oField = defn.GetFieldDefn( index )
        print( '%s: %s(%d.%d)' % ( oField.GetNameRef(), oField.GetFieldTypeName( oField.GetType() ), oField.GetWidth(), oField.GetPrecision() ) )

    feature = layer0.GetNextFeature()
    # 下面开始遍历图层中的要素
    while feature is not None:
        # 获取要素中的属性表内容
        for index in range( iFieldCount ):
            oField = defn.GetFieldDefn( index )
            line = " %s (%s) = " % ( oField.GetNameRef(), oField.GetFieldTypeName( oField.GetType() ) )
            if feature.IsFieldSet( index ):
                line = line + "%s" % ( feature.GetFieldAsString( index ) )
            else:
                line = line + "(null)"
            print( line )
        # 获取要素中的几何体
        geometry = feature.GetGeometryRef()
        print geometry
        # 为了演示,只输出一个要素信息
        break
    feature.Destroy()
    ds.Destroy()
示例#24
0
    def __init__(self, stream_data, time_flag, x_flag, y_flag, od_x_flag,
                 od_y_flag):
        gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES")
        gdal.SetConfigOption("SHAPE_ENCODING", "")
        ogr.RegisterAll()

        self._stream_data = stream_data
        self._time_flag = time_flag
        self._lon_flag = x_flag
        self._lat_flag = y_flag
        self._od_lon_flag = od_x_flag
        self._od_lat_flag = od_y_flag
        self._srs_str = "GEOGCS[\"GCS_WGS_1984\",DATUM[\"D_WGS_1984\",SPHEROID[\"WGS_1984\",6378137.0,298.257223563]],PRIMEM[\"Greenwich\",0.0],UNIT[\"Degree\",0.0174532925199433]]"

        if (np.issubdtype(stream_data.index, np.datetime64) == False):
            self._stream_data[self._time_flag] = pd.to_datetime(
                self._stream_data[self._time_flag])
            self._stream_data = self._stream_data.set_index(self._time_flag)
示例#25
0
def WriteVectorFile(scaled_pred_polygons):
    gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO")

    gdal.SetConfigOption("SHAPE_ENCODING", "")

    strVectorFile = "E:/result/UnsupervisedModel/xingqing/15-16/img/quzao/15-16XQDenoising.shp"

    ogr.RegisterAll()

    strDriverName = "ESRI Shapefile"
    oDriver = ogr.GetDriverByName(strDriverName)
    if oDriver == None:
        print("%s 驱动不可用!\n", strDriverName)

    oDS = oDriver.CreateDataSource(strVectorFile)
    if oDS == None:
        print("创建文件【%s】失败!", strVectorFile)

    papszLCO = []
    oLayer = oDS.CreateLayer("TestPolygon", None, ogr.wkbPolygon, papszLCO)
    if oLayer == None:
        print("图层创建失败!\n")

    oFieldID = ogr.FieldDefn("FieldID", ogr.OFTInteger)
    oLayer.CreateField(oFieldID, 1)

    oFieldName = ogr.FieldDefn("FieldName", ogr.OFTString)
    oFieldName.SetWidth(100)
    oLayer.CreateField(oFieldName, 1)

    oDefn = oLayer.GetLayerDefn()

    i = 0
    for poly in scaled_pred_polygons:
        oFeatureTriangle = ogr.Feature(oDefn)
        oFeatureTriangle.SetField(0, i)
        oFeatureTriangle.SetField(1, "bianhua")
        geomTriangle = ogr.CreateGeometryFromWkt(poly.to_wkt())
        oFeatureTriangle.SetGeometry(geomTriangle)
        oLayer.CreateFeature(oFeatureTriangle)
        i = i + 1

    oDS.Destroy()
    print("数据集创建完成!")
示例#26
0
def statisticArea(shpPath):
    """读取属性表面积"""
    gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO")  # 为了支持中文路径,请添加
    gdal.SetConfigOption("SHAPE_ENCODING", "GBK")  # 为了使属性表字段支持中文,请添加
    ogr.RegisterAll()  # 注册所有的驱动

    ds = ogr.Open(shpPath, gdal.GA_ReadOnly)
    layer = ds.GetLayer(0)
    info = {}  # 用一个字典接收属性表记录

    fieldName = ['level', 'area']

    for field in fieldName:
        info[field] = []  # 接受某列数据
        for i in range(layer.GetFeatureCount()):
            feature = layer.GetFeature(i)
            info[field].append(feature.GetField(field))

    return pd.DataFrame(info)