查询要素

通过wfs查询要素 通过wfs查询要素 一切都准备好了,现在终于可以通过ol3加载配置好的数据了。上一节中最后的预览结果,大家已经看到了,此处我们自己通过ol3来实现这个预览页面,效果图如下: 对应的代码如下: <html> <head> <title>wfs demo</title> <link rel="stylesheet" href=... 阅读详情

使用过关系数据库的人一般都非常熟悉SQL语句,它使用Select语句对数据库进行查询,Select语句可以发分为两大类:非聚合类查询语句和聚合类查询语句。

SELECT 学号, 姓名, 期中成绩*0.4 + 期末成绩*0.6 as 成绩 FROM 成绩表

WHERE 学号>= 100 AND 学号 =< 200 order by学号 ASC

 

SELECT AVG(期中成绩) as期中平均成绩, AVG(期末成绩) as期末平均成绩

GROUP BY 班级

上面例子中的第一条SELECT语句是一条非聚合类查询语句,用于选择“成绩表”中“学号>= 100 and 学号 =< 200”的数据,返回的每条记录中包含属性“学号”、“姓名”和计算属性“成绩”,查询结果按照“学号”升序排序,可以看到非聚合类查询语句包含了如下几部分:

l  属性列表,例如:属性“学号”、“姓名”和计算属性“成绩”。

l  From子句,用于指定表的名称,例如:“成绩表”。

l  WHERE子句,用于指定过滤器,例如:“学号>= 100 and 学号 =< 200”

l  ORDER BY字句,用于排序规则:例如:“学号 ASC”。

上面例子中的第二条SELECT语句是一条聚合类查询语句,用于计算每个班级的期中平均成绩和期末平均成绩,与非聚合类查询语句比较,它包含如下的额外成分:

l  聚合函数,例如:“AVG(期中成绩)”。

l  GROUP BY子句,用于指定分组规则,例如:“GROUP BY 班级”。

与SELECT语句类似,要素服务也提供了非聚合类查询和聚合类查询方法,调用方法MgFeatureService::SelectFeatures(…)或MgFeatureService::SelectAggregate(…)可以从要素源中选择符合查询条件的要素,它们的方法签名如下所示,其中参数resource用于指定一个要素源,参数className用于指定一个要素类的名称或一个Join的名称,它类似于SELECT语句的FROM子句;参数options用于指定查询条件,可以指定返回的属性、过滤器、排序规则,添加计算属性;参数coordinateSystem用于指定返回要素的空间参考系,这意味着如果要素源的空间参考系和coordinateSystem指定的空间参考系不一致,那么会对要素进行坐标转换。

MgFeatureReader SelectFeatures(

MgResourceIdentifier resource,

string className,

MgFeatureQueryOptions options);

MgFeatureReader SelectFeatures(

MgResourceIdentifier resource,

string className,

MgFeatureQueryOptions options,

string coordinateSystem);

MgDataReader SelectAggregate(

MgResourceIdentifier resource,

string className,

MgFeatureAggregateOptions options);

方法SelectFeatures(…)和SelectAggregate(…)主要的区别是:

l  SelectAggregate(…)用于执行聚集类查询,它支持分组(GroupBy)和唯一(Distinct)操作,而SelectFeatures(…)用于执行非聚合类查询。

l  SelectAggregate(…)的返回值是类MgDataReader的对象实例一个的实例,而SelectFeatures(…) 的返回值是一个MgFeatureReader的实例,关于MgFeatureReader和MgDataReader的不同之处请参考下一小节。

1.1.1.1  属性列表

在执行查询的时候,不仅可以通过MgQueryOptions::AddFeatureProperty(…)选择一个或多个已经存在的属性,而且还可以新建一些计算属性,计算属性由已经存在的属性计算得到,例如一个要素类中包含了两个Int32类型的属性“PropA”和“PropB”,我们可以创建一个计算属性“PropA+PropB”,它的值等于这两个属性的和,使用方法MgQueryOptions::AddComputedProperty(…)可以创建这样一个计算属性,其中参数aliasName用于为计算属性指定一个名称,expression用于指定计算属性的计算公式,即一个表达式。

int AddFeatureProperty(string propertyName);

int AddComputedProperty(string aliasName, string expression);

如下的代码展示了如何创建一个计算属性。

$queryOptions = new MgFeatureQueryOptions();

$queryOptions->AddFeatureProperty("FeatId");

$queryOptions->AddFeatureProperty("aDouble");

$queryOptions->AddComputedProperty("ceilADouble", "Ceil(aDouble)");

$featureReader = featureService.SelectFeatures($resourceId, $featClassName, $queryOptions);

上面代码的功能类似于如下的SQL语句。

select FeatId, aDouble, Ceil(aDouble) as ceilADouble from featclass

1.1.1.2  过滤器

过滤器用于选择要素源中的部分要素,例如定义一个过滤器选择要素类Road中与某一条道路相交的其它道路,方法SelectFeatures(…)和SelectAggregate(…)都支持使用过滤器选择符合查询条件的要素,在创建类MgDeleteFeatures、MgLockFeatures、MgUnlockFeatures和MgUpdateFeatures的实例时,也需要传入一个过滤器。当执行相应的FDO命令时,会针对每个要素评估过滤器,只有评估结果为真的要素才会被FDO命令所影响。

MapGuide使用字符串来表示一个过滤器,它的语法有点类似于SQL语句的WHERE子句,但是SQL语句针对的是表和列,而MapGuide过滤器针对的是要素类和属性,表8-3列出了一些过滤器以及它们的含义。

 

过滤器

描述

Lanes >= 4

选择小路(Lanes)数目大于等于4的道路(Road)

Pines.state = "proposed"

选择管道网络(PipeNetworks)中管道状态为“proposed”的所有管道(Pipe)

state = "existing" and owner like "%Smith%"

选择状态为“existing”,并且所有人包含文字“Smith”的所有地块(Parcels)

state in ("affected", "encroached")

选择状态为“affected”或“encroached”的地块(Parcels)

表8-3 MapGuide过滤器示例

 

过滤器可以分为两种:基本过滤器和空间过滤器,这两种过滤器可以独立使用,也可以组合使用。

1)  基本过滤器

基本过滤条件使用非几何属性、数据值和操作符来创建一个过滤字符串,这个字符串通常作为方法MgFeatureQueryOption::SetFilter(…)或MgFeatureAggregateOptions::SetFilter(…)的参数。假设“FEATID”是一个属性名称,那么“FEATID>20”定义了一个过滤条件选择所有“FEATID”属性大于20的要素。

void SetFilter(string filterText);

 

2)  空间过滤器

空间过滤器使用一个关联与两个几何图形的空间操作符定义一个过滤条件,它通常作为MgFeatureQueryOption::SetSpatialFilter(…) 或MgFeatureAggregateOptions::SetSpatialFilter(…)方法的参数。该方法的原型如下所示,参数geometryProperty用于指定要素类中几何属性的名称,geometry用于指定一个几何对象,参数spatialOperation用于指定一个空间操作符。假设操作符是MgFeatureSpatialOperations::Within,几何对象的WKT表示为POLYGON((0 0, 2 0, 2 2, 0 2, 0 0)),那么此过滤条件的效果是选择在多边形内部的所有要素。

void SetSpatialFilter(string geometryProperty,

MgGeometry geometry, 

int spatialOperation);

 

类MgFeatureSpatialOperations定义了MapGudie支持的空间操作符,它们的含义请参考空间关系。

l  MgFeatureSpatialOperations::Contains

l  MgFeatureSpatialOperations::CoveredBy

l  MgFeatureSpatialOperations::Crosses

l  MgFeatureSpatialOperations::Disjoint

l  MgFeatureSpatialOperations::EnvelopeIntersects

l  MgFeatureSpatialOperations::Equals

l  MgFeatureSpatialOperations::Inside

l  MgFeatureSpatialOperations::Intersects

l  MgFeatureSpatialOperations::Overlaps

l  MgFeatureSpatialOperations::Touches

l  MgFeatureSpatialOperations::Within

3)  组合过滤器

通过调用方法MgFeatureQueryOption::SetBinaryOperator(…)可以使用逻辑操作符AND或OR将基本过滤器和空间过滤器组合在一起,参数andOr的值为TRUE表示使用AND逻辑操作符,FALSE表示使用OR逻辑操作符,该方法只有在基本过滤器和空间过滤器设置的情况下才会发挥作用。如果设置了基本过滤器和空间过滤器,却没有调用此方法,那么使用AND操作符组合基本过滤器和空间过滤器。

void SetBinaryOperator(bool andOr);

 

过滤器的BNF语法如下所示,从中可以看到表达式是过滤器的重要组成部分,表达式支持的数据类型如表8-4所示,可以使用部分函数如表8-5所示。

<Filter> ::= '(' Filter ')'

| <LogicalOperator>

| <SearchCondition>

<LogicalOperator> ::= <BinaryLogicalOperator>

| <UnaryLogicalOperator>

<BinaryLogicalOperator> ::=

<Filter> <BinaryLogicalOperations> <Filter>

<SearchCondition> ::= <InCondition>

| <ComparisonCondition>

| <GeometricCondition>

| <NullCondition>

<InCondition> ::= <Identifier> IN '(' ValueExpressionCollection')'

<ValueExpressionCollection> ::= <ValueExpression>

| <ValueExpressionCollection> ',' <ValueExpression>

<ComparisonCondition> ::=

<Expression> <ComparisonOperations> <Expression>

<GeometricCondition> ::= <DistanceCondition>

| <SpatialCondition>

<DistanceCondition> ::=

<Identifier> <DistanceOperations> <Expression> <distance>

<NullCondition> ::= <Identifier> NULL

<SpatialCondition> ::=

<Identifier> <SpatialOperations> <Expression>

<UnaryLogicalOperator> ::= NOT <Filter>

<BinaryLogicalOperations> ::= AND | OR

<ComparisionOperations> ::=

= // EqualTo (EQ)

<> // NotEqualTo (NE)

> // GreaterThan (GT)

>= // GreaterThanOrEqualTo (GE)

< // LessThan (LT)

<= // LessThanOrEqualTo (LE)

LIKE // Like

<DistanceOperations> ::= BEYOND | WITHINDISTANCE

<distance> ::= DOUBLE | INTEGER

<SpatialOperations> ::= CONTAINS | CROSSES | DISJOINT

| EQUALS | INTERSECTS | OVERLAPS | TOUCHES | WITHIN | COVEREDBY | INSIDE

 

<Expression> ::= '(' Expression ')'

| <UnaryExpression>

| <BinaryExpression>

| <Function>

| <Identifier>

| <ValueExpression>

<BinaryExpression> ::=

<Expression> '+' <Expression>

| <Expression> '-' <Expression>

| <Expression> '*' <Expression>

| <Expression> '/' <Expression>

<DataValue> ::=

TRUE

| FALSE

| DATETIME

| DOUBLE

| INTEGER

| STRING

| BLOB

| CLOB

| NULL

<Function> ::= <Identifier> '(' <ExpressionCollection> ')'

<ExpressionCollection> ::=

| <Expression>

| <ExpressionCollection> ',' <Expression>

<GeometryValue> ::= GEOMFROMTEXT '(' STRING ')'

<Identifier> ::= IDENTIFIER

<ValueExpression> ::= <LiteralValue> | <Parameter>;

<LiteralValue> ::= <GeometryValue> | <DataValue>

<Parameter> ::= PARAMETER | ':'STRING

<UnaryExpression> ::= '-' <Expression>

 

数据类型

描述

String

字符串由单引号括起来,例如’test’,如果需要在字符串中包括单引号,那么使用两个连续的单引号表示一个单引号,例如’aaa’’bbb’。

Identifier

标识符是使用双引号括起来的、不等于关键词的字符和数字序列,例如”abc”, 如果需要在标识符中包括双引号,那么使用两个连续的双引号表示一个双引号,例如”aaa””bbb”。

Integer

整数是一个十进制数字,它可以使用负号,但不支持正号,如果数字超过了32-bit的精度范围,那么这个数字会被转换为浮点数。

Double

浮点数是一个包含小数点的数字,它可以使用负号,还可以包含指数(e{{[0-9]})。

DateTime

日期和时间由如下格式的字符串表示:

DATE ‘YYYY-MM-DD’

TIME ‘HH:MM:SS[.sss]’

TIMESTAMP ‘YYYY-MM-DD HH:MM:SS[.sss]’

CLOB/BLOB

目前不支持此数据类型。

表8-4 表达式支持的数据类型

 

函数

描述

Double Avg(n)

计算属性n的平均值,忽略为null的属性值。

Int64 Ceil(Double)

返回大于等于Double的最小整数。

String Concat(Str1, Str2)

连接字符串Str1和Str2。

Int64 Count(expression)

返回expression不等于null的要素总数。

Int64 Floor(Double)

返回小于等于Double的最大整数。

String Lower(Str)

将Str转换为小写字母。

Double Min(expression)

返回expression的最小值。

Double Max(expression)

返回expression的最大值。

Double Stddev(n)

计算n的标准方差,忽略null。

Double Sum(n)

计算n的总和。

String Upper(Str)

将Str转换为大写字母。

表8-5 表达式中可以使用的部分函数

 

表达式中的一些函数可以使用单个要素的属性值作为参数,返回一个和此属性值相关的值,例如ceil、floor、concat和upper等,这些函数可以使用于非聚合类和聚合类查询;一些函数可以将多个要素的属性值作为参数,返回一个和一组属性值相关的值,例如avg、count、max、min、stddev和sum等,这些函数只能使用于聚合类查询。

下面是一些表达式的例子,以及如何使用这些表达式进行查询。

1)  <Identifier> NULL

给定一个字符串类型的属性Name,如果它的属性允许为NULL,并且在插入一个要素时没有指定此属性的值,那么这个要素Name属性的值为NULL。通过应用过滤条件“Name NULL”,可以选择所有Name属性值为NULL的所有要素。

queryOptions.AddFeatureProperty("Name");

queryOptions.SetFilter("Name NULL");

featureReader = featureService.SelectFeatures(featureSrcResourceId,

featClassName, queryOptions);

……

featureReader.Close();

 

通过应用过滤条件“NOT Name NULL”,可以选择所有Name属性值不为NULL的所有要素。

queryOptions.AddFeatureProperty("Name");

queryOptions.SetFilter("NOT Name NULL");

featureReader = featureService.SelectFeatures(featureSrcResourceId,

featClassName, queryOptions);

……

featureReader.Close();

 

2)  <Identifier> LIKE <String>

Like可以用于实现模糊查询,给定一个字符串模式(Patern),可以使用Like查找所有符合指定模式的要素。其中,百分号“%”用于匹配0个或多个字符,下划线“_”用于匹配单个字符。假设Description是一个字符串类型的属性,数据源中有两个包含了此属性的要素,这两个属性的值为“Point Data”和“Polygon Data”,过滤条件“Description LIKE 'Polygon'”返回“Polygon Data”,

queryOptions.AddFeatureProperty("Description");

queryOptions.SetFilter("Description LIKE 'POLYGON'");

featureReader = featureService.SelectFeatures(featureSrcResourceId,

featClassName, queryOptions);

……

featureReader.Close();

 

过滤条件“NOT Description LIKE 'Polygon'”返回“Point Data”,

queryOptions.AddFeatureProperty("Name");

queryOptions.SetFilter("NOT Description LIKE 'Polygon'");

featureReader = featureService.SelectFeatures(featureSrcResourceId,

featClassName, queryOptions);

……

featureReader.Close();

 

过滤条件“Description LIKE 'Pol_gon'”返回“Polygon Data”。

queryOptions.AddFeatureProperty("Name");

queryOptions.SetFilter("Description LIKE 'Pol_gon'");

featureReader = featureService.SelectFeatures(featureSrcResourceId,

featClassName, queryOptions);

……

featureReader.Close();

 

3)  <Identifier> IN (<ValueExpressionCollection>)

IN操作符用于选择与列表中的任意一个值匹配的要素,给定一个Int16类型的属性Id,过滤条件“Id IN (-5995, -7033)”选择Id属性值等于-5995或-7033的要素。

1.1.1.3  排序

调用MgQueryOptions::SetOrderingFilter(…)可以将查询结果进行排序,该方法的签名如下所示,参数orderByProperties是一个属性名称的集合,用于指定排序的属性,如果指定了多个属性,那么优先使用orderByProperties中序号较小的属性,只有在序号较小的属性具有相同的值时,才使用序号较大的属性;参数orderOption用于指定是以升序的方式还是降序的方式进行排序,它的值可以为MgOrderingOption::Ascending或MgOrderingOption::Descending,分别用于表示升序和降序。

void SetOrderingFilter(MgStringCollection orderByProperties, int orderOption);

1.1.1.4  分组

调用MgFeatureAggregateOptions::SetGroupingFilter(…)可以将查询结果进行分组,该方法的签名如下所示,参数groupByProperties是一个属性名称的集合,用于指定分组的属性,如果指定了多个属性,那么优先使用orderByProperties中序号较小的属性,只有在序号较小的属性具有相同的值时,才使用序号较大的属性;参数groupFilter用于指定分组的过滤器。

void SetGroupingFilter(MgStringCollection groupByProperties, string groupFilter);

如下的代码展示了如何使用分组创建一个聚合类查询。

$stringCollection->Add("GroupName");

$groupingFilter = "GroupName = 'Group1' or GroupName = 'Group2' or

GroupName = 'Group3'";

$aggregateOptions->SetGroupingFilter($stringCollection, $groupingFilter);

$aggregateOptions->SetComputedProperty("minD", "min(aDouble)");

$dataReader = $featureService->SelectAggregate($featureSrcResId,

$featClassName, $aggregateOptions);

上面代码的功能类似于如下的SQL语句。

SELECT min(aDouble) AS minD FROM featclass GROUP BY groupname

HAVING groupname = 'Group1' OR groupname = 'Group2' OR groupname = 'Group3'

1.1.1.5  MgDataReader、MgFeatureReader和MgSqlDataReader

MapGuide支持三种类型的读取器,它们分别为MgDataReader、MgSqlDataReader和MgFeatureReader,读取器的类型由类MgReaderType定义。

l  MgReaderType::DataReader

l  MgReaderType::FeatureReader

l  MgReaderType::SqlDataReader

类MgDataReader、MgSqlDataReader和MgFeatureReader都继承自MgReader,都是一个用于读取查询结果的前向只读迭代器(Forward-Only, Read-Only Iterator),读取器的初始位置总是位于第一个数据之前,在读取数据之前必须调用方法ReadNext(…),在调用ReadNext(…)之后就无法读取读取器当前位置之前的数据。它们之间的主要不同点是,MgFeatureReader包含了一个方法MgFeatureReader::GetClassDefinition(),通过该方法的返回值可以得到查询结果的类定义(Class Definition),通过类定义得到每个属性的定义、主键等信息,而MgDataReader和MgSqlDataReader仅仅可以通过方法MgReader::GetPropertyType(…)得到属性的类型。

如下的代码展示了将一个MgFeatureReader实例中的所有要素输出到一个文件中。

function printFeatureReader($featureReader)

{

   global $logFileHandle;

   $i = 0;

   while ($featureReader->ReadNext())

   {

      fwrite($logFileHandle, "Printing a feature.n");

      $i++;

      $propCount = $featureReader->GetPropertyCount();

      for($j=0; $j<$propCount; $j++)

      {

          $propertyName = $featureReader->GetPropertyName($j);

          $boolVal = $featureReader->IsNull($propertyName);

          if ($boolVal)

             continue;

          $propertyType = $featureReader->GetPropertyType($propertyName);

          printPropertyValueFromFeatReader($featureReader,

$propertyType, $propertyName);

      }

   }

   return $i;

}

 

function printPropertyValueFromFeatReader($featureReader, $propertyType, $propertyName)

{

   global $logFileHandle;

   global $agfReaderWriter;

   global $wktReaderWriter;

   switch ($propertyType)

   {

      case MgPropertyType::Null :

             fwrite($logFileHandle, "$propertyName is a null propertyn");

             break;

      case MgPropertyType::Boolean :

             $val = $featureReader->GetBoolean($propertyName);

             $valStr = printBoolean($val);

             fwrite($logFileHandle, "$propertyName is boolean "$valStr"n");

             break;

      case MgPropertyType::Byte :

             $val = $featureReader->GetByte($propertyName);

             fwrite($logFileHandle, "$propertyName has a byte value of "$val"n");

             break;

      case MgPropertyType::DateTime :

             $val = $featureReader->GetDateTime($propertyName);

             $valStr = printDateTime($val);

             fwrite($logFileHandle, "DateTime is "$valStr"n");

             break;

      case MgPropertyType::Single :

             $val = $featureReader->GetSingle($propertyName);

             fwrite($logFileHandle, "$propertyName is single "$val"n");

             break;

      case MgPropertyType::Double :

             $val = $featureReader->GetDouble($propertyName);

             fwrite($logFileHandle, "$propertyName is double "$val"n");

             break;

      case MgPropertyType::Int16 :

             $val = $featureReader->GetInt16($propertyName);

             fwrite($logFileHandle, "$propertyName is int16 "$val"n");

             break;

      case MgPropertyType::Int32 :

             $val = $featureReader->GetInt32($propertyName);

             fwrite($logFileHandle, "$propertyName is int32 "$val"n");

             break;

      case MgPropertyType::Int64 :

             $val = $featureReader->GetInt64($propertyName);

             fwrite($logFileHandle, "$propertyName is int64 "$val"n");

             break;

      case MgPropertyType::String :

             $val = $featureReader->GetString($propertyName);

             fwrite($logFileHandle, "$propertyName is string "$val"n");

             break;

      case MgPropertyType::Blob :

             fwrite($logFileHandle, "$propertyName is blobn");

             break;

      case MgPropertyType::Clob :

             fwrite($logFileHandle, "$propertyName is clobn");

             break;

      case MgPropertyType::Feature :

             $val = $featureReader->GetFeatureObject($propertyName);

            if ($val != NULL)

             {

                 fwrite($logFileHandle, "$propertyName is a featuren");

                 printFeatureReader($val);

             }

             break;

      case MgPropertyType::Geometry :

             fwrite($logFileHandle, "$propertyName is a geometryn");

             $val = $featureReader->GetGeometry($propertyName);

             if ($val != NULL)

             {

                $aGeometry = $agfReaderWriter->Read($val);

                $wktRepresentation = $wktReaderWriter->Write($aGeometry);

                fwrite($logFileHandle, "WKT Representation: "$wktRepresentation"n");

             }

             else

             {

                fwrite($logFileHandle, "This geometry property is nulln");

             }

             break;

      case MgPropertyType::Raster :

             $val = $featureReader->GetRaster($propertyName);

             fwrite($logFileHandle, "$propertyName is a rastern");

             break;

      default : fwrite($logFileHandle, "Unknown property typen");

   }

}

需要注意的是,在使用读取器读取完数据后要尽量马上调用方法MgReader::Close()关闭读取器。为什么呢?为了提高MapGuide服务器的响应速度,MapGuide服务器使用了连接池(Connection Pool)的方式缓存了要素源FDO连接,即FdoIConnection实例,当接收到一个要素服务请求之后,它会首先在FDO连接池中查找是否有可用的FDO连接,如果有就使用此FDO连接执行服务请求,否则创建一个新的FDO连接,但是如果已经超过服务器配置文件中设置的最大FDO连接数,那么此要素服务请求会失败。当要素服务返回一个读取器之后,为了保证查询结果不会在读取数据之前消失,MapGuide服务器会将读取器所关联的FDO连接标记为正在使用,只有在调用方法MgReader::Close()关闭读取器后才会关闭和释放此FDO连接,如果不及时调用方法MgReader::Close()可能会导致超过最大FDO的连接数,最终无法处理要素服务请求。

ArcGIS API for JS实现要素的查询与定位 1、实现多要素查询与定位 a、线查询与定位 线要素主要是那些到路线,在查询下下拉选择某种道路类型,便可以获得该图层的layerid,将该ID值传递给要查询的URL,形成完整的查询URL,通过Query()和QueryTask实现查询过程,获取查询结果的features,循环遍历每个feature,添加Graphic样式,在图上高亮显示。   以上部分都比较容易,关键是定位。 之前实现... 阅读详情

相关推荐

ArcGIS 实现框选区域查询要素后,要素点击弹出框

2015.11.12 在webGis 项目的开发中,当前已经实现使用QueryTask来针对要素进行NAME,空间,缓冲区的查询之后,

step by step 1万+

ArcGIS JavaScript for API(007)featurelayer 要素查询,查询指定范围内包含要素featurelayer .queryFeatures。

我们在做系统开发时,经常会遇到,要查询指定范围内包含的要素。原理很简单就是面内包含的要素。 arcgis featurelayer 可以实现这个功能。使用到的接口 是featurelayer .queryFeatures(options),返回结果是FeatureSet。 我实现了一个 以鼠标点击点为中心,指定为半径范围内包含的要素。 layer.queryFeatures({ geometry: geo, // 查询中心点

wangjianbo09的博客 2376

VIL-SLAM论文翻译:Stereo Visual Inertial LiDAR Simultaneous Localization and Mapping

文章目录写在前面摘要1.引言2.相关工作3.系统概述4.视觉前端5.双目视觉惯性里程计A. IMU预积分因子B. 非结构化视觉因子C. 优化和边缘化6. 激光建图A. LiDAR扫描去畸变B. 帧到地图配准7. LiDAR增强的闭环A. 回环检测B. 回环约束C. 全局位姿图优化D. 重定位8. 实验结果A.平台和软件B.测试和结果C. EuRoCMAV数据集测试9.结论 写在前面 写作参考: robot L 开源代码: 开源代码链接 论文原文: 原文链接 摘要 SLAM是移动和空中机器人的一项基本任务

JaydenQ的博客 2321

通过SQL语句实现要素Geometry字段解析

在系统应用中,为了获取要素几何字段的点值集合,我们以前经常会想到用ArcEngine来进行开发解析,这里介绍一种更快捷的方式,通过SDE提供的数据库ST函数,利用SQL语句直接解析。 1)配置Oracle外接函数库 如果要在Oracle中执行ST函数,首先必须配置以下内容。 a、 配置Oracleextproc,详情请见附件“配置 Oracle extproc 以使用 SQL 访问地理数据...

iteye_8029的博客 562

一文读懂:CAN总线Bus-Off的触发条件与自动恢复机制

本文详细解析CAN总线Bus-Off状态的触发条件与自动恢复机制。根据ISO 11898-1标准,当发送错误计数器(TEC)超过255时节点进入Bus-Off状态,并通过检测128次总线空闲条件实现自动恢复。文章结合实战案例,探讨硬件故障、软件配置及电磁干扰等常见触发场景,并提供快慢恢复策略与调试方法,帮助工程师快速定位并解决CAN网络故障。

rgv234567的博客 360

Vue3+uniapp开发必备:5分钟搞定unplugin-auto-import自动导入配置(附常见报错解决)

本文详细介绍了在Vue3+uniapp项目中配置unplugin-auto-import插件实现自动导入的方法。通过该配置,开发者无需手动导入ref、onLoad等常用API,可显著提升编码效率和团队协作规范性。文章提供了从安装、TypeScript集成到高级用法的完整指南,并附带了常见报错的解决方案。

weixin_29008805的博客 961

sql查询速度的影响要素

sql查询速度的影响要素转自:http://hi.baidu.com/sumspringboy/blog/item/4c19b1dd4279a4a6cd1166c2.html 1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)    2、I/O吞吐量小,形成了瓶颈效应。    3、没有创建计算列导致查询不优化。 4、内存不足    5、网络速度慢

896

用Python和NumPy可视化理解波函数:从概率密度到薛定谔方程的可视化教程

本文通过Python和NumPy实现量子力学波函数的可视化,从概率密度到薛定谔方程的动态演化,帮助读者直观理解量子态的特性。教程涵盖无限深势阱、量子谐振子等模型,结合代码示例展示时间演化和期望值计算,为量子力学学习提供实用工具。

weixin_27303545的博客 226

ArcGIS Server之高亮查询要素

ArcGIS Server之高亮查询要素 - [ArcGIS Server] 2009-12-01 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://geospatialthinking.blogbus.com/logs/52666699.html GIS中,一般查询要素后,为提醒用户注意,都会在地图上用不同的颜色将要素高亮显示,或者以闪烁实现

li_xin_an666的专栏 3202

首发!谷歌倾斜摄影数据转换生成OSGB格式

全球首发,谷歌倾斜摄影模型文件能直接转换成OSGB格式!

cyber_room的博客 2287

数据结构(超详细讲解!!)第十七节 队列应用(杨辉三角)

杨辉三角

2201_76115387的博客 1375

IGServer中基于要素服务的几何、属性查询

GIS中矢量数据由几何+属性组成,每个几何与描述几何的属性组成一个要素,是GIS数据的基本单元。几何即坐标,描述了要素所处的空间位置信息,属性则是一些字段,描述了与要素相关的信息。在GIS中的空间查询支持属性条件查询、几何条件查询、属性与几何条件复合查询,其中的几何查询按照查询的几何类型,也可分为点查询、线查询、区查询,而根据查询几何与目标要素几何的相对位置关系(即拓扑关系),又可分为相交、外包矩形相交、包含、相离几种查询方式。

weixin_51135184的博客 721

超十万字解读Spring AI实战:开篇

大模型技术正以惊人的速度改变世界,2025年的人工智能已不再是科幻,而是现实。大模型如ChatGPT等,正在重塑各行各业,降低技术门槛,使专业能力普及化。SpringAI的出现为Java开发者提供了桥梁,使其能在企业级系统中稳定运行AI,同时保持工程化思维。尽管SpringAI在生态、学习成本和性能上存在不足,但其企业级基因和国产化适配能力使其成为Java开发者的重要工具。本系列文章旨在介绍SpringAI的功能与特性,鼓励更多Java开发者参与AI实践,共同探索AI时代的无限可能。

liaokailin的专栏 1576

要素图层范围查询属性

要素图层范围查询属性* 本文主要通过Query和FeatureLayer.setDefinitionExpression来对要素图层进行范围查询属性。查询结果由FeatureTable来显示,且形状也可以显示在地图上。

浊酒入清梦的博客 2189

光学系统仿真软件:OSLO_(13).衍射光学元件设计v1

目标函数是设计DOE的关键步骤之一。目标函数可以是一个具体的光强分布,也可以是一个特定的波前形状。在仿真软件中,目标函数通常用数学表达式或数据文件来定义。假设我们需要设计一个二元相位掩模,使其在特定位置生成三个焦点。我们可以定义一个目标函数来描述这三个焦点的光强分布。# 定义目标函数"""定义一个多焦点目标函数:param x: 横坐标:param y: 纵坐标:param z1: 第一个焦点的深度:param z2: 第二个焦点的深度:param z3: 第三个焦点的深度。

kkchenjj的博客 1003

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

arcengine突击3——空间查询之 要素选择和属性查询

分为要素选择和属性查询(在同一窗口下实现,不涉及新窗口) 要素选择: 实现按矩形面的方式选择要素,实现方法都在主视图的onMouseDown中实现。 定义全局变量state,这里用单选按钮实现要素选择方式: 如果按面选择且事件源为鼠标右键,定义map1的矩形轨迹为包络线,使用map1.map.selectbyshape传入包络线,实现选择矩形框内元素,map1刷新 ...

DL_GIS 4538

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

ArcEngine创建缓冲区,并查询缓冲区内要素

实现功能: 1.获取鼠标选中的要素 2.对选中要素设置缓冲距离,在地图上显示缓冲区 3.进行缓冲区查询,获得缓冲区内的要素,并放入TreeList展示 /// /// 创建缓冲区 /// private void CreateBuffer() { ITopologicalOperator

奚学长的工地 8309

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C# 基于AE的GIS二次开发 要素查询操作,属性表查询操作及其属性表修改操作

直接上代码: 要素查询 并高亮显示 模糊查询我的根据自己的表设计的,自己用基本语句是 属性表字段 LIKE '*内容*' *号为 SQL like语句里的% like '%%',在ArcGIS里是*开始用%不出来,其他查询语句都遵循SQL语法 /// <summary> /// 清除选择 /// </summary> ...

DX奥特曼的博客 5748

框选要素查询

public class SelectFeatures extends Activity { private MapView map = null; private ArcGISFeatureLayer mFeatureLayer = null; private GraphicsLayer mGraphicsLayer = null; private Simple...

AndLi 346

要素图层范围查询属性arcgis api for js

此篇博客为转载,感谢博主,原文链接:https://www.waitig.com/%E8%A6%81%E7%B4%A0%E5%9B%BE%E5%B1%82%E8%8C%83%E5%9B%B4%E6%9F%A5%E8%AF%A2%E5%B1%9E%E6%80%A7.html。 要素图层范围查询属性 本文主要通过Query和FeatureLayer.setDefinitionExpres...

438

空间查询(ISpatialFilter):统计多边形要素内的要素

简述:多边形要素类(pFCPolygon);要素类(pFC) 1、首先获取查询每一个多边形要素       IFeatureCursor pFCurPoly=pFCPloygon.Search(null,true);       IFeautre pFPoly=pFCurPoly.NextFeature(); 2、获取每个多边形要素内的每一个要素       while(pFPoly!=

GIS探索之路 2451

arcgis server 学习(一) 地图要素查询

  进行地图要素查询分三步1.获得Functionalities,从Funtionalities中获取需要的数据源2.判断得到的数据源是否支持IQueryFunctionality接口,在支持的情况下定义一个IQueryFunctionality接口3.利用得到的接口在自己定义的SpatialFilter条件下通过Query方法得到查询结果,结果为DataTable类型

TemateRoom的专栏 1381

WebGIS 之 ol怎么查询要素

在 OpenLayers 中,您可以通过编写 WFS (Web Feature Service) 请求来查询地理要素。是您希望在 code 字段中进行模糊匹配的值。您需要根据实际情况替换。等参数为您的实际命名空间、工作区名称和查询图层名称。为您的 WFS 服务器的 URL,以及。

2302_78438891的博客 393
上一篇: 空间关系
下一篇: 获取要素源的能力
MapGuide_Inside
博客等级 码龄17年 340粉丝 71原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值