SQL SQLite方言

The SQLite "dialect" can be used as an alternate SQL dialect to the OGR-SQL方言. This assumes that GDAL/OGR is built with support for SQLite, and preferably with Spatialite support too to benefit from spatial functions.

SQLite方言可以与任何OGR数据源一起使用,如OGR SQL方言。通过将pszDialect指定为“SQLITE”,可以通过GDALDataset::ExecuteSQL()方法使用它。对于 ogrinfoogr2ogr 实用程序中,必须指定“-dialect SQLITE”选项。

这主要是为了执行SELECT语句,但是对于支持update的数据源,也可以运行INSERT/update/DELETE语句。GDAL正在内部使用 the Virtual Table Mechanism of SQLite 因此不支持像ALTER TABLE这样的操作。用于执行ALTER TABLE或DROP TABLE use OGR-SQL方言

如果数据源是SQLite数据库(GeoPackage,SpatiaLite),则SQLite方言充当本机SQL方言,不使用虚拟表机制。即使在这种情况下,也可以通过指定“-dialectu SQLITE”来强制GDAL使用虚拟表。这应该只在必要时使用,因为使用虚拟表机制可能会影响性能。

SQL语句的语法完全是SQLite SQL引擎之一。您可以参考以下页面:

选择语句

SELECT语句用于获取层特征(类似于RDBMS中的表行),查询结果表示为临时特征层。数据源的层类似于RDBMS中的表,特征属性类似于列值。OGR SQLITE SELECT语句的最简单形式如下所示:

SELECT * FROM polylayer

当然可以使用更复杂的语句,包括WHERE、JOIN、USING、GROUP BY、ORDER BY、sub SELECT。。。

可以使用的表名是调用ExecuteSQL()方法的数据源中可用的层名。

与OGRSQL类似,也可以使用以下语法引用其他数据源的层:“其他数据源名”“层名”。

SELECT p.*, NAME FROM poly p JOIN "idlink.dbf"."idlink" il USING (eas_id)

如果主数据源是SQLite数据库(GeoPackage,SpatiaLite),则有必要使用间接SQLite方言。否则,不会打开其他数据源,但会从主数据库中搜索联接中要使用的表。

ogrinfo jointest.gpkg -dialect INDIRECT_SQLITE -sql "SELECT a.ID,b.ID FROM jointest a JOIN \"jointest2.shp\".\"jointest2\" b ON a.ID=b.ID"

可以在结果列列表中使用的列名,在其中,JOIN。。。子句是层的字段名。表达式、SQLite函数、空间函数等。。。也可以使用。

在WHERE子句或连接中表示的字段上的条件尽可能被转换为应用于底层OGR层的属性过滤器。如果在使用的键字段上没有索引辅助表,则联接可能是非常昂贵的操作。

分隔标识符

如果层或属性的名称是SQL中的保留关键字,如“FROM”,或者以数字或下划线开头,则必须将其作为“分隔标识符”处理,并在查询中用双引号括起来。即使不需要双引号,也可以使用双引号。

SELECT "p"."geometry", "p"."FROM", "p"."3D" FROM "poly" p

当在命令shell中使用SQL语句并且语句本身放在双引号之间时,内部双引号必须用\

ogrinfo p.shp -sql "SELECT geometry \"FROM\", \"3D\" FROM p"

几何字段

这个 GEOMETRY 特殊字段表示OGRFeature::GetGeometryRef()返回的功能的几何图形。它可以在SELECT的结果列列表中显式指定,如果使用*通配符,则会自动选择。

对于具有非空几何列名称(通常用于RDBMS数据源)的OGR层,如OGRLayer::GetGeometryColumn()返回的,SQL语句中的几何特殊字段的名称将是基础OGR层的几何列的名称。如果源层中的geometry列的名称为空(如shapefiles等),则在SQL语句中使用的名称总是“geometry”。

SELECT EAS_ID, GEOMETRY FROM poly

返回:

OGRFeature(SELECT):0
EAS_ID (Real) = 168
POLYGON ((479819.84375 4765180.5,479690.1875 4765259.5,[...],479819.84375 4765180.5))
SELECT * FROM poly

返回:

OGRFeature(SELECT):0
AREA (Real) = 215229.266
EAS_ID (Real) = 168
PRFEDEA (String) = 35043411
POLYGON ((479819.84375 4765180.5,479690.1875 4765259.5,[...],479819.84375 4765180.5))

Feature id

The feature id is a special property of a feature and not treated as an attribute of the feature. In some cases it is convenient to be able to utilize the feature id in queries and result sets as a regular field. To do so use the name rowid. The field wildcard expansions will not include the feature id, but it may be explicitly included using a syntax like:

SELECT rowid, * FROM nation

It is of course possible to rename it:

SELECT rowid AS fid, * FROM nation

OGRúu风格的特殊领域

这个 OGR_STYLE 特殊字段表示OGRFeature::GetStyleString()返回的功能的样式字符串。通过使用此字段和 LIKE 运算符可以按样式筛选查询结果。例如,我们可以将注释要素选择为:

SELECT * FROM nation WHERE OGR_STYLE LIKE 'LABEL%'

空间SQL函数

When GDAL/OGR is build with support for the Spatialite library, a lot of extra SQL functions, in particular spatial functions, can be used in results column fields, WHERE clauses, etc....

SELECT EAS_ID, ST_Area(GEOMETRY) AS area FROM poly WHERE
    ST_Intersects(GEOMETRY, BuildCircleMbr(479750.6875,4764702.0,100))

返回:

OGRFeature(SELECT):0
EAS_ID (Real) = 169
area (Real) = 101429.9765625

OGRFeature(SELECT):1
EAS_ID (Real) = 165
area (Real) = 596610.3359375

OGRFeature(SELECT):2
EAS_ID (Real) = 170
area (Real) = 5268.8125

OGR数据源SQL函数

这个 ogr_datasource_load_layers(datasource_name[, update_mode[, prefix]]) 函数可用于自动将数据源的所有层加载为 VirtualOGR tables .

sqlite> SELECT load_extension('libgdal.so');

sqlite> SELECT load_extension('libspatialite.so');

sqlite> SELECT ogr_datasource_load_layers('poly.shp');
1
sqlite> SELECT * FROM sqlite_master;
table|poly|poly|0|CREATE VIRTUAL TABLE "poly" USING VirtualOGR('poly.shp', 0, 'poly')

OGR层SQL函数

以下SQL函数可用并对层名称进行操作: ogr_layer_Extent()ogr_layer_SRID()ogr_layer_GeometryType()ogr_layer_FeatureCount()

SELECT ogr_layer_Extent('poly'), ogr_layer_SRID('poly') AS srid,
    ogr_layer_GeometryType('poly') AS geomtype, ogr_layer_FeatureCount('poly') AS count
OGRFeature(SELECT):0
srid (Integer) = 40004
geomtype (String) = POLYGON
count (Integer) = 10
POLYGON ((478315.53125 4762880.5,481645.3125 4762880.5,481645.3125 4765610.5,478315.53125 4765610.5,478315.53125 4762880.5))

OGR压缩函数

ogr_deflate(text_or_blob[, compression_level]) returns a binary blob compressed with the ZLib deflate algorithm. See CPLZLibDeflate()

ogr_inflate(compressed_blob) 从使用ZLib deflate算法压缩的blob返回解压缩的二进制blob。如果解压缩的二进制文件是字符串,则使用CAST(ogr_inflate(compressed_blob)作为VARCHAR)。请参见CPLZLibInflate()。

其他功能

这个 hstore_get_value() 函数可用于从HSTORE字符串中提取与键关联的值,格式为“key=>value,other_key=>other_value,…”

SELECT hstore_get_value('a => b, "key with space"=> "value with space"', 'key with space') --> 'value with space'

OGR地理编码函数

以下SQL函数可用: ogr_geocode(...)ogr_geocode_reverse(...) .

ogr_geocode(name_to_geocode [, field_to_return [, option1 [, option2, ...]]]) 其中name_to_geocode是必须进行地理编码的文本或列名。field_to_return(如果指定)可以是几何图形的“几何图形”(默认),也可以是由 OGRGeocode() . 特殊字段“raw”还可用于返回地理编码服务的原始响应(XML字符串)。选项1、选项2等。。必须是key=value格式,并且选项是否为 OGRGeocodeCreateSession() 或OGRGeocode()。

此函数在内部使用OGRGeocode()API。详情请参阅。

SELECT ST_Centroid(ogr_geocode('Paris'))

返回:

OGRFeature(SELECT):0
POINT (2.342878767069653 48.85661793020374)
ogrinfo cities.csv -dialect sqlite -sql "SELECT *, ogr_geocode(city, 'country') AS country, ST_Centroid(ogr_geocode(city)) FROM cities"

返回:

OGRFeature(SELECT):0
id (Real) = 1
city (String) = Paris
country (String) = France métropolitaine
POINT (2.342878767069653 48.85661793020374)

OGRFeature(SELECT):1
id (Real) = 2
city (String) = London
country (String) = United Kingdom
POINT (-0.109369427546499 51.500506667319407)

OGRFeature(SELECT):2
id (Real) = 3
city (String) = Rennes
country (String) = France métropolitaine
POINT (-1.68185153381778 48.111663929761093)

OGRFeature(SELECT):3
id (Real) = 4
city (String) = Strasbourg
country (String) = France métropolitaine
POINT (7.767762859150757 48.571233274141846)

OGRFeature(SELECT):4
id (Real) = 5
city (String) = New York
country (String) = United States of America
POINT (-73.938140243499049 40.663799577449979)

OGRFeature(SELECT):5
id (Real) = 6
city (String) = Berlin
country (String) = Deutschland
POINT (13.402306623451983 52.501470321410636)

OGRFeature(SELECT):6
id (Real) = 7
city (String) = Beijing
POINT (116.391195 39.9064702)

OGRFeature(SELECT):7
id (Real) = 8
city (String) = Brasilia
country (String) = Brasil
POINT (-52.830435216371839 -10.828214867369699)

OGRFeature(SELECT):8
id (Real) = 9
city (String) = Moscow
country (String) = Российская Федерация
POINT (37.367988106866868 55.556208255649558)

ogr_geocode_reverse(longitude, latitude, field_to_return [, option1 [, option2, ...]]) 其中经度、纬度是要查询的坐标。field_to_return必须是OGRGeocodeReverse()返回的层的字段名(例如“display_name”)。特殊字段“raw”还可用于返回地理编码服务的原始响应(XML字符串)。选项1、选项2等。。必须是key=value格式,并且是ogrgeocodereatesession()或OGRGeocodeReverse()可以理解的选项。

ogr_geocode_reverse(geometry, field_to_return [, option1 [, option2, ...]]) 也可接受为一种替代语法,其中几何图形是(空间)点几何图形。

此函数在内部使用 OGRGeocodeReverse() 应用程序编程接口。详情请参阅。

空间索引

空间索引机制可以通过确保在SQL中提到空间索引虚拟表(形式为idx_layername_geometrycolumn)或使用virtual spatial index扩展中的最新空间索引来触发。在这种情况下,将构建一个内存中的RTree,用于加速空间查询。

例如,两个图层之间的空间交点,通过在其中一个图层上使用空间索引来限制实际几何交点计算的次数:

SELECT city_name, region_name FROM cities, regions WHERE
    ST_Area(ST_Intersection(cities.geometry, regions.geometry)) > 0 AND
    regions.rowid IN (
        SELECT pkid FROM idx_regions_geometry WHERE
            xmax >= MbrMinX(cities.geometry) AND xmin <= MbrMaxX(cities.geometry) AND
            ymax >= MbrMinY(cities.geometry) AND ymin <= MbrMaxY(cities.geometry))

或更优雅:

SELECT city_name, region_name FROM cities, regions WHERE
    ST_Area(ST_Intersection(cities.geometry, regions.geometry)) > 0 AND
    regions.rowid IN (
        SELECT rowid FROM SpatialIndex WHERE
            f_table_name = 'regions' AND search_frame = cities.geometry)