1

如下面发布的代码所示,我创建了一个几何图形,VectorTileLayer该几何图形VectorTileSourceMVTurl属性中所述的 web 服务中检索的。数据库表包含如下所示的列。对于每个放大和缩小或拖动事件,将调用 Web 服务并根据 和 zoom 检索匹配/对应xy图块z。webservice 提供的VectorTileSource是表格的一行grid_cell_data。现在,对于每个渲染的特征,该函数style将被调用。我想要实现的是,可以访问呈现的特征属性/属性,例如isTreatmentfourCornersRepresentativeToBufferAsGeoJSON等等。我在样式函数中添加了日志,如下所示,但下表中的列均不可访问。换句话说,表的列名没有设置为渲染特征的属性。呈现的特征应该是包含所有信息的行。请让我知道如何访问功能属性我还添加了一张图片,显示了样式功能中提到的日志的输出。

代码

public visualisePolygonsAsMVTTilesOnMapWithColors(map,keyGridsAsGeoJSON,fillColor,strokeColor,text){
var vectorTile = new VectorTileLayer({
    source: new VectorTileSource({
        format: new MVT(),
        url: environment.LocalHostForTileLayerSourceAsMVTTileForZXYWS + "/{z}/{x}/{y}",
    }),
    style: function (feature,resolution){
        console.log("feature:",feature)
        console.log("feature.getProperties():",feature.getProperties())
    }
  });
return vectorTile;

}

postgresql 数据库表

CREATE TABLE IF NOT EXISTS grid_cell_data (
   id SERIAL PRIMARY KEY,
   isTreatment boolean,
   isBuffer boolean,
   fourCornersRepresentativeToTreatmentAsGeoJSON text,
   fourCornersRepresentativeToBufferAsGeoJSON text,
   distanceFromCenterPointOfTreatmentToNearestEdge float8,
   distanceFromCenterPointOfBufferToNearestEdge float8,
   areasOfCoveragePerWindowForCellsRepresentativeToTreatment float8,
   areasOfCoveragePerWindowForCellsRepresentativeToBuffer float8,
   averageHeightsPerWindowRepresentativeToTreatment float8,
   averageHeightsPerWindowRepresentativeToBuffer float8,
   geometryOfCellRepresentativeToTreatment geometry,
   geometryOfCellRepresentativeToBuffer geometry 
)

渲染特征的内容

在此处输入图像描述

4

2 回答 2

1

我解决了。问题出在select声明中。该select语句必须包含列名称,如下所示:

查询_1

query="""
        SELECT 
            ST_AsMVT(mvtGeometryRow, 'MVTGeometryRow', 4096, 'geom') as result
        FROM ( 
            SELECT 
                isTreatment,isbuffer,fourCornersRepresentativeToTreatmentAsGeoJSON,fourCornersRepresentativeToBufferAsGeoJSON,distanceFromCenterPointOfTreatmentToNearestEdge,
                distanceFromCenterPointOfBufferToNearestEdge,areasOfCoveragePerWindowForCellsRepresentativeToTreatment,areasOfCoveragePerWindowForCellsRepresentativeToBuffer,averageHeightsPerWindowRepresentativeToTreatment,
                averageHeightsPerWindowRepresentativeToBuffer,geometryOfCellRepresentativeToTreatment,geometryOfCellRepresentativeToBuffer,
                ST_AsMVTGeom(
                    geometryOfCellRepresentativeToTreatment,ST_MakeEnvelope(%s,%s,%s,%s,4326),4096,0,false) As geom
            FROM grid_cell_data where  geometryOfCellRepresentativeToTreatment <> 'POLYGON EMPTY' and fourCornersRepresentativeToTreatmentAsGeoJSON <> '' and fourCornersRepresentativeToTreatmentAsGeoJSON IS NOT null
            ) mvtGeometryRow
        """

以下查询是有效的,但列名不会作为渲染特征的属性出现:

query = """
        WITH j AS (
        SELECT ST_AsMVTGeom(
            geometryOfCellRepresentativeToBuffer,
            ST_MakeEnvelope(%s,%s,%s,%s,4326),4096,0,false
            ) As MVTGeom
        FROM grid_cell_data where  geometryOfCellRepresentativeToBuffer <> 'POLYGON EMPTY' and fourCornersRepresentativeToBufferAsGeoJSON <> '' and fourCornersRepresentativeToBufferAsGeoJSON IS NOT NULL        
        )
        SELECT ST_AsMVT(j.*) FROM j;
    """
    

结果 在此处输入图像描述

于 2021-11-18T13:38:21.633 回答
0

getProperties()返回属性对象,因此feature.getProperties().myProperty = myValue应该可以工作,但是该功能可以分布在多个图块上并且存在于多个缩放级别,因此这不是一个好方法,最好设置一个由唯一功能 ID 索引的对象(例如作为https://openlayers.org/en/latest/examples/vector-tile-selection.html中国家/地区的 iso_a3 代码)来存储额外的属性

const featuresExtraProperties = {};

setExtraProperty = function(feature, key, value) {
  const id = feature.getId();
  if (!featuresExtraProperties[id]) {
    featuresExtraProperties[id] = {};
  }
  featuresExtraProperties[id][key] = value;
}

getExtraProperty = function(feature, key) {
  const id = feature.getId();
  if (featuresExtraProperties[id]) {
    return featuresExtraProperties[id][key];
  }
  return;
}
于 2021-11-18T10:58:04.917 回答