精华内容
参与话题
问答
  • gdal

    2019-10-21 17:12:46
    投影系 wgs84/EPSG 4326 地心坐标系 webmercator/EPSG 3857/900913 因为这个坐标系统是 Google Map 最先使用的,或者更确切地说,是Google 最先发明的。在投影过程中,将表示地球的参考椭球体近似的作为正球体处理...

    投影系

    wgs84/EPSG 4326

    地心坐标系

    webmercator/EPSG 3857/900913

    因为这个坐标系统是 Google Map 最先使用的,或者更确切地说,是Google 最先发明的。在投影过程中,将表示地球的参考椭球体近似的作为正球体处理(正球体半径 R = 椭球体半长轴 a)。这也是为什么在 ArcGIS 中我们经常看到这个坐标系叫 WGS 1984 Web Mercator (Auxiliary Sphere)。Auxiliary Sphere 就是在告知你,这个坐标在投影过程中,将椭球体近似为正球体做投影变换,虽然基准面是WGS 1984 椭球面.

    EPSG

    EPSP的英文全称是European Petroleum Survey Group,中文名称为欧洲石油调查组织。这个组织成立于1986年,2005年并入IOGP(InternationalAssociation of Oil & Gas Producers),中文名称为国际油气生产者协会.

    GCJ02

    GCJ-02是由中国国家测绘局(G表示Guojia国家,C表示Cehui测绘,J表示Ju局)制订的地理信息系统的坐标系统。
    它是一种对经纬度数据的加密算法,即加入随机的偏差。
    国内出版的各种地图系统(包括电子形式),必须至少采用GCJ-02对地理位置进行首次加密.

    Bd09

    百度坐标系

    CGCS2000

    CGCS2000与WGS84的基本定义是一致的,采用的参考椭球非常相近,椭球常数中仅扁率有细微差别,虽然因此会造成同一点在两个坐标系中的值会有微小差异,但是,在当前测量精度水平下这种微小差值是可以忽略的,因此,可以认为CGCS2000和WGS84是相容的,在坐标系的实现精度范围内两种坐标系下的坐标是一致的.

    投影系转换

    #coordTransform_utils.py
    gcj02_to_bd09(lng, lat)
    def bd09_to_gcj02(bd_lon, bd_lat)
    def wgs84_to_gcj02(lng, lat)
    def gcj02_to_wgs84(lng, lat)
    def wgs84_to_bd09(lon, lat)
    def lonlat2webmercator(lon,lat)
    def webmercator2lonlat(real_x,real_y)
    

    wgs或者gcj02坐标系的图片转为webmercator投影系

    import sys
    reload(sys)
    sys.setdefaultencoding('utf-8') 
    import gdal
    import osr
    import os
    import math
    from math import pi as PI
    from coordTransform_utils import *
    import cv2
    # lonLat is from GPS's WGS84
    # webMercator
    
    # longitude and latitude to web Mercator
    def lonlat2webmercator(lon,lat):
    	x = lon
    	y = math.log(math.tan((lat+90)*PI/360))/(PI/180)
    	[real_x,real_y]= map(lambda x: x*20037508.34/180 , [x, y])
    	return real_x,real_y
    
    # web Mercator to longitude and latitude
    def webmercator2lonlat(real_x,real_y):
    	x, y = map(lambda x: x/20037508.34*180 , [real_x,real_y])
    	y = 180/PI*(2*math.atan(math.exp(y*PI/180))-PI/2)
    	return x, y #lon,lat
    
    class WGS2WEBMERCATO:
    	def __init__(self):
    		self.driver = gdal.GetDriverByName('GTiff')
    		#--- REPROJECTION ---
    		self.webMercator = osr.SpatialReference()
    		self.webMercator.ImportFromEPSG(3857)  # web mercator 3857
    		self.wgs84 = osr.SpatialReference()
    		self.wgs84.ImportFromEPSG(4326)
    		
    		# Work out the boundaries of the new dataset in the target projection
    		self.coordTrans = osr.CoordinateTransformation(self.wgs84, self.webMercator)
    		
    	def wgs2webmercato(self,wgs_path,mercato_path,transform_method=1,create_method=1): 
    		base_img=gdal.Open(wgs_path)
    	
    		xsize=base_img.RasterXSize
    		ysize=base_img.RasterYSize
    		band=base_img.RasterCount
    	
    		adfGeoTransform=base_img.GetGeoTransform()
    		lon1=adfGeoTransform[0]
    		lat1=adfGeoTransform[3]
    		lon2=adfGeoTransform[0]+adfGeoTransform[1]*xsize
    		lat2=adfGeoTransform[3]+adfGeoTransform[5]*ysize
    	
    		if(transform_method==1):
    			
    			(real_x1, real_y1, real_z1) = self.coordTrans.TransformPoint(lon1, lat1)  # corner coords in utm meters
    			(real_x2, real_y2, real_z2) = self.coordTrans.TransformPoint(lon2, lat2)
    			resolution_x = (real_x2 - real_x1)/(xsize) # pixel size, utm meters
    			resolution_y = (real_y2 - real_y1)/(ysize)
    		else:
    			real_x1,real_y1=lonlat2webmercator(lon1,lat1)
    			real_x2,real_y2=lonlat2webmercator(lon2,lat2)
    			resolution_x=(real_x2-real_x1)/xsize
    			resolution_y=(real_y2-real_y1)/ysize
    	
    		if(create_method==1):
    			dest = self.driver.Create(mercato_path, xsize, ysize, band, gdal.GDT_Float32)
    			dest.SetGeoTransform([real_x1,resolution_x,0,real_y1,0,resolution_y])
    			dest.SetProjection(self.webMercator.ExportToWkt())
    			gdal.ReprojectImage(base_img, dest, self.wgs84.ExportToWkt(), self.webMercator.ExportToWkt(), gdal.GRA_Bilinear)
    		else:
    			dest = self.driver.CreateCopy(wgs_path,base_img)
    			dest.SetGeoTransform([real_x1,resolution_x,0,real_y1,0,resolution_y])
    			dest.SetProjection(self.webMercator.ExportToWkt())
    		
    		
    		for i in range(band):
    			dest.GetRasterBand(i+1).SetNoDataValue(0.0)
    
    		dest.FlushCache()  ##saves to disk!!
    		
    		print base_img.GetProjectionRef()
    		print base_img.GetGeoTransform()
    		print dest.GetProjectionRef()
    		print dest.GetGeoTransform()
    		
    		dest = None  # Flush the dataset to the disk
    		base_img = None  # only after the reprojected!
    		
    	def gcj022webmercator(self,base_path,mercato_path,lon1,lat1,lon2,lat2):
    		base_img=gdal.Open(base_path)
    	
    		xsize=base_img.RasterXSize
    		ysize=base_img.RasterYSize
    		band=base_img.RasterCount
    		
    		wgsLon1,wgsLat1=gcj02_to_wgs84(lon1,lat1)
    		wgsLon2,wgsLat2=gcj02_to_wgs84(lon2,lat2)
    		real_x1,real_y1=lonlat2webmercator(wgsLon1,wgsLat1)
    		real_x2,real_y2=lonlat2webmercator(wgsLon2,wgsLat2)
    				
    		resolution_x=(real_x2-real_x1)/xsize
    		resolution_y=(real_y2-real_y1)/ysize
    				
    		dest = self.driver.CreateCopy(mercato_path,base_img)
    		dest.SetProjection(self.webMercator.ExportToWkt())
    		dest.SetGeoTransform([real_x1, resolution_x, 0, real_y1, 0, resolution_y])  ##sets same projection as input
    		dest.FlushCache()  ##saves to disk!!
    		dest = None
    		base_img = None
    		
    def main():
    	wgs2webmercator=WGS2WEBMERCATO()
    	wgs2webmercator.wgs2webmercato("chengdu_dem.tif","chengdu_dem_test.tif")
    	
    	file=open("file_position_gcj02.txt","r")
    	
    	for line in file.readlines():
    		if (".png" in line):
    			line_list=line.split("	")
    			filename=line_list[0]
    			if(os.path.exists("seg_result\\"+filename.strip(".png")+".tif")):
    				lon1=float(line_list[1])
    				lat1=float(line_list[2])
    				lon2=float(line_list[3])
    				lat2=float(line_list[4])
    
    				wgs2webmercator.gcj022webmercator("seg_result\\"+filename.strip(".png")+".tif","E:\\work\\seg_image\\segimg\\add_info_seg\\",filename.strip(".png")+".tif",lon1,lat1,lon2,lat2)
    
    if __name__=="__main__":
    	main()
    

    TMS索引算法

    TMS,也称WMTS 切割地图0级为1tile 换算公式,google左上角为(0,0),TMS左下角为(0,0)。

    # -*- coding: utf-8 -*- 
    import unittest
    from PIL import Image
    import time
    import os
    import math
    from math import pi as PI
    from coordTransform_utils import *
    #从第0级开始排列
    resolution_wgs84=[1.40625,0.703125,0.3515625,0.17578125,0.087890625,0.0439453125,0.02197265625,
    				0.010986328125,0.0054931640625,0.00274658203125,0.001373291015625,0.0006866455078125,
    				0.00034332275390625,0.000171661376953125,0.0000858306884765625,0.00004291534423828125,
    				0.000021457672119140625,0.000010728836059570312,0.000005364418029785156,
    				0.000002682209014892578,0.000001341104507446289]
    tile_range=[[0,0,-1,-1],            #0
    			[0,1,-1,-1],            #1
    			[0,3,-2,-1],            #2
    			[0,7,-4,-1],            #3
    			[0,15,-8,-1],           #4
    			[0,31,-16,-1],          #5
    			[0,63,-32,-1],          #6
    			[0,127,-64,-1],         #7
    			[0,255,-128,-1],        #8
    			[0,511,-256,-1],        #9
    			[0,1023,-512,-1],       #10
    			[0,2047,-1024,-1],      #11
    			[0,4095,-2048,-1],      #12
    			[0,8191,-4096,-1],      #13
    			[0,16383,-8192,-1],     #14
    			[0,32767,-16384,-1],    #15
    			[0,65535,-32768,-1],    #16
    			[0,131071,-65536,-1],   #17
    			[0,262143,-131072,-1],  #18
    			[0,524287,-262144,-1],  #19
    			[0,1048575,-524288,-1]] #20
    # TMS,也称WMTS 切割地图0级为1tile 换算公式,google左上角为(0,0),TMS左下角为(0,0)
    def lonlat2webmercatotile_google(zoom,lon,lat):
    	#lonlat2mercatotile(12,-180,85.05112877980659) 计算结果为(0,0)
    	#lonlat2mercatotile(12,-180,-85.05112877980659) 计算结果为(0,4095)
    	n=math.pow(2,zoom)
    	xtile=int(((lon+180.0)/360.0)*n)
    	ytile=int((1-(math.log(math.tan(PI/180.0*lat)+1.0/math.cos(PI/180.0*lat))/PI))/2*n)
    	return xtile,ytile
    
    def webmercatotile2lonlat_google(zoom,xtile,ytile):
    	n=math.pow(2,zoom)
    	lon=float(xtile)/n*360.0-180.0
    	lat_rad=math.atan(math.sinh(PI*(1-2.0*ytile/n)))
    	lat=lat_rad*180.0/PI
    	return lon,lat
    
    def lonlat2webmercatotile_TMS(zoom,lon,lat):
    	n=math.pow(2,zoom)
    	xtile=int(((lon+180.0)/360.0)*n)
    	ytile=int((1-(math.log(math.tan(PI/180.0*lat)+1.0/math.cos(PI/180.0*lat))/PI))/2*n)
    	ytile=n-1-ytile
    	return xtile,ytile
    
    def webmercatotile2lonlat_TMS(zoom,xtile,ytile):
    	n=math.pow(2,zoom)
    	ytile=n-1-ytile
    	lon=float(xtile)/n*360.0-180.0
    	lat_rad=math.atan(math.sinh(PI*(1-2.0*ytile/n)))
    	lat=lat_rad*180.0/PI
    	return lon,lat
    def lonlat2tile_wgs84(zoom,lon,lat):#描述了wgs84(4326坐标系下)生成瓦片及经纬度对应关系
    	tileSize=256
    	origin=[-180,90]
    	adjustX=0
    	adjustY=0.5
    	resolution=resolution_wgs84[zoom]
    	xtile=math.floor((lon-origin[0])/resolution+adjustX)
    	ytile=math.floor((lat-origin[1])/resolution+adjustY)
    	xtile=int(math.floor(xtile/tileSize))
    	ytile=int(abs(math.floor(ytile/tileSize))-1)
    	return xtile,ytile
    def tile2lonlat_wgs84(zoom,xtile,ytile):#求出瓦片对应经纬度
    	tileSize=256
    	origin=[-180,90]
    	resolution=resolution_wgs84[zoom]
    	min_lon=origin[0]+xtile*tileSize*resolution
    	max_lat=origin[1]-ytile*tileSize*resolution
    	max_lon=origin[0]+(xtile+1)*tileSize*resolution
    	min_lat=origin[1]-(ytile+1)*tileSize*resolution
    	return min_lon,max_lon,min_lat,max_lat
    def tilerange(zoom,lon,lat,sizeX,sizeY):
    	tileSize=256
    	origin=[-180,90]
    	resolution=resolution_wgs84[zoom]
    	lat_len=resolution*sizeY
    	lon_len=resolution*sizeX
    	min_lon=lon-lon_len/2
    	max_lon=lon+lon_len/2
    	max_lat=lat+lat_len/2
    	min_lat=lat-lat_len/2
    	tilestartX,tilestartY,tileendX,tileendY=getTileRangeForExtentAndZ([min_lon,min_lat,max_lon,max_lat],zoom)
    	return int(tilestartX),int(math.floor(abs(tileendY))-1),int(tileendX),int(math.floor(abs(tilestartY))-1)
    def getTileCoordForXYAndZ_(x, y, z, reverseIntersectionPolicy):
    	origin = [-180,90]
    	resolution = resolution_wgs84[z]
    	tileSize = [256,256]
    	
    	adjustX = 0.5 if reverseIntersectionPolicy else 0
    	adjustY = 0 if reverseIntersectionPolicy else 0.5
    	xFromOrigin = math.floor((x - origin[0]) / resolution + adjustX)
    	yFromOrigin = math.floor((y - origin[1]) / resolution + adjustY)
    	tileCoordX = xFromOrigin / tileSize[0]
    	tileCoordY = yFromOrigin / tileSize[1]
    	
    	if(reverseIntersectionPolicy):
    		tileCoordX = math.ceil(tileCoordX) - 1
    		tileCoordY = math.ceil(tileCoordY) - 1
    	else:
    		tileCoordX = math.floor(tileCoordX)
    		tileCoordY = math.floor(tileCoordY)
    	return tileCoordX,tileCoordY
    def getTileRangeForExtentAndZ(extent, z):
    	minX,minY=getTileCoordForXYAndZ_(extent[0], extent[1], z, False)
    	maxX,maxY=getTileCoordForXYAndZ_(extent[2], extent[3], z, True)
    	return minX,minY,maxX,maxY
    def getTileRangeExtent(z, tileRange):
    	origin = [-180,90]
    	resolution = resolution_wgs84[z]
    	tileSize = [256,256]
    	minX = origin[0] + tileRange.minX * tileSize[0] * resolution
    	maxX = origin[0] + (tileRange.maxX + 1) * tileSize[0] * resolution
    	minY = origin[1] + tileRange.minY * tileSize[1] * resolution
    	maxY = origin[1] + (tileRange.maxY + 1) * tileSize[1] * resolution
    

    GDAL和OGR

    gdal_merge

    图像合并

    方法:gdal_merge

    • a_nodata 目标图像无数据时指定值

    • co 参数。格式:key=value。COMPRESS=JPEG:使用JPEG压缩方式。JPEG_QUALITY=75。JPEG压缩率

    • of 输出格式。默认为GTiff(GeoTiff)

    • o 输出图像。默认(out.tif)

    • –optfile 文件目录
      dir /b /s path\*.tif > listtif.txt

      gdal_merge.bat -a_nodata 0 -co COMPRESS=JPEG -co JPEG_QUALITY=75 -of GTiff -o merge.tif J1.tif J2.tif J3.tif J4.tif

    保持输入图像波段不变

    方法:gdal_merge

    • of 输出格式。默认为GTiff(GeoTiff)

    • o 输出图像。默认(out.tif)

    • separate 将为每个输入图像的通道保留在目标图像的单独通道中

      gdal_merge.bat -separate -of GTiff -o merge.tif J1.tif J2.tif J3.tif J4.tif

    输出指定部分数据(将结果进行裁剪)

    方法:gdal_merge

    • ul_lr upper left lower right,左上角到右下角范围。默认使用全部范围

    • of 输出格式。默认为GTiff(GeoTiff)

    • o 输出图像。默认(out.tif)

      gdal_merge.bat -ul_lr 114.01 39.99 114.03 39.97 -of GTiff -o merge.tif J1.tif J2.tif J3.tif J4.tif

    输出指定分辨率数据

    方法:gdal_merge

    • ps xpixelsize ypixelsize,xy两个方向的输出分辨率。默认使用第一幅图像的分辨率。注意Y的方向

    • of 输出格式。默认为GTiff(GeoTiff)

    • o 输出图像。默认(out.tif)

      gdal_merge.bat -ps 2.14577e-05 -2.14577e-05 -of GTiff -o merge.tif J1.tif J2.tif J3.tif J4.tif

    gdalinfo

    方法:gdalinfo

    • json 标记是否以json形式输出

    • mm 标记是否强制计算每波段的MAX及MIN

    • proj4 以PROJ4字符串形式显示图像的地理坐标系

      gdalinfo -proj4 test.tif

    gdal_translate

    gdal_translate:转换工具。包括裁剪,格式转换等。可能会进行重采样、取子集、变换分辨率等,只能使用nearest重采样方法。

    地理范围裁剪

    方法:gdal_translate

    • a_nodata 目标图像无数据时指定值

    • projwin地理范围,left,top,right,bottom。

      gdal_translate -a_nodata 0 -projwin 124.889360673 44.2782385899 125.011173148 44.1042207686 -of GTiff src.tif out.tif

    像素范围裁剪

    方法:gdal_translate

    • a_nodata 目标图像无数据时指定值

    • srcwin 输出范围。

      gdal_translate -a_nodata 0 -srcwin 0 0 100 200 -of GTiff src.tif out.tif

    缩放

    方法:gdal_translate

    • outsize 输出范围,格式 xsize,ysize。如果有%,则按百分比输出

      gdal_translate -outsize 200% 200% -of GTiff src.tif out.tif

    转换为JPEG

    方法:gdal_translate

    • b n:指定第几个波段对应的源数据波段数n。可以有多个。如果不指定,默认情况下是一一对应

      gdal_translate -of JPEG -b 1 -b 2 -b 3 source.tif test.jpg

    定义坐标系统(不能进行投影变换,只能定义)

    方法:gdal_translate

    • a_srs assign srs指定的坐标系统

      gdal_translate -a_srs EPSG:32650 -of GTiff source.tif test.jpg

    gdaldem

    山体阴影

    方法:gdaldem hillshade

    • z vertical exaggeration used to pre-multiply the elevations

    • s ratio of vertical units to horizontal. If the horizontal unit of the source DEM is degrees (e.g Lat/Long WGS84 projection), you can use scale=111120 if the vertical units are meters (or scale=370400 if they are in feet)

    • az azimuth of the light, in degrees. 0 if it comes from the top of the raster, 90 from the east

    • alt altitude of the light, in degrees. 90 if the light comes from above the DEM, 0 if it is raking light

      gdaldemhillshade alt.tif shade.tif -z 5 -s 111120 -az 90

    彩色地形图

    方法:gdaldem color-relief

    调色板内容

    65535 255 255 255
    5800 254 254 254
    3000 121 117 10
    1500 151 106 47
    800 127 166 122
    500 213 213 149
    1 218 179 122
    
    gdaldem color-relief alt.tif ramp.txt relief.tif
    

    合并彩色地形图和山体阴影

    hsv_merge.py relief.tif shade.tif colour_shade.tif
    

    裁切和掩码

    gdalwarp -co compress=deflate -dstnodata 255 -cutline Tanzania.shp  colour_shade.tif colour_shade_clipped.tif
    

    gdalwarp

    坐标系统变换/投影变换

    方法:gdalwarp

    • overwrite 如果目标图像已经存在,则重写(覆盖)

    • s_srs 源坐标系统

    • t_srs 目标坐标系统。可以识别EPSG、PROJ4或者wkt的prj文件

    • r 重采样方法near:最邻近值(默认,最快,质量差),bilinear:双线性内插(用的较多),Cubic:三次方,Cubic Spline:三次样条,Lanczos,Average,mode:出现次数最多

    • wm warp caching memory,缓存大小(单位:MB)

    • multi 多线程

    • dstnodata 目标图像无值时填充值

    • q quiet 不显示进度等处理信息

    • cutline 指定裁剪的mask矢量图层

    • dstalpha 指定透明通道,对于无数据值的像素设置为透明

    • of output format,指定输出目标图像格式。默认为GeoTiff(GTiff)

    • te 输出图像的范围,则使用的是输出图像的坐标系统

    • tr xres yres。设置目标图像的分辨率。不可与-ts共存

    • ts target size,目标图像大小,格式:宽高,单位(像素)。不能与-tr共存

    • co COMPRESS=JPEG 使用JPEG压缩,支持以下压缩格式:[JPEG/LZW/PACKBITS/DEFLATE/CCITTRLE/CCITTFAX3/CCITTFAX4/NONE],在使用JPEG时,可以设置压缩率(-co JPEG_QUALITY=[1-100]),默认是75%

      gdalwarp -overwrite -s_srs EPSG:4326 -t_srs EPSG:32650 -r bilinear -wm 20 -ts 3000 3000 -multi -dstnodata 0 -q -cutline grid-polygon.shp -dstalpha -of GTiff Korea.png ttttt.tif

    矢量裁剪

    方法:gdalwarp

    • crop_to_cutline 将目标图像的范围指定为cutline 矢量图像的范围

      gdalwarp -dstnodata 0 -q –cutline cutpolygon.shp -crop_to_cutline -dstalpha -of GTiff test.tif clipper-poly-alpha.tif

    gdal2tiles

    方法:gdal2tiles

    • p Tile cutting profile(mercator,geodetic,raster) - default ‘mercator’ (Google Maps compatible)

    • r Resampling method(average,near,bilinear,cubic,cubicspline,lanczos,antialias) - default’average’

    • s The spatial reference system used for thesource input data

    • z Zoom levels to render (format:‘2-5’ or’10’)

    • e Resume mode. Generate only missing files

    • a NODATA transparency value to assign to theinput data

      gdal2tiles -p mercator -s EPSG:3857 -z 10-15 3857.tif path/mercatortiles

    安装proj

    conda install -c conda-forge proj
    

    栅格操作

    获取driver

    fileformat = "GTiff"
    driver = gdal.GetDriverByName(fileformat)
    

    打开文件

    from osgeo import gdal
    dataset = gdal.Open(filename, gdal.GA_ReadOnly)
    if not dataset:
        ...
    

    图片信息

    print("Driver: {}/{}".format(dataset.GetDriver().ShortName,
                            dataset.GetDriver().LongName))
    print("Size is {} x {} x {}".format(dataset.RasterXSize,
                                        dataset.RasterYSize,
                                        dataset.RasterCount))
    print("Projection is {}".format(dataset.GetProjection()))
    geotransform = dataset.GetGeoTransform()
    if geotransform:
        print("Origin = ({}, {})".format(geotransform[0], geotransform[3]))
        print("Pixel Size = ({}, {})".format(geotransform[1], geotransform[5]))
    dataset.GetProjectionRef()
    

    获取通道

    band = dataset.GetRasterBand(1)
    print("Band Type={}".format(gdal.GetDataTypeName(band.DataType)))
    
    min = band.GetMinimum()
    max = band.GetMaximum()
    if not min or not max:
    (min,max) = band.ComputeRasterMinMax(True)
    print("Min={:.3f}, Max={:.3f}".format(min,max))
    
    if band.GetOverviewCount() > 0:
    print("Band has {} overviews".format(band.GetOverviewCount()))
    
    if band.GetRasterColorTable():
    print("Band has a color table with {} entries".format(band.GetRasterColorTable().GetCount()))
    

    转为numpy

    band = ds.GetRasterBand(1)
    data = band.ReadAsArray(xOffset, yOffset, cols, rows)
    

    复制文件

    fileformat = "GTiff"
    driver = gdal.GetDriverByName(fileformat)
    metadata = driver.GetMetadata()
    if metadata.get(gdal.DCAP_CREATE) == "YES":
        print("Driver {} supports Create() method.".format(fileformat))
    
    if metadata.get(gdal.DCAP_CREATE) == "YES":
        print("Driver {} supports CreateCopy() method.".format(fileformat))
    
    src_ds = gdal.Open(src_filename)
    dst_ds = driver.CreateCopy(dst_filename, src_ds, strict=0)
    # Once we're done, close properly the dataset
    dst_ds = None
    src_ds = None
    
    dst_ds = driver.Create(dst_filename, xsize=512, ysize=512, bands=1, eType=gdal.GDT_Byte)
    

    添加变换和投影

    from osgeo import osr
    import numpy
    dst_ds.SetGeoTransform([444720, 30, 0, 3751320, 0, -30])
    srs = osr.SpatialReference()
    srs.ImportFromEPSG(900913)
    dst_ds.SetProjection(srs.ExportToWkt())
    raster = numpy.zeros((512, 512), dtype=numpy.uint8)
    dst_ds.GetRasterBand(1).WriteArray(raster)
    # Once we're done, close properly the dataset
    dst_ds = None
    

    设置未知值

    `img.GetRasterBand(1).SetNoDataValue(0.0)`
    

    刷新到磁盘

    img.FlushCache()
    

    矢量操作

    导入

    try:
        from osgeo import ogr
    except:
        import ogr
    

    获取driver

    driver = ogr.GetDriverByName(‘ESRI Shapefile’)
    

    读文件

    filename = 'C:/Users/gongwei/Documents/My eBooks/python_and_sage/GDAL python/test/ospy_data1/sites.shp'
    dataSource = driver.Open(filename,0)
    if dataSource is None:
        print 'could not open'
        sys.exit(1)
    print 'done!'
    

    读取数据层

    layer = dataSource.GetLayer(0)
    

    数据层要素个素

    n = layer.GetFeatureCount()
    print 'feature count:', n
    

    读取边界

    extent = layer.GetExtent()
    

    读取要素

    feat = layer.GetFeature(41)
    fid = feat.GetField('id')
    print fid
    feat = layer.GetFeature(0)
    fid = feat.GetField('id') #should be a different id
    print fid
    

    遍历要素

    feat = layer.GetNextFeature()  #读取下一个
    while feat:
        feat = layer.GetNextFeature()
    layer.ResetReading()  #复位
    

    提取要素几何形状

    geom = feat.GetGeometryRef()
    

    释放内存

    feature.Destroy()
    dataSource.Destroy()
    

    创建新文件

    driver.CreateDataSource(<filename>)
    

    删除文件

    driver.DeleteDataSource(‘test.shp’)
    

    创建layer

    dataSource.CreateLayer(<name>,CreateLayer(<name>, geom_type=<OGRwkbGeometryType>, [srs])
    ds2 = driver.CreateDataSource('test.shp')
    layer2 = ds2.CreateLayer('test', geom_type=ogr.wkbPoint)
    

    添加字段

    要添加一个新字段,只能在layer里面加,而且还不能有数据

    添加的字段如果是字符串,还要设定宽度

    fieldDefn = ogr.FieldDefn('id', ogr.OFTString)
    fieldDefn.SetWidth(4)
    layer.CreateField(fieldDefn)
    

    添加要素

    featureDefn = layer.GetLayerDefn()
    feature = ogr.Feature(featureDefn)
    feature.SetGeometry(point) #设定几何形状
    feature.SetField('id', 23) #设定要素值
    layer.CreateFeature(feature) #写入layer
    

    新建点

    point = ogr.Geometry(ogr.wkbPoint)
    point.AddPoint(10,20)
    

    新建线

    line = ogr.Geometry(ogr.wkbLineString)
    line.AddPoint(10,10)
    line.AddPoint(20,20)
    line.SetPoint(0,30,30)   #(10,10) -> (30,30)
    print line.GetPointCount() #统计所有点数目
    print line.GetX(0) #读取0点x坐标和y坐标
    print line.GetY(0)
    

    新建多边形

    outring = ogr.Geometry(ogr.wkbLinearRing)
    outring.AddPoint(0,0)
    outring.AddPoint(100,0)
    outring.AddPoint(100,100)
    outring.AddPoint(0,100)
    outring.AddPoint(0,0)
    
    inring = ogr.Geometry(ogr.wkbLinearRing)inring = ogr.Geometry(ogr.wkbLinearRing)
    inring.AddPoint(25,25)
    inring.AddPoint(75,25)
    inring.AddPoint(75,75)
    inring.AddPoint(25,75)
    inring.CloseRings()
    
    polygon = ogr.Geometry(ogr.wkbPolygon)
    polygon.AddGeometry(outring)
    polygon.AddGeometry(inring)
    print polygon.GetGeometryCount() #统计多边形几何数目
    

    新建复合几何

    multipoint = ogr.Geometry(ogr.wkbMultiPoint)
    point = ogr.Geometry(ogr.wkbPoint)point = ogr.Geometry(ogr.wkbPoint)
    point.AddPoint(10,10)
    multipoint.AddGeometry(point)
    point.AddPoint(20,20)
    multipoint.AddGeometry(point)
    

    读取层或几何投影信息

    投影信息一般存储在.prj文件中,如果没有这个文件,函数返回None

    spatialRef = layer.GetSpatialRef()
    spatialRef = geom.GetSpatialReference()
    

    新建投影及投影变换

    sourceSR = osr.SpatialReference()
    sourceSR.ImportFromEPSG(32612) #UTM 12N WGS84
    targetSR = osr.SpatialReference()
    targetSR.ImportFromEPSG(4326) #Geo WGS84
    coordTrans = osr.CoordinateTransformation(sourceSR, targetSR)
    geom.Transform(coordTrans)
    

    写投影文件

    targetSR.MorphToESRI()
    file = open('test.prj', 'w')
    file.write(targetSR.ExportToWkt())
    ffile.close()
    

    属性过滤器

    layer.SetAttributeFilter("cover = 'shrubs'")
    layer.GetFeatureCount()
    layer.SetAttributeFilter(None)
    layer.GetFeatureCount()
    

    空间过滤器

    layerSites.SetSpatialFilterRect(460000, 4590000, 490000, 4600000)
    layerSites.GetFeatureCount()
    layerSites.SetSpatialFilter(None)
    layerSites.GetFeatureCount()
    

    空间操作

    poly2.Intersect(poly1) #相交
    poly2.Disjoint(poly1) #不相交
    poly2.Touches(poly1) #相邻(擦边)
    poly2.Crosses(line) #穿越,一般是线穿越多边形
    ptB.Within(poly1) #一个要素被另一个要素包围
    poly1.Contains(ptB) #和Within参数相反
    poly2.Overlaps(poly3) #两个多边形是否重叠
    

    简单数据处理

    多边形的:
    
    交:poly3.Intersection(poly2)
    
    并:poly3.Union(poly2)
    
    差:poly3.Difference(poly2)
    
    补:poly3.SymmetricDifference(poly2)
    
    geometry的:
    
    <geom>.Buffer(<distance>) 给geometry加buffer,就是把点线变成多边形,变粗了
    
    <geom1>.Equal(<geom2>) 两个geometry相等吗?
    
    <geom1>.Distance(<geom2>) 返回两个geometry之间的最短距离
    
    <geom>.GetEnvelope() 信封,有意思,其实就是用一个方框框住这个几何形状,返回四个角的坐标(minx, maxx, miny, maxy)
    
    展开全文
  • GDAL

    千次阅读 2018-07-15 16:45:31
    一、GDAL是一个读写空间数据(空间数据包括栅格数据和矢量数据)的开源库(但不仅限于此,此外还提 供了一些非常常用的算法和工具). GDAL官方网站http://www.gdal.org/  GDAL源代码下载地址:...
    一、GDAL是一个读写空间数据(空间数据包括栅格数据和矢量数据)的开源库(但不仅限于此,此外还提         供了一些非常常用的算法和工具).
        GDAL官方网站http://www.gdal.org/
     GDAL源代码下载地址:http://trac.osgeo.org/gdal/wiki/DownloadSource。我下载的gdal-1.8.1。
    二、编译步骤:
    1、首先进入GDAL的源代码目录,找到makegdal10.sln(表示使用的是VS2010)并打开。在VS的解决方案资源管理器中的makegdal上右键----重新生成。编译完成后会在GDAL的源代码目录中会出现gdal.lib,gdal_i.lib,gdal18.dll等文件,如果没有修改GDAL中的nmake.opt文件,那么同时会在你的C盘中会出现一个“C:\warmerda\bld”文件夹。
    2、使用cmd编译
    (1)点击开始--搜索程序和文件处输入cmd,在dos窗口下切换目录到源代码目录(使用cd命令切换,cd ..切换到上一级。实验中使用window+R键,然后输入cmd,此时使用命令行参数会有错误,最好使用Microsoft Visual Studio 2010 的Tools下的命令提示工具打开dos窗口)。如下图:
    GDAL - 123 - 123123
      (2)依次输入如下命令
        nmake -f makefile.vc

    nmake -f makefile.vc install

    nmake -f makefile.vc devinstall

         nmake -f makefile.vc clean

    nmake -f makefile.vc MSVC_VER=1600 clean

    nmake -f makefile.vc MSVC_VER=1600 DEBUG=1

    注:VS2010下MSVC_VER=1600 的值才为1600,其它版本根据情况查阅

    3.集成geos

    下载网址:http://trac.osgeo.org/geos/

    将gdal源码目录中的nmake.opt中的

    #GEOS_DIR=C:/warmerda/geos

    #GEOS_CFLAGS =-I$(GEOS_DIR)/capi -I$(GEOS_DIR)/source/headers -DHAVE_GEOS

    #GEOS_LIB     =$(GEOS_DIR)/source/geos_c_i.lib

    修改为:

    GEOS_DIR=D:\gdal-1.8.1

    GEOS_CFLAGS =-I$(GEOS_DIR)/capi -I$(GEOS_DIR)/source/headers -DHAVE_GEOS

    GEOS_LIB     = $(GEOS_DIR)/source/geos_c_i.lib

    保存完nmake.opt之后,按照第一步中的编译方式进行编译即可(此次编译在geos-3.3.9目录下编译)。编译后,将geos_c.dll(在D:\gdal-1.8.1\geos-3.3.9\src)文件拷贝到gdal18.dll的同级目录下。

    4.集成Proj4

    下载地址:http://trac.osgeo.org/proj/

    gdal源码目录中的nmake.opt中的

    #PROJ_FLAGS =-DPROJ_STATIC

    #PROJ_INCLUDE =-Id:\projects\proj.4\src

    #PROJ_LIBRARY =d:\projects\proj.4\src\proj_i.lib

    修改为:

    #PROJ_FLAGS =-DPROJ_STATIC

    PROJ_INCLUDE =-ID:\gdal-1.8.1\proj-4.9.1\src

    PROJ_LIBRARY =D:\gdal-1.8.1\proj-4.9.1\src\proj_i.lib

    保存完nmake.opt之后,按照第一步中的编译方式进行编译即可。编译后,将proj.dll文件拷贝到gdal18.dll的同级目录下,否则会提示你找不到proj.dll文件。

    5.集成HDF

    下载网址:http://mirror.fcaglp.unlp.edu.ar/pub/ftp.hdfgroup.org/HDF/

    gdal源码目录中的nmake.opt中的

    # Uncomment thefollowing and update to enable NCSA HDF Release 4 support.

    #HDF4_PLUGIN = NO

    #HDF4_DIR =       D:\warmerda\HDF41r5

    #HDF4_LIB =        /LIBPATH:$(HDF4_DIR)\lib Ws2_32.lib

     

    # Uncomment thefollowing and update to enable NCSA HDF Release 5 support.

    #HDF5_PLUGIN = NO

    #HDF5_DIR =       c:\warmerda\supportlibs\hdf5\5-164-win

    #HDF5_LIB =        $(HDF5_DIR)\dll\hdf5dll.lib

    修改为下面的代码:

    # Uncomment thefollowing and update to enable NCSA HDF Release 4 support.

    HDF4_PLUGIN = NO

    HDF4_DIR =          F:\Work\3rdPart\HDF4.2.6_win_x86

    HDF4_LIB =  $(HDF4_DIR)\dll\hd426m.lib Ws2_32.lib

     

    # Uncomment thefollowing and update to enable NCSA HDF Release 5 support.

    HDF5_PLUGIN = NO

    HDF5_DIR =          F:\Work\3rdPart\HDF5-1.8.7_win_x86

    HDF5_LIB = $(HDF5_DIR)\dll\hdf5dll.lib

    保存,然后编译gdal即可,同时将hdf库中的dll文件夹下的dll文件拷贝到gdal18.dll的同级目录下。



     time:2015.03.18

    展开全文
  • Installation Error for GDAL

    2020-12-01 11:55:31
    <p>When I use pip install gdal, the out put is <pre><code> ERROR: Command errored out with exit status 1: command: 'E:\ana\python.exe' -u -c 'import sys, setuptools, tokenize; sys.argv[0...
  • GDAL 2.0

    2020-11-20 16:44:29
    <div><p>In Fedora, we are slowly moving towards GDAL 2.0 and Fiona's tests suite seems to fail a lot. Is this simply because GDAL 2.0 is not supported, or are we doing something wrong? <p>The ...
  • GDAL资料GDAL资料GDAL资料GDAL资料GDAL资料
  • unused-command-line-argument-hard-error-in-future build/temp.macosx-10.6-intel-3.6/extensions/gdal_wrap.o -L../../.libs -L../../ -L/usr/local/Cellar/gdal/2.3.1_1/lib -lgdal -o build/lib.macosx-10.6-...
  • GDAL遥感影像处理

    热门讨论 2013-04-28 16:59:57
    这是我自己在mfc下利用gdal库实现的遥感影像显示模块,能显示绝大部分的遥感影像格式数据。打开影像是可以同时打开多幅影像,程序默认对每幅影像建立各自的金字塔文件以便后面操作,同时程序默认将影像拉伸到0-255...
  • GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。由于GDAL库支持很多的数据格式,目前几乎所有的GIS和RS软件底层都使用GDAL来读写空间数据。, 《GDAL源码剖析与开发...
  • <p>The <code>gdal</code> Debian package is patch to use <code>/usr/share/gdal/<GDAL_VERSION_MAJOR>.<GDAL_VERSION_MINOR></code> as the <code>datapath</code> by patching <code>CPLFinderInit...
  • <p>Our toolkit uses GDAL for Geotiff generation. Our CI caught an issue testing against Python 2.7 on Travis CI. Note: it works with all Py3.x fine <p>...
  • Handling GDAL Errors

    2020-11-28 14:21:08
    <p>The osgeo module needed a call, <code>gdal.UseExceptions()</code>. Is something similar needed for Rasterio to catch GDAL errors? <p>OS: Ubuntu 14.04, Python 3.5.1, Rasterio 0.34</p><p>该提问来源于...
  • Gdal23 fixes

    2020-11-20 16:46:49
    In Gdal 2.3 no FionaValueError is thrown anymore. This is possible due to <a href="https://trac.osgeo.org/gdal/wiki/rfc70_output_format_guess">RFC70</a>: <p>Command line utilities, when neither -f ...
  • gdal-111-1800-core

    2019-04-24 23:43:00
    4、GDAL安装和配置,首先安装PIL-fork-1.1.7.win-amd64-py2.7.exe,接着安装gdal-111-1800-x64-core.msi,在系统环境变量中配置GDAL_DATA变量,在Path变量中增加:C:\Program Files\GDAL文件夹,GDAL_DATA指向C:\...
  • GDAL 2 Support

    2020-12-01 20:50:12
    <p>The first commit is fine, and compiled with with both GDAL 1.9 and GDAL 2.0 but the second one break 1.9 due to API incompatibilities. <p>What I'd like is your thoughts on the best way to ...
  • GDAL/ORG库

    2011-09-09 21:44:32
    GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。  OGR是GDAL项目的一...
  • GDAL110 全套 C\C++ C# Java Python

    热门讨论 2013-07-24 20:12:04
    1:修改C#版本的dll,可以支持所有的中文路径 ...OSGeo.GDAL.Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO"); 如果程序不能执行,或者提示0xc1000052错误,请到这里下载VS2008 SP1的运行库,地址为: ...
  • GDAL简介

    万次阅读 2018-05-14 07:30:52
    GDAL简介 作者:阿振 邮箱:tanzhenyugis@163.com 博客:https://blog.csdn.net/theonegis/article/details/80089375 修改时间:2018-05-13 声明:本文为博主原创文章,转载请注明原文出处 Geospatial Data ...

    GDAL简介

    作者:阿振

    邮箱:tanzhenyugis@163.com

    博客:https://blog.csdn.net/theonegis/article/details/80089375

    修改时间:2018-05-13

    声明:本文为博主原创文章,转载请注明原文出处


    Geospatial Data Abstraction Library (GDAL)是使用C/C++语言编写的用于读写空间数据的一套跨平台开源库。现有的大部分GIS或者遥感平台,不论是商业软件ArcGIS,ENVI还是开源软件GRASS,QGIS,都使用了GDAL作为底层构建库。

    GDAL库由OGR和GDAL项目合并而来,OGR主要用于空间要素矢量矢量数据的解析,GDAL主要用于空间栅格数据的读写。此外,空间参考及其投影转换使用开源库 PROJ.4进行。

    目前,GDAL主要提供了三大类数据的支持:栅格数据,矢量数据以及空间网络数据(Geographic Network Model)。

    GDAL提供了C/C++借口,并且通过SWIG提供了Python,Java,C#等的调用借口。当我们在Python中调用GDAL的API函数时,其实底层执行的是C/C++编译的二进制文件。

    GDAL不但提供了API借口方便开发人员自定义自己的功能,而且还提供了一系列实用工具(Command Line Tools)可以实现方便快速的空间数据处理。我们可以使用这些实用工具,结合Linux Shell脚本或者Windows批处理脚本进行大批量空间数据的批量处理。

    GDAL 1.x版本以前,对于栅格和矢量数据的读写API借口设计是相对分离的,从2.x版本开始,栅格和矢量数据的API进行了集成,对开发者更加友好。我们这里的示例都是以2.x版本为例。

    栅格数据组织

    GDAL中使用dataset表示一个栅格数据(使用抽象类GDALDataset表示),一个dataset包含了对于栅格数据的波段,空间参考以及元数据等信息。一张GeoTIFF遥感影像,一张DEM影像,或者一张土地利用图,在GDAL中都是一个GDALDataset。

    • 坐标系统(使用OGC WKT格式表示的空间坐标系统或者投影系统)

    • 地理放射变换(使用放射变换表示图上坐标和地理坐标的关系)

    • GCPs(大地控制点记录了图上点及其大地坐标的关系,通过多个大地控制点可以重建图上坐标和地理坐标的关系)

    • 元数据(键值对的集合,用于记录和影像相关的元数据信息)

    • 栅格波段(使用GDALRasterBand类表示,真正用于存储影像栅格值,一个栅格数据可以有多个波段)

    • 颜色表(Color Table用于图像显示)

    地理放射变换

    放射变换使用如下的公式表示栅格图上坐标和地理坐标的关系:

    Xgeo=GT(0)+XpixelGT(1)+YlineGT(2)Ygeo=GT(3)+XpixelGT(4)+YlineGT(5)

    Xge0, Yge0)表示对应于图上坐标(Xpixel, Yline)的实际地理坐标。对一个上北下南的图像,GT(2)和GT(4)等于0, GT(1)是像元的宽度, GT(5)是像元的高度。(GT(0),GT(3))坐标对表示左上角像元的左上角坐标。

    通过这个放射变换,我们可以得到图上所有像元对应的地理坐标。

    参考资料:GDAL Data Model

    矢量数据组织

    GDAL的矢量数据模型是建立在OGC Simple Features规范的基础之上的,OGC Simple Features规范规定了常用的点线面几何体类型,及其作用在这些空间要素上的操作。

    OGR矢量数据模型中比较重要的几个概念:

    • Geometry(OGRGeometry类表示了一个空间几何体,包含几何体定义,空间参考,以及作用在几何体之上的空间操作,几何体和OGC WKB,WKT格式直接的导入导出)
    • Spatial Reference(OGRSpatialReference类表示了空间参考信息,各种格式的空间参考的导入导出)
    • Feature(OGRFeature类表示空间要素,一个空间要素是一个空间几何体及其属性的集合)
    • Layer(OGRLayer表示一个图层,一个图层中可以包含很多个空间要素)
    • Dataset(GDALDataset抽象类表示一个矢量数据,一个Dataset可以包含多个图层)

    总结一下:一个数据集(Dataset)可以包含多个图层(Layer),一个图层中可以包含多个空间要素(Feature),一个Feature由一个空间几何体(Geometry)及其属性构成

    参考资料:OGR Architecture

    展开全文
  • GDAL书籍

    千次阅读 热门讨论 2014-03-10 19:49:11
    GDAL的书籍经过快两年的编写修改,终于出版发行了,希望有需要的同学可以到下面的网址进行购买。(当当网暂时缺货) 购买地址: 亚马逊:...

    GDAL的书籍经过快两年的编写修改,终于出版发行了,有需要的同学可以到下面的网址进行购买。


    购买地址:

    亚马逊:http://www.amazon.cn/GDAL%E6%BA%90%E7%A0%81%E5%89%96%E6%9E%90%E4%B8%8E%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97-%E6%9D%8E%E6%B0%91%E5%BD%95/dp/B00ITXUSNO/ref=pd_rhf_ee_p_t_1_VKW2

    当当:http://product.dangdang.com/23436769.html

    京东:http://item.jd.com/1096631397.html

    淘宝:http://item.taobao.com/item.htm?spm=686.1000925.1000774.13.ckr0WS&id=37794335109

    感谢大家的支持!!

    由于网上没有书的封面,下面是书的封面和书脊的样子。


    封底:



    另外,书里面的图片和代码我会单独写博客贴在网上,由于书里面的图片都是黑白印刷,可能有些图片不能真实反映,请关注接下来的博文。书中的代码也会贴出来(代码以及测试数据下载地址:http://download.csdn.net/detail/liminlu0314/7041993)。

    关于书中的部分排版错误,我也会写博客形成一个勘误表,方便大家使用。

    展开全文
  • 已编译的GDAL gdal111

    2014-08-27 22:27:31
    已编译的GDAL,c++编译的gdal11版本,证实可用,共五个文件夹,包括lib、include、bin、data、html五个文件夹
  • GDAL源码剖析(七)之GDAL RasterIO使用说明

    万次阅读 多人点赞 2011-12-14 22:59:04
    GDAL中读写图像是最基本的操作,那么RasterIO也就是最基本的函数了,关于RasterIO有很多方式,这个函数的功能相当强大,下面慢慢说明。RasterIO一共有两个,一个是GDALRasterBand::RasterIO,另一个是GDALDataset:...
  • GDAL Geospatial Data Abstraction Library 是一个在X MIT许可协议下的开源栅格空间数据转换库 它利用抽象数据模型来表达所支持的各种文件格式 它还有一系列命令行工具来进行数据转换和处理 OGR是GDAL项目的一个...
  • GDAL APP

    千次阅读 2012-04-05 09:47:53
    原文地址:GDAL附带工具作者:xxzxlx 【本文转载于:http://wiki.woodpecker.org.cn/moin/lilin/gdal-utils,版权属于原创作者】 http://blog.163.com/lionyue@126/blog/static/10793071200710120467784/ ...
  • GDAL_HTTPS_PROXY

    2020-12-01 18:04:04
    <div><h2>What does this PR do? <p>This PR adds new environment variable <code>GDAL_...OSGeo/gdal</p></div>
  • GDAL遥感影像处理 .rar

    2019-07-26 16:49:30
    利用gdal库实现的遥感影像显示模块,能显示绝大部分的遥感影像格式数据。打开影像是可以同时打开多幅影像,程序默认对每幅影像建立各自的金字塔文件以便后面操作,同时程序默认将影像拉伸到0-255范围以防有的影像是...
  • GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库。由于GDAL库支持超多的数据格式,目前几乎所有的GIS 和RS软件底层都使用GDAL来进行读写空间数据。  GDAL源码剖析与...
  • private void mosicaer( OSGeo.GDAL.Dataset ds1, OSGeo.GDAL.Dataset ds2) { Gdal.AllRegister(); OSGeo.GDAL.Band band11 = ds1.GetRasterBand(1); OSGeo.GDAL.Band band12 = ds1.GetRasterBand(2); ...
  • GDAL教程(一)查看帮助文档

    千次阅读 2018-08-18 13:50:56
    1.开头介绍了什么是GDAL(Geospatial Data Abstraction Library地理空间数据抽象库)以及GDAL源码各个版本的下载链接。 2.User Oriented Documentation使用定向的文档:这里说的“定向”是指GDAL按照不同的需要为...
  • GDAL 1.11.0

    2014-07-30 11:20:44
    最新的GDAL库1.11.0版,编译好的,直接引用即可

空空如也

1 2 3 4 5 ... 20
收藏数 5,871
精华内容 2,348
关键字:

GDAL