矢量数据格式访问开源包OGR.
GDALpython教程(1)——用OGR读写矢量数据

GDALpython教程(1)——⽤OGR读写⽮量数据本教程的讲义和源码都是取⾃Utah State University的openGIS课程相关资料,包括讲义、源码、数据样例,请从此处下载本⼈只是做点翻译,写写学习体会⽽已,版权属于原作者。
欢迎转载,不过别忘了上⾯这段话。
==================================================为什么⽤open source?优点1. 免费,适合个⼈和⼩公司2. 强⼤的开发⼯具,找bug更容易3. 跨平台,windows和linux都能⽤4. 拉风!缺点1. 没有内嵌地理处理器2. ⽤的⼈少Open source RS/GIS模块1. OGR⽮量库:简单的⽮量数据读写,是GDAL的⼀部分2. GDAL地理空间数据抽象库:a) 读写栅格数据b) ArcGIS也是基于GDAL开发的c) C++库,但是可以⽤python调⽤相关模块1. Numeric:⾼速的数组处理,对栅格数据尤其重要2. NumPy:下⼀代的Numeric3. 更强⼤的gis库导⼊库:import ogr或者:from osgeo import ogr万能的⽅法是:try:from osgeo import ogrexcept:import ogr要读取某种类型的数据,必须要先载⼊数据驱动,也就是初始化⼀个对象,让它“知道”某种数据结构。
import ogrdriver = ogr.GetDriverByName(‘ESRI Shapefile’)数据驱动driver的open()⽅法返回⼀个数据源对象open(<filename>, <update>)其中update为0是只读,为1是可写例如:from osgeo import ogrdriver = 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!'注意filename⼀定要写绝对路径!因为⼀定要⽤绝对路径,为了简化代码,经常会使⽤到os.chdir()读取数据层layer = dataSource.GetLayer(0)⼀般ESRI的shapefile都是填0的,如果不填的话默认也是0.再看看这个数据层⾥⾯有⼏个点呢?n = layer.GetFeatureCount()print 'feature count:', n读出上下左右边界extent = layer.GetExtent()print 'extent:', extentprint 'ul:', extent[0], extent[3]print 'lr:', extent[1], extent[2]读取某⼀要素feature(总算切⼊正题了),这⾥读取的是⼀个点feat = layer.GetFeature(41)fid = feat.GetField('id')print fidfeat = layer.GetFeature(0)fid = feat.GetField('id') #should be a different idprint fid另外还有按顺序读取feature,循环遍历所有的featurefeat = layer.GetNextFeature() #读取下⼀个while feat:feat = layer.GetNextFeature()later.ResetReading() #复位提取feature的⼏何形状geom = feat.GetGeometryRef()geom.GetX()geom.GetY()print geom.释放内存feature.Destroy()关闭数据源,相当于⽂件系统操作中的关闭⽂件dataSource.Destroy()读完了再说怎么写创建新⽂件driver.CreateDataSource(<filename>)但是这个⽂件不能已经存在了,否则会出错创建新的layerdataSource.CreateLayer(<name>,CreateLayer(<name>, geom_type=<OGRwkbGeometryType>, [srs])举个例⼦:ds2 = driver.CreateDataSource('test.shp')layer2 = ds2.CreateLayer('test', geom_type=ogr.wkbPoint)要删除⼀个shp⽂件driver.DeleteDataSource('test.shp')要添加⼀个新字段,只能在layer⾥⾯加,⽽且还不能有数据添加的字段如果是字符串,还要设定宽度fieldDefn = ogr.FieldDefn('id', ogr.OFTString)fieldDefn.SetWidth(4)layer.CreateField(fieldDefn)添加⼀个新的feature,⾸先得完成上⼀步,把字段field都添加齐了然后从layer中读取相应的feature类型,并创建featurefeatureDefn = layer.GetLayerDefn()feature = ogr.Feature(featureDefn)设定⼏何形状feature.SetGeometry(point)设定某字段的数值feature.SetField('id', 23)将feature写⼊layer layer.CreateFeature(feature)。
OGR介绍

第四步: 从获取的层中读取各种实体(feature)。
OGRFeature *poFeature; //定位至开头 poLayer->ResetReading(); while( (poFeature = poLayer->GetNextFeature()) != NULL ) {
最后一步: 释放资源 OGRFeature::DestroyFeature( poFeature ); OGRDataSource::DestroyDataSource( poDS );
OGRFeature::GetGeometryRef()返回的是 OGRFeature中数据的的指针, 因此用完之 后我们不能删除 poGeometry指针对应内容。 OGRLayer::GetNextFeature() 返回的是层中 当前实体的一个拷贝,因此在使用完 poFeature之后必须手工释放。 OGRDataSource::GetLayerByName() 返回的 OGRLayer是OGRDataSource中数据的引用, 因此我们可以不用delete它。但是我们需要 删除OGRDataSource本身,这样才会关闭文 件。
OGR实例
假设读取一个名为point.shp的shapefile格式 文件中的POINT层数据并输出至STDOUT。 第一步: 调用OGRRegisterAll(); 注册所有格式的驱动
第二步: 打开用于输入的数据源(Datasources)。 Datasources可以是文件、RDBMSes、 目录中 的所有文件或者是被连接到本机的 web地址。 OGRDataSource *poDS; poDS = OGRSFDriverRegistrar::Open( "point.shp", FALSE ); 第二个参数FALSE表示Open()方法并不需要更 新的权限。 如果操作失败,则会返回NULL
OGR入门

OGR数据模型是基于OpenGIS的标准来设立的,相关的接口规范请参考OGC的官方网站 。纵观OGR的类结构,它主要的类如下面所示。
Geometry SpatialReference Feature FeatureDefn Layer DataSource Driver
2.1.1 几何形状基类
2.1.1.1 OGRGeometry
OGRGeometry 是几何形状的基类,所有的几何形状,如点、线、面均是由该类继承而 来。该类中包含了一些空间分析的虚函数。主要函数及其功能如下:
getDimension 函数:获取几何对象的维数,如点为 0,线为 1,面为 2。 getCoordinateDimension 函数:获取几何对象的坐标维数,如二维与三维。 IsEmpty 函数:判断几何对象是否为空。 IsSimple 函数:判断几何对象是否为简单几何形状。 empty 函数:清空几何对象中的数据。 clone 函数:复制几何对象。 getEnvelope 函数:获取几何对象的外包矩形。 WkbSize 函数:获取用 wkb 格式来表达几何对象数据时所需的字节数大小。 importFromWkb 函数:由 wkb 格式导入几何对象的数据。 exportToWkb 函数:将几何对象的数据导出为 wkb 格式。 importFromWkt 函数:由 wkt 格式导入几何对象的数据。 exportToWkt 函数:将几何对象的数据导出为 wkt 格式。 getGeometryType 函数:获取几何对象的类型。返回的是几何类型的编码。 getGeometryName 函数:获取几何对象类型的名称,该名称由 wkt 格式定义。
OGR入 门
陈泰生 2008.8
1
GDAL python教程基础篇OGR空间计算

GDAL python教程基础篇OGR空间计算GDAL是一个用于地理空间数据读写的库,它支持多种常见的地理格式,如GeoTIFF和ESRI Shapefile等。
而OGR则是GDAL中的一个子库,它支持矢量数据格式,如ESRI Shapefile和GeoJSON等。
本文主要介绍如何使用OGR进行空间计算。
首先需要安装GDAL和OGR,可以通过pip来安装:```bashpip install gdal```接着可以在Python中使用OGR来读取矢量数据,如下所示:```pythonfrom osgeo import ogr# 打开Shapefile文件driver = ogr.GetDriverByName('ESRI Shapefile')dataSource = driver.Open('data.shp', 0)# 获取图层layer = dataSource.GetLayer()# 可以遍历所有要素for feature in layer:# 处理每个要素```接着可以使用OGR进行空间计算,如计算两个多边形的相交部分,代码如下:```pythonfrom osgeo import ogr# 打开Shapefile文件driver = ogr.GetDriverByName('ESRI Shapefile')dataSource1 = driver.Open('data1.shp', 0)dataSource2 = driver.Open('data2.shp', 0)# 获取图层layer1 = dataSource1.GetLayer()layer2 = dataSource2.GetLayer()# 获取多边形要素polygon1 = layer1.GetFeature(0).GetGeometryRef()polygon2 = layer2.GetFeature(0).GetGeometryRef()# 计算相交部分intersection = polygon1.Intersect(polygon2)# 打印相交面积print(intersection.GetArea())```以上代码假设每个Shapefile文件只有一个多边形要素,如果有多个要素,需要修改代码来遍历所有要素。
矢量数据格式访问开源包OGR

几何图形坐标点操作
OGR_G_GetPointCount OGR_G_GetX OGR_G_GetY OGR_G_GetZ OGR_G_GetPoint OGR_G_AddPoint OGR_G_AddPoint_2D OGR_G_SetPoint OGR_G_SetPoint_2D
复合几何图形操作
OGR_L_SetSpatialFilterRect
– 设置矩形搜索范围(目前只支持Intersect),且可能不准确 设置矩形搜索范围(目前只支持Intersect),且可能不准确
OGR_L_GetSpatialFilter
– 获取空间搜索的geometry 获取空间搜索的geometry
要素
要素代表空间对象,包括空间信息和属性 信息 要素用FID标识 要素用FID标识 空间信息用几何图形(geometry)标识 空间信息用几何图形(geometry)标识 属性信息用关系模型的字段标识 要素还与空间参照系统相关联
获取要素字段值
FID: FID:
– OGR_F_GetFID
空间信息:
– OGR_F_GetGeometryRef
属性信息:
– – – – – – – – OGR_F_GetFieldAsInteger OGR_F_GetFieldAsDouble OGR_F_GetFieldAsString OGR_F_GetFieldAsIntegerList OGR_F_GetFieldAsDoubleList OGR_F_GetFieldAsStringList OGR_F_GetFieldAsBinary OGR_F_GetFieldAsDateTime
OGR_L_GetGeometryColumn
– 获取geometry所在字段的字段名 获取geometry所பைடு நூலகம்字段的字段名
PostGIS中各种GIS数据格式的转换

INTERLIS No Yes
Mapinfo File Yes Yes
Microstation DGN No No
MySQL No No
OGDI Vectors No Yes
ODBC No Yes
Oracle Spatial Yes Yes
PostgreSQL Yes Yes
alter table table_name add primary key (column_name);
另外我们发现ogr竟然是不支持最常见的GIS格式e00格式,好象是因为版权方面的原因吧。解决的方法就是去查找相关工具。我在上面就找到一个e002pg工具,支持将e00文件导入到postGIS数据库中。
DODS/OPeNDAP No Yes
DWG Yes No
DXF Yes No
ESRI Personal GeoDatabase No Yes
ESRI ArcSDE No Yes
ESRI Shapefile Yes Yes
FMEObjects Gateway No Yes
GML Yes No
简单地说,Gdal是一个各种Gis数据格式的转换软件库,ogr则是转换矢量GIS数据的软件库。
目前ogr能够支持的数据格式包括
字串3
Format Name Creation Georeferencing
Arc/Info Binary Coverage No Yes
Comma Separated Value (.csv) Yes No
下面我们从源码编译安装gdal---因为我在Debian下使用apt方式安装的gdal并不支持postgre以直接运行不用繁琐的编译,既有Windows的,也有Linux下用的,只不过这个包有些大。 字串4
测绘软件的数据格式转换和融合方法介绍

测绘软件的数据格式转换和融合方法介绍测绘软件是地理信息系统 (GIS) 领域中不可或缺的工具,它们能够将地理数据转换为可视化的地图和图形。
而在测绘过程中,数据格式转换和融合是常见的需求,本文将介绍测绘软件中常用的数据格式转换和融合方法。
一、数据格式转换1. 矢量数据格式转换矢量数据是由点、线、面等几何要素构成的地理数据,常见的格式包括Shapefile、GeoJSON和KML等。
在测绘过程中,不同的软件可能支持不同的矢量数据格式,因此需要进行格式转换。
常用的矢量数据格式转换工具包括GDAL和OGR。
GDAL (Geospatial Data Abstraction Library) 是一个开源的库,能够读取和写入多种地理数据格式;而OGR (Simple Features Library) 则是GDAL中的一个模块,专门用于矢量数据格式转换。
使用GDAL和OGR进行矢量数据格式转换非常简单。
例如,使用以下命令将Shapefile格式转换为GeoJSON格式:```shellogr2ogr -f GeoJSON output.geojson input.shp```2. 栅格数据格式转换栅格数据是由像素组成的二维网格,常见的格式包括TIFF、JPEG、PNG等。
在测绘过程中,栅格数据的格式转换常常用于不同软件之间或不同设备之间的数据交换。
GDAL同样支持栅格数据格式的转换。
例如,使用以下命令将TIFF格式转换为JPEG格式:```shellgdal_translate -of JPEG input.tif output.jpg```二、数据融合数据融合是将不同数据源的测绘数据整合在一起,形成更完整和准确的地理信息。
在实际应用中,常见的数据融合方法包括覆盖、融合、融合和遮挡等。
1. 覆盖覆盖是指将一个数据图层覆盖在另一个数据图层之上,从而得到一个包含两个图层信息的新图层。
这种数据融合方法常用于将不同比例尺的地图叠加在一起,以便更好地显示地理信息。
ogr2ogr 转换shapefile 编码

ogr2ogr 转换shapefile 编码摘要:1.引言2.ogr2ogr 转换器的作用3.Shapefile 格式的特点4.编码在Shapefile 中的应用5.ogr2ogr 转换shapefile 编码的步骤6.结语正文:一、引言地理信息系统(GIS)是处理地理空间数据的一种技术,它广泛应用于资源管理、环境保护和城市规划等领域。
在GIS 中,Shapefile 是一种常见的矢量数据格式。
为了在GIS 软件中使用Shapefile,需要将其转换为相应的数据格式。
ogr2ogr 是一款开源的GIS 数据转换工具,可以方便地将Shapefile 转换为其他格式。
本文将介绍如何使用ogr2ogr 转换器转换Shapefile 编码。
二、ogr2ogr 转换器的作用ogr2ogr 是一款功能强大的GIS 数据转换工具,它可以实现多种地理信息数据格式之间的转换。
ogr2ogr 支持Shapefile、GeoJSON、KML、GPXG 等格式,可以满足大部分GIS 数据处理需求。
在本文中,我们将重点关注ogr2ogr 在Shapefile 转换方面的应用。
三、Shapefile 格式的特点Shapefile 是一种常用的矢量数据格式,它包含了几何对象和属性数据。
Shapefile 的主要特点如下:1.存储空间:Shapefile 采用文件存储方式,将地理信息数据与属性数据分别存储在不同的文件中,方便数据的管理和查询。
2.数据结构:Shapefile 中的几何对象采用几何图形和节点构成,支持点、线、面等不同类型的几何对象。
3.属性数据:Shapefile 中的属性数据采用dbf 文件存储,可以包含多个字段,支持各种数据类型。
4.投影系统:Shapefile 支持多种投影系统,可以根据实际需求选择合适的投影系统。
四、编码在Shapefile 中的应用在Shapefile 中,编码指的是地理对象与属性数据之间的关联。
pythonOGR操作矢量数据

pythonOGR操作⽮量数据OGR简单要素库是地理空间数据抽象库(GDAL)的⼀部分,是⼀个开源库,可以读写许多不同格式的⽮量数据,编辑属性值,筛选等。
当使⽤OGR打开数据源,例如Shapefile⽂件、GeoJSON⽂件,会有⼀个DataSource对象,此数据源可以有⼀个或者多个⼦图层对象,每⼀个图层代表数据源中的⼀个数据集,许多⽮量数据格式(如Shapefile)只能包含⼀个数据集,但是其他如SpatialLite可以包含多个数据集,不管⼀个数据源中有多少数据集,每⼀个数据集都被OGR认为是⼀个图层,也就是说在数据源和实际数据集之间多了⼀个叫做图层(Layer)的东西,这⼀点需要注意理清概念。
对于实际的数据,每⼀个图层都是要素对象的集合,包含其⼏何形状和属性,如果在GIS软件中加载⼀个思路数据,在属性表中的每⼀⾏对应⼀个要素,每列对应⼀个属性字段,在⼀些GIS软件中(ArcGIS)在属性表中会有⼀个shape列显⽰⼏何对象。
读取⽮量数据需要记住⼀个数据源由⼀个或多个图层组成,所以打开数据源后,需要获得具体的图层数据源有⼀个GetLayer函数,可以来获得图层索引或者图层名,图层索引从0开始,默认返回第⼀个图层Shapefile数据源只有⼀个图层,所以不需要提供索引图层由⼀个或多个要素组成,每⼀个要素表⽰⼀个地理对象。
地理对象的⼏何形状和属性值存储在这些要素中from osgeo import ogrimport sysfn=r"D:\00Paper\00Data\zonal_shp\watershed.shp"ds=ogr.Open(fn,0)#1为编辑模式if ds is None:sys.exit('Could not open {0}.'.format(fn))lyr = ds.GetLayer(0)#输出前10个要素的信息i=0for feat in lyr:pg=feat.geometry()name=feat.GetField('ID')print(name)i+=1if i==10:breaknum_features=lyr.GetFeatureCount()#要素个数del ds #删除变量强制关闭⽂件。
gdal ogr2ogr 转矢量瓦片

GDAL (Geospatial Data Abstraction Library) 是一个在地理信息系统(GIS)领域中非常流行的开源库,它提供了对各种地理空间数据格式的支持。
而 ogr2ogr 则是 GDAL 中一个重要的命令行工具,用于在不同的地理空间数据格式之间进行转换和处理。
本篇文章将重点介绍如何使用 gdal ogr2ogr 工具来进行矢量瓦片的转换。
1. 背景介绍为了更好地展示地理空间数据,瓦片地图已经成为了 Web 地图服务的标准。
瓦片地图分为矢量瓦片和栅格瓦片两种类型,其中矢量瓦片由矢量数据渲染而成,能够在不同的屏幕分辨率下展现清晰的线条和图形,而栅格瓦片则是基于图片的瓦片,无法进行动态样式调整。
2. 使用 gdal ogr2ogr 转矢量瓦片在进行矢量瓦片转换之前,我们需要先准备好输入的矢量数据。
GDAL 支持的矢量数据格式有 Shapefile、GeoJSON、FileGDB 等,我们可以根据实际情况选择合适的格式作为输入。
接下来,我们可以使用ogr2ogr 命令行工具来进行矢量瓦片的转换。
下面是一个简单的示例:```bashogr2ogr -f MVT output.mbtiles input.shp```在这个示例中,我们使用 ogr2ogr 将一个名为 input.shp 的Shapefile 转换为矢量瓦片,并将结果输出为名为 output.mbtiles 的MBTiles 格式文件。
在实际应用中,我们还可以根据需要选择其他的输出格式,比如 GeoPackage 或者 GeoJSON 等。
3. 高级用法除了简单的矢量瓦片转换之外,gdal ogr2ogr 工具还支持一些高级的用法,比如对瓦片进行裁剪、过滤或者合并等操作。
我们可以使用ogr2ogr 命令的-sql参数来对输入数据进行 SQL 查询,并将查询结果转换为矢量瓦片。
又如,我们可以使用 ogr2ogr 的-clipdst参数来指定一个范围,只输出该范围内的矢量数据。
qgis python 用法

qgis python 用法QGIS是一个开源的地理信息系统软件,Python是QGIS使用的主要编程语言。
以下是一些QGIS Python的常见用法:1. 加载矢量数据:pythonfrom qgis.core import QgsVectorLayerlayer = QgsVectorLayer('path/to/shapefile.shp', 'layer_name', 'ogr')if layer.isValid():QgsProject.instance().addMapLayer(layer)2. 获取图层属性:pythonprovider = layer.dataProvider()fields = provider.fields()for field in fields:print((), field.typeName())3. 创建新图层:pythonfrom qgis.core import QgsVectorLayer, QgsField, QgsMapLayerRegistry, QgsProjectlayer_name = 'new_layer'crs = QgsCoordinateReferenceSystem('EPSG:4326')fields = [QgsField('field1', QVariant.Double)]layer = QgsVectorLayer('Point?crs={}'.format(crs.authid()), layer_name, 'memory')layer.dataProvider().addAttributes(fields) QgsMapLayerRegistry.instance().addMapLayer(layer)4. 迭代图层要素:pythonfeatures = layer.getFeatures()for feature in features:geom = feature.geometry()attrs = feature.attributes()print(geom.asPoint(), attrs)5. 进行空间查询:pythonfilter_expr = "field1 > 10"request = QgsFeatureRequest().setFilterExpression(filter_expr)features = layer.getFeatures(request)for feature in features:geom = feature.geometry()print(geom.asPoint())这些只是QGIS Python的一些基本用法示例,你可以根据具体需求进一步探索更多功能。
ogr2ogr 仿射变换

ogr2ogr 仿射变换OGR2OGR 是一个用于转换和操作空间数据的开源工具,它可以进行各种几何操作,包括仿射变换。
仿射变换是一种二维坐标变换,可以对图像或地图进行平移、缩放、旋转和倾斜等操作。
要使用 OGR2OGR 进行仿射变换,你需要按照以下步骤进行操作:1. 安装 OGR2OGR:首先,确保你已经安装了 OGR2OGR。
你可以通过运行以下命令来安装:```pip install ogr2ogr```2. 准备输入数据:准备要进行仿射变换的输入数据。
这可以是一个矢量数据文件(如Shapefile、GeoJSON 等)或栅格数据文件(如 TIFF、PNG 等)。
3. 定义仿射变换参数:确定你希望进行的仿射变换的参数。
这些参数包括缩放比例、旋转角度、平移量等。
你可以使用 Python 中的 NumPy 库来定义这些参数。
4. 执行 OGR2OGR 命令:使用 OGR2OGR 命令执行仿射变换。
以下是一个示例命令,假设你的输入数据是一个 Shapefile,输出数据将是一个新的 Shapefile:```ogr2ogr -f "ESRI Shapefile" output.shp input.shp -a_ affine ".sx sy tx ty"```其中,`output.shp` 是输出的 Shapefile 路径,`input.shp` 是输入的 Shapefile 路径,`-a_ affine "sx sy tx ty"` 是指定仿射变换参数的选项,`sx`、`sy` 是水平和垂直缩放比例,`tx`、`ty` 是水平和垂直平移量。
5. 查看输出结果:执行 OGR2OGR 命令后,你将得到一个经过仿射变换的输出数据。
你可以使用适当的 GIS 软件打开输出数据并查看变换后的结果。
请注意,具体的 OGR2OGR 命令和参数可能会根据你的输入数据和输出要求有所不同。
ogr2ogr 转换shapefile 编码

ogr2ogr 转换shapefile 编码(原创版)目录1.引言2.ogr2ogr 转换器的概述3.Shapefile 格式的概述4.编码的选择与转换5.示例与实践6.结论正文【引言】地理信息系统 (GIS) 是一种通过将空间数据与属性数据相结合来捕捉、存储、分析和管理地理信息的技术。
GIS 数据格式的标准化对于数据共享和互操作性至关重要。
Shapefile 是一种常见的 GIS 数据格式,而ogr2ogr 是一个开源的 GIS 数据转换器,可以将 Shapefile 转换为其他格式。
本文将介绍如何使用 ogr2ogr 转换器对 Shapefile 进行编码转换。
【ogr2ogr 转换器的概述】ogr2ogr 是一个命令行工具,可以将 GIS 数据从一个格式转换为另一个格式。
它支持许多不同的数据源和目标格式,包括 Shapefile、GeoJSON、KML 等。
ogr2ogr 转换器还可以处理地理坐标系和投影。
它由OGR(Open Geospatial Reference) 项目开发,是一个开源的 GIS 软件库。
【Shapefile 格式的概述】Shapefile 是一种常见的 GIS 数据格式,可以存储点、线和面等空间几何数据。
Shapefile 文件由多个文件组成,包括.shp(几何图形)、.shx(索引) 和.dbf(属性数据) 等文件。
Shapefile 文件通常使用dbf 文件存储属性数据,这些数据可以是任何类型的数据,包括字符串、数字、日期等。
【编码的选择与转换】在将 Shapefile 转换为其他格式时,需要选择目标格式的编码。
常见的编码包括 UTF-8、UTF-16、ISO-8859-1 等。
选择正确的编码可以确保数据在转换过程中不会丢失或损坏。
例如,如果将 Shapefile 转换为GeoJSON,则应该选择 UTF-8 编码,因为 GeoJSON 是一种基于 JSON 的格式,它使用 UTF-8 编码来存储字符串数据。
OGR矢量图层的创建(根据栅格影像创建矢量边框)

总体来说这个过程就是构建数据源->构建层->构建要素->构建形状->关闭数据源。
实例代码:// Create Shapefile.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"//要包含的GDAL头文件#include <gdal_priv.h>#include <ogrsf_frmts.h>#pragma comment(lib,"gdal_i.lib")bool Creatshape(const char* pszFileName ,int line,int row);int _tmain(int argc, _TCHAR* argv[]){const char *pszFileName="mosaic2.img";/*int m,n;char pathName[100];cout<<"请输入影像(路径名加文件名)\n";cin>>pathName;cout<<"请输入要划分的行数:m ";cin>>m;cout<<"请输入要划分的列数:n ";cin>>n;pszFileName=pathName;*/Creatshape(pszFileName,7,9);return 0;}/********************************************************** **************//*创建过程:构建数据源->构建层->构建要素->构建形状->关闭数据源/* 参数pszFileName 为输入的文件名参数linenum为划分的行数参数rows为划分的列数*//********************************************************** **************/bool Creatshape(const char* pszFileName ,int linenum,int rows){//获取影像信息GDALDataset *poDataSet;GDALAllRegister();poDataSet=(GDALDataset*)GDALOpen(pszFileName,GA_ReadOnly); //打开数据集if (poDataSet==NULL){"Failed to open this dataset!"; //代开失败的话则给出提示并退exit(1);}double Trans[6];//坐标转换参数数组,作为GetGeoTransform()函数的参数int width,height; //影像的像行列数width=poDataSet->GetRasterXSize(); //获取影像列数,为后续划分网格做准备height=poDataSet->GetRasterYSize();//获取影像行数,为后续划分网格做准备poDataSet->GetGeoTransform(Trans);//Xp = padfTransform[0] + P*padfTransform[1] + L*padfTransform[2];//Yp = padfTransform[3] + P*padfTransform[4] + L*padfTransform[5];//In a north up image, padfTransform[1] is the pixel width, and padfTransform[5] is the pixel height.//The upper left corner of the upper left pixel is at position (padfTransform[0],padfTransform[3]).for (int i=0;i<6;i++){cout<<Trans[i]<<endl; //循环输出仿射变换参数//注册shape文件驱动const char* pszDriverName="ESRI Shapefile";OGRSFDriver *poDriver;OGRRegisterAll();poDriver=OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName( pszDriverName);if (poDriver==NULL){printf("%s driver is not available!",pszDriverName);exit(1);}//创建shape文件OGRDataSource *poDS;//创建一个叫myshapefile的目录,存放生成的文件//如果名字有.shp后缀,则直接在当前目录下生成文件poDS=poDriver->CreateDataSource("myshapefile",NULL);if (poDS==NULL){printf("Create my_srtm.ship file failed!");exit(1);}//创建输出图层OGRLayer *poLayer;const char *prj=poDataSet->GetProjectionRef(); //获取栅格影像的空间参考信息cout<<"栅格数据空间参考信息为:\n"<<prj<<endl<<endl;OGRSpatialReference oSRS;oSRS.SetFromUserInput(prj); //将获得的空间参考信息字符串做为文本一次性赋给矢量数据的OGRSpatialReference对象poLayer=poDS->CreateLayer(pszFileName,&oSRS);if (poLayer==NULL){printf("Creat layer failed!");exit(1);}//创建层数据的属性fieldsOGRFieldDefn oField("Point",OFTString);oField.SetWidth(10);if (poLayer->CreateField(&oField)!=OGRERR_NONE){printf("Create Point Field Failed!");exit(1);}//创建features,写入feature到磁盘OGRFeature *poFeature;poFeature=OGRFeature::CreateFeature(poLayer->GetLayerDefn());//绘制外边框OGRLineString Line;OGRPoint Point1(Trans[0],Trans[3]);OGRPoint Point2(Trans[0]+width*Trans[1],Trans[3]);OGRPointPoint3(Trans[0]+width*Trans[1],Trans[3]+width*Trans[4]+height*Trans[ 5]);OGRPointPoint4(Trans[0],Trans[3]+width*Trans[4]+height*Trans[5]);Line.addPoint(&Point1);Line.addPoint(&Point2);Line.addPoint(&Point3);Line.addPoint(&Point4);Line.addPoint(&Point1);//水平方向加线OGRLineString SubHline[50];OGRPoint PointLeft[50],PointRight[50];for (int i=1;i<linenum;i++){PointLeft[i].setX(Trans[0]); //设置左边框上要加线的起点X坐标PointLeft[i].setY((Point4.getY()-Trans[3])/linenum*i+Trans[3]);//设置左边框上要加线的起点Y坐标PointRight[i].setX(Point2.getX());//设置右边框上要加线的起点X坐标PointRight[i].setY((Point4.getY()-Trans[3])/linenum*i+Trans[3]);//设置右边框上要加线的起点Y坐标}for (int i=1;i<linenum;i++){SubHline[i].addPoint(&PointLeft[i]); //左边框上加点SubHline[i].addPoint(&PointRight[i]);//右边框上加点if (i<linenum-1){SubHline[i].addPoint(&PointRight[i+1]); //从右边框的上一点转到下一点,避免交叉斜线的出现}Line.addSubLineString(&SubHline[i]);//将SubHline数组中的每一个线做为子线段添加到Line对象中}Line.addPoint(&Point2);//垂直方向加线OGRLineString SubVline[50];OGRPoint PointUp[50],PointDown[50];for (int j=1;j<rows;j++){//添加上边框上的点PointUp[j].setX((Point2.getX()-Trans[0])/rows*j+Trans[0]);PointUp[j].setY(Trans[3]);//添加下边框上的点PointDown[j].setX((Point2.getX()-Trans[0])/rows*j+Trans[0]);PointDown[j].setY(Point4.getY());}for (int j=1;j<rows;j++){SubVline[j].addPoint(&PointUp[j]);SubVline[j].addPoint(&PointDown[j]);if (j<rows-1){SubVline[j].addPoint(&PointDown[j+1]); //从下边框的前一点转到后一点,避免交叉斜线的出现}Line.addSubLineString(&SubVline[j]);}poFeature->SetGeometryDirectly(&Line);if (poLayer->CreateFeature(poFeature)!=OGRERR_NONE){printf("Failed create feature in shapefile!");exit(1);}OGRFeature::DestroyFeature(poFeature);OGRDataSource::DestroyDataSource(poDS);printf("创建矢量数据成功!\n");return TRUE;}本程序为实习期间,实现:根据栅格数据绘制矢量边界,并进行格网划分,并给栅格数据添加上原始影像的空间参考信息。
OGR入门

2.1.1.1 OGRGeometry
OGRGeometry 是几何形状的基类,所有的几何形状,如点、线、面均是由该类继承而 来。该类中包含了一些空间分析的虚函数。主要函数及其功能如下:
getDimension 函数:获取几何对象的维数,如点为 0,线为 1,面为 2。 getCoordinateDimension 函数:获取几何对象的坐标维数,如二维与三维。 IsEmpty 函数:判断几何对象是否为空。 IsSimple 函数:判断几何对象是否为简单几何形状。 empty 函数:清空几何对象中的数据。 clone 函数:复制几何对象。 getEnvelope 函数:获取几何对象的外包矩形。 WkbSize 函数:获取用 wkb 格式来表达几何对象数据时所需的字节数大小。 importFromWkb 函数:由 wkb 格式导入几何对象的数据。 exportToWkb 函数:将几何对象的数据导出为 wkb 格式。 importFromWkt 函数:由 wkt 格式导入几何对象的数据。 exportToWkt 函数:将几何对象的数据导出为 wkt 格式。 getGeometryType 函数:获取几何对象的类型。返回的是几何类型的编码。 getGeometryName 函数:获取几何对象类型的名称,该名称由 wkt 格式定义。
至此,GEOS 的安装已经完成。
1.3.2 让GEOS作为OGR的辅助支持
在 OGR 中添加 GEOS 支持比较简单,可以用到 GEOS 的功能,先参考上面的步骤编译 出 geos.lib 静态库。然后打开 gdal 主目录下的 nmake.opt 修改:
GEOS_CFLAGS = -IC:/warmerda/geos-3.0.0/source/headers -DHAVE_GEOS GEOS_LIB = C:/warmerda/geos-3.0.0/source/geos.lib 这两行,把前面的“#”号去掉,然后把两个路径修改成 geos 下对应的目录。注意:第一 个需要修改的是从-I 开始到-D 结束,写得是 GEOS 头文件所在的 headers 目录,而且-D 前 面有空格。第二个是从=开始,到行末,写的是 geos.lib 所处路径。然后重新编译 gdal 库。 如果出现一些链接错误(LINK 问题),可以执行 nmake /f makefile.vc clean 命令清除之 前编译生成的文件,再重新编译。若是 geos.pdb 文件出问题,则将它删除再重编。如果成 功再 nmake /f makefile.vc install 安装后就可以用 GEOS 支持了。其实 geos 支持本来就应该 在编译 gdal 时直接添加了。
arcgis 里面ogr类型

arcgis里面ogr类型
ArcGIS中的OGR(OpenGIS Simple Features Reference Implementation,开放地理信息系统简单要素参考实现)类型是指支持矢量数据操作的一组库。
OGR是一个开源的几何库,提供了许多用于读写和处理地理矢量数据的功能。
在ArcGIS中,OGR类型通常指与矢量数据相关的数据类型,包括点、线、面等。
以下是一些常见的OGR类型及其中文对应:
1.OGRPoint:点类型,表示地理空间中的一个点。
2.OGRLineString:线类型,表示地理空间中的一条线。
3.OGRPolygon:面类型,表示地理空间中的一个多边形。
4.OGRMultiPoint:多点类型,表示地理空间中的多个点。
5.OGRMultiLineString:多线类型,表示地理空间中的多条线。
6.OGRMultiPolygon:多面类型,表示地理空间中的多个多边形。
7.OGRGeometryCollection:几何集合类型,表示包含多个几何对象的集合。
这些类型是OGR库中用于表示不同地理空间几何对象的基本构建块。
在ArcGIS中,当涉及到矢量数据的读取、编辑和处理时,OGR类型会被用来描述和操作这些空间几何对象。
ogr 合并要素

ogr 合并要素合并要素:ogr 是一种开源的地理信息系统(GIS) 工具,可以用于将不同格式的地理数据进行转换和合并。
它可以将矢量数据(如点、线、面)和栅格数据(如影像)合并到一个统一的数据集中。
在这篇文章中,我将向您介绍如何使用ogr 工具来合并不同格式的地理数据。
不过,在开始之前,我想先向您简单介绍一下ogr 工具的背景和功能。
ogr 是一个功能强大的工具,它可以读取和写入多种地理数据格式,如shapefile、GeoJSON、KML 等。
使用ogr,您可以轻松地将这些格式的数据进行转换和合并。
无论您是在进行空间分析、地图制作还是其他地理数据处理工作,ogr 都是一个非常实用的工具。
让我们来看一个简单的例子。
假设我们有两个shapefile 文件,一个包含城市的点数据,另一个包含道路的线数据。
我们希望将这两个文件合并成一个文件,以便更方便地进行后续的空间分析。
我们需要打开 ogr 工具。
在命令行中输入 "ogr2ogr" 命令,然后加上相关的参数。
例如,要将城市点数据和道路线数据合并到一个名为merged.shp 的文件中,可以使用以下命令:ogr2ogr -f "ESRI Shapefile" merged.shp cities.shp -append roads.shp 在上述命令中,"-f" 参数指定输出格式为shapefile,"merged.shp"是输出文件的名称,"cities.shp" 是第一个输入文件(城市点数据),"-append" 参数表示将第二个输入文件(道路线数据)附加到输出文件中。
如果一切顺利,您应该可以看到ogr 工具开始执行,并在完成后生成 merged.shp 文件。
这个文件将包含合并后的城市点数据和道路线数据。
除了shapefile 格式,ogr 还支持其他格式的数据转换和合并。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
– 所有的Feature在使用完后,一定要使用本函数 来释放内存。
OGR_F_GetDefnRef OGR_F_GetFieldCount OGR_F_GetFieldDefnRef OGR_F_GetFieldIndex
获取要素字段值
FID:
– OGR_F_GetFID
复合几何图形操作
OGR_G_GetGeometryCount OGR_G_GetGeometryRef OGR_G_AddGeometry OGR_G_RemoveGeometry
空间关系判断操作
OGR_G_Intersects OGR_G_Equals OGR_G_Disjoint OGR_G_Touches OGR_G_Crosses OGR_G_Within OGR_G_Contains OGR_G_Overlaps
空间参照系统 (OGRSpatialReference)
遵循OGC的坐标转换规范(OpenGIS Coordinate Transformations specification) 使用WKT格式描述坐标系统 调用PROJ.4实现投影变换
投影设置
OGRSpatialReference oSRS; oSRS.SetGeogCS( "My geographic coordinate system", "WGS_1984", "My WGS84 Spheroid", SRS_WGS84_SEMIMAJOR, SRS_WGS84_INVFLATTENING, "Greenwich", 0.0, "degree", SRS_UA_DEGREE_CONV );
几何图形
几何图形代表空间几何形状,是要素的空 间信息,可以存在独立于要素之外的几何 图形。 几何图形操作包括对构成几何图形的点进 行增删改等操作、空间相互关系操作、坐 标变换操作等
几何图形基本信息操作
OGR_G_GetDimension OGR_G_GetEnvelope OGR_G_GetArea OGR_G_Centroid OGR_G_IsSimple OGR_G_IsRing
– 遍历所有支持的格式,直到成功打开,或者没有合适的驱动则返 回NULL。成功返回数据源句柄。 – bUpdate:FALSE:只读方式打开,TRUE:读写方式打开。 – pahDriverList:是输出参数,如果成功打开,可返回打开的驱动。
void OGR_DS_Destroy ( OGRDataSourceH hDataSource )
– 释放打开的数据源
数据集常用操作
OGR_DS_GetName
– 获取数据源名称
OGR_DS_GetLayerCount
– 获取图层数
OGR_DS_GetLayer
– 根据索引号打开图层,返回图层句柄
OGR_DS_GetLayerByName
– 根据图层名打开图层,返回图层句柄
OGR_DS_DeleteLayer
OGR
官网:/ogr OGR是一个开源的矢量空间数据的读写、 转换器,已被松散集成到GDAL中。 目前支持40多种格式 (/ogr/ogr_formats.ht ml) C/C++
OGR数据模型
核心对象
– – – – – 驱动(Driver) 数据源(DataSource) 图层(Layer) 要素(Feature) 几何图形(Geometry) 要素定义(FeatureDefn) 字段定义(FieldDefn) 空间参照系统定义(SpatialReference) …
字段定义操作
字段定义用于定义图层的属性表结构 每个字段通常包含:名字、类型、宽度、 小数位(实数类型)等信息
字段定义操作
OGR_Fld_Create OGR_Fld_SetName OGR_Fld_GetNameRef OGR_Fld_GetType OGR_Fld_SetType OGR_Fld_GetWidth OGR_Fld_SetWidth OGR_Fld_GetPrecision OGR_Fld_SetPrecision
OGR_L_GetNextFeature
– 获取下一个满足SpatialFilter条件的要素
OGR_L_SetSpatialFilter
– 设置空间搜索geometry(目前只支持Intersect),且可能不准确
OGR_L_SetSpatialFilterRect
– 设置矩形搜索范围(目前只支持Intersect),且可能不准确
OGR_L_GetSpatialFilter
– 获取空间搜索的geometry
要素
要素代表空间对象,包括空间信息和属性 信息 要素用FID标识 空间信息用几何图形(geometry)标识 属性信息用关系模型的字段标识 要素还与空间参照系统相关联
要素基本信息操作
OGR_F_Create OGR_F_Destroy
– 根据FID获取要素
OGR_L_SetFeature
– 根据FID修改要素
OGR_L_CreateFeature
– 创建新的要素
OGR_L_DeleteFeature
– 删除要素
图层要素查找
OGR_L_ResetReading
– 重置以开始读取下一个要素,调用OGR_L_GetNextFeature之前必 须先调用本函数
要素定义(FeatureDefn)
要素定义对象( FeatureDefn )与图层相 关联,是图层的重要属性,它确定了图层 的结构 FeatureDefn主要由若干个字段构成 FeatureDefn 通常至少包含两个重要的字段: FID和Geometry。FID用长整数表示, Geometry是抽象类型。
几何图形坐标点操作
OGR_G_GetPointCount OGR_G_GetX OGR_G_GetY OGR_G_GetZ OGR_G_GetPoint OGR_G_AddPoint OGR_G_AddPoint_2D OGR_G_SetPoint OGR_G_SetPoint_2D
设置要素字段值
FID:
– OGR_F_SetFID
– OGR_F_SetGeometry – OGR_F_SetGeometryDirectly
空间信息:
属性信息
– – – – – – – – OGR_F_SetFieldInteger OGR_F_SetFieldDouble OGR_F_SetFieldString OGR_F_SetFieldIntegerList OGR_F_SetFieldDoubleList OGR_F_SetFieldStringList OGR_F_SetFieldBinary OGR_F_SetFieldDateTime
– 根据索引号删除图层OGR_DS_CrFra bibliotekateLayer
– 创建新图层
图层
一个数据集中可以包含多个图层 图层由多个要素构成 可以基于给定条件搜索要素
图层基本信息操作
OGR_L_GetLayerDefn
– 获取图层定义信息
OGR_L_GetSpatialRef
– 获取图层空间参照系统信息(投影信息)
/** /** /** /** /** /** /** /** /** /** /** /**
Simple 32bit integer */ OFTInteger = 0, List of 32bit integers */ OFTIntegerList = 1, Double Precision floating point */ OFTReal = 2, List of doubles */ OFTRealList = 3, String of ASCII chars */ OFTString = 4, Array of strings */ OFTStringList = 5, Double byte string (unsupported) */ OFTWideString = 6, List of wide strings (unsupported) */ OFTWideStringList = 7, Raw Binary data */ OFTBinary = 8, Date */ OFTDate = 9, Time */ OFTTime = 10, Date and Time */ OFTDateTime = 11
常用的空间数据类型
wkbPoint = 1, wkbLineString = 2, wkbPolygon = 3, wkbMultiPoint = 4, wkbMultiLineString = 5, wkbMultiPolygon = 6, wkbGeometryCollection = 7,
其他相关对象
– – – –
函数命名规律
OGR_DS_xxx:数据源操作 OGR_L_xxx:图层操作 OGR_FD_xxx:要素定义操作 OGR_F_xxx:要素操作 OGR_G_xxx:几何图形操作 OGR_Fld_xxx:字段定义操作
注册所有格式
注册所有格式
– OGRRegisterAll();
OGR_L_GetFeatureCount
– 获取要素数目
OGR_L_GetExtent