Query Layer介绍

Query Layer介绍

题记

Query Layer的具体介绍大家在2010年Esri中国北方用户大会分发的ArcGIS中国通讯上已经有《ArcGIS10新特性之Query Layer介绍》,这里面就不做重复的说明了。下面所介绍的就是对文中没有涉及知识的相关补充。

概念

Query Layer是通过 SQL 查询定义的图层或独立表。通过查询图层可将空间信息和非空间信息都存储在 DBMS 中,从而使这些信息可以轻松地整合到 ArcMap 中的各 GIS 项目。

其实就是把我们的空间数据图层的概念看作成后台数据库存储的表的概念,因为我们通常习惯于利用SQL语句来直接操作属性表,但是对空间数据图层来说在ArcGIS10之前是不支持的,鉴于大家对SQL的喜爱,Esri在ArcGIS10就引入了Query Layer,它就可以直接使用SQL语句进行查询或者空间数据与属性数据的联表查询。

使用前

  • 必须采用当前使用的 ArcGIS 版本支持的 DBMS 版本。
  • 查询图层定义中必须包括在查询图层中用作对象 ID 的唯一、非空的列或列组合。
  • 根据所使用的 DBMS 类型,可能需要在 DBMS 中进行一些必要的配置来使用空间类型。
  • 另外,根据 DBMS 类型,可能需要在从中创建查询图层连接的每个客户端计算机上进行一些配置。

特点

保存为文件

通过另存为图层文件 (.lyr)、创建图层包 (.lpk) 或通过地图包 (.mpk) 绑定地图和关联数据,查询图层可在用户之间、应用程序之间和其他地图文档之间轻松地实现共享。

其实这个文件与我们经常使用的MXD文件有异曲同工之妙,该文件并没有存储真正的查询数据信息,而是存储了服务器连接信息、查询过滤条件信息,这样也就保证我们随时可以查询最新的信息。

案例

    为了证明新增数据可以同步在Query Layer显示,笔者进行了相关测试。

环境:Oracle数据库、ArcMap10、ArcSDE10

1:新建一个Query Layer图层

2:选择数据连接

3:针对一个图层或者一个图层与普通表进行条件过滤或者联表查询条件过滤

4:参数添加完毕后,Query Layer就可以加载到ArcMap上了,然后也可以另存为上面所说的相关格式文件。假如我们将Query Layer存储为XX.lyr文件,C:\Users\gis\AppData\Roaming\ESRI\Desktop10.0\ArcMap文件夹下会产生一个***.qcf存储Query Layer的连接信息文件。

5:编辑当前源数据文件,修改相关属性,使其在过滤条件之内。

6:重新加载Query Layer文件,发现并没有实时的将最新的数据给加载上去。

这是为什么呢?

解决方式:查看帮助,ArcGIS10有中文帮助,肯定让不少GISer为之疯狂。

 

如果在 ArcSDE 地理数据库中对版本化的要素类定义了查询,则查询将只返回基表中的数据;而不会返回添加表(Add 表)或删除表(Delete 表)中的任何信息。

看到这个信息就恍然大悟,原来这个Query Layer针对版本数据时这个概念啊!这点相似于版本与历史归档的关系。

感觉这个让用户有点不爽了,编辑完数据,必须实时的进行Compress,才能使数据进行同步了。

扩展

鉴于Query Layer可以保存为一个文件而不用保存数据的特点,我们在使用ArcGIS Engine开发的时候,也可以事先把我们经常要使用的查询语句所对应的数据以Query Layer的文件形式保存,到时候我们直接可以加载该*.lyr文件,然后再进行相关分析。

案例

在国土行业中,我们会使用地类图斑这个面状图层进行相关分析,因为该图层包含一个土地用途的字段(土地用途就是将不同的土地利用以不同的利用代码),因为该土地用途包含了我们使用的所有代码,但是我们有时候针对的数据往往可能是,我专门对耕地(011,012,013)或者建设用地(201等)这些进行分析或者统计,那么我们就可以事先创建不同的Query Layer进行分析,不用每次就进行先查询后分析的过程了。

Query Layer比较

 

Query Layer VS. Definition Query

Definition Query:单个要素类、动态显示、非保存

只是对某一个要素类进行过滤条件的查询,而且这些数据不能以文件的形式保存(注意不是将数据导出,而是说,我进行该方式的查询,如果再一次使用同样的条件只能将Where条件重新输入。

Query Layer VS. Join

Join:可以进行单个要素与属性表的连接,动态显示、非保存

这一点其实与上面的Definition Query比较类似。而且Join不能处理1对多的关系。

Query Layer VS. ArcSDE视图

ArcSDE视图:与Query Layer类似,支持单个要素类或者一个要素类与属性表联表、在数据库中以视图的形式存储。

Query Layer可用于作为地理处理工具的输入来显示数据,或使用开发人员 API 通过编程方式进行访问。Query Layer可以修改相关的过滤条件,但是ArcSDE视图都不能做到。

ArcGIS Engine开发Query Layer

获得SQL工作空间

//方式一   

IWorkspaceFactory2 workspaceFactory2 = new SqlWorkspaceFactoryClass();

                // Create the connection properties.

                IPropertySet connectionProps = new PropertySetClass();

                connectionProps.SetProperty("dbclient", "oracle11g");

                connectionProps.SetProperty("serverinstance", "lish");

                //connectionProps.SetProperty("database", "sde");

                connectionProps.SetProperty("authentication_mode", "dbms");

                connectionProps.SetProperty("user", "sde");

                connectionProps.SetProperty("password", "sde");

                // Open the workspace.

                IWorkspace workspace = workspaceFactory2.Open(connectionProps, 0);

 

//方式二

// Create the workspace factory.

Type factoryType = Type.GetTypeFromProgID("esriDataSourcesGDB.SqlWorkspaceFactory");

IWorkspaceFactory2 workspaceFactory2 = (IWorkspaceFactory2)Activator.CreateInstance

    (factoryType);

 

// Build a connection string.

String[] connectionProps =

{

    "dbclient=SQLServer", "serverinstance=MyMachine\\SqlExpress",

        "database=MyDatabase", "authentication_mode=OSA"

};

String connString = String.Join(";", connectionProps);

 

// Open the workspace.

IWorkspace workspace = workspaceFactory2.OpenFromString(connString, 0);

 

 

简单说明一下几个参数的意思:

Ø  Dbclient

根据不同的数据库类型填写不同的值

*       SQLServer

*       Oracle10g

*       Oracle11g

*       PostgreSQL

*       Informix

*       DB2

*       DB2ZOS

Ø  Serverinstance

该值应该填写数据库服务器的IP或者主机名

对SQL Server Express, 使用 machine_name\instance_name

Ø  Database

连接数据库的名称

Ø  Authentication_mode

DBMS(默认) 和 operating systems authentication (OSA)两种方式.

Creating a query description

IQueryDescription queryDescription = sqlWorkspace.GetQueryDescription(

"SELECT COUNTY, HIGHWAY FROM HIGHWAYS");

 

queryDescription.OIDFields = "COUNTY, HIGHWAY";

Creating a query class

IQueryDescription queryDescription = sqlWorkspace.GetQueryDescription(

    "SELECT * FROM PARCELS");

ITable queryClass = sqlWorkspace.OpenQueryClass("Parcels", queryDescription);

Creating a query cursor

// Construct a SQL query.

StringBuilder queryBuilder = new StringBuilder();

queryBuilder.Append("SELECT CITY_NAME, STATE_NAME, CITYSHAPE ");

queryBuilder.Append("FROM CAPITALS JOIN STATES ");

queryBuilder.Append("ON CAPITALS.FIPS = STATES.FIPS ");

queryBuilder.Append("ORDER BY CITY_NAME");

String query = queryBuilder.ToString();

 

using(ComReleaser comReleaser = new ComReleaser())

{

    // Create the query cursor.

    IFeatureCursor featureCursor = (IFeatureCursor)sqlWorkspace.OpenQueryCursor

        (query);

    comReleaser.ManageLifetime(featureCursor);

 

    // Iterate through the features.

    IFeature feature = null;

    while ((feature = featureCursor.NextFeature()) != null)

    {

        // Write the values to the console.

        Console.WriteLine("City: {0}", feature.get_Value(0));

        Console.WriteLine("State: {0}", feature.get_Value(1));

        IPoint point = feature.get_Value(2)as IPoint;

        if (point != null)

        {

            Console.WriteLine("Location: {0}, {1}", point.X, point.Y);

        }

    }

}

在我们ArcGIS Engine开发中,如果进行属性查询我们通常使用IQueryFilter,联表查询使用IQueryDef,但是如果条件是只读,建议用户考虑使用这种方式,效率比较高。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值