【问题标题】:how to get all information of wkt polygon when i click on it?当我点击它时如何获取wkt多边形的所有信息?
【发布时间】:2018-02-21 13:25:40
【问题描述】:

我从 MSsql server 2012 以 json 格式获取数据,我只得到 WKT 字符串以转换以使用 ol.format.WKT() 在地图上显示。

我想在单击弹出窗口时显示多边形的 ID 和名称。 如何识别我点击的是哪个多边形?

我如何知道我点击了哪个多边形的地图并获取该多边形的数据?

for (var i = 0; i < geometries.length; i++) {

    var feature = wktReader.readFeature(geometries[i].GeomCol1.Geometry.WellKnownText);

    feature.getGeometry().transform('EPSG:4326', 'EPSG:3857');

    if (feature.getGeometry().getType() == 'Polygon') {
        feature.setStyle(new ol.style.Style({
            stroke: new ol.style.Stroke({
                color: 'blue',
                width: 1
            }),
            fill: new ol.style.Fill({
                color: 'rgba(0, 0, 255, 0.1)'
            })
       }));
       featureCollection.push(feature);
    }
}

这是我获取 wkt 字符串的一部分。

这些是我显示的多边形,我想显示一个弹出窗口,其中包含我单击的多边形信息

这是一张我如何在我的 MSsql 服务器中存储空间数据的图片

谢谢

【问题讨论】:

  • 在 OL 术语中,多边形是指“特征”或字面意思是 特征的多边形
  • 感谢您的关注,我是新手,我不太确定“多边形特征”和“特征的多边形”有什么区别?实际上我已经改变了问题,想知道如何检索我单击的多边形的信息。再次感谢

标签: json sql-server openlayers openlayers-3 wkt


【解决方案1】:

forEachFeatureAtPixel (api doc) 可以让你获得某个位置的所有特征。诚然,使用起来可能会令人困惑。您传递给该函数的回调会为每一层调用。如果回调返回一个真实值,它会停止,然后 forEachFeatureAtPixel 返回任何回调返回的值。这使得选择特定功能非常完美。

var count = 2000;
var features = new Array(count);
var e = 4500000;
for (var i = 0; i < count; ++i) {
  var coordinates = [2 * e * Math.random() - e, 2 * e * Math.random() - e];
  features[i] = new ol.Feature({
    geometry: new ol.geom.Point(coordinates),
    myHappyAttribute: ('you are beautiful ' + i)
  });
}

var source = new ol.source.Vector({
  features: features
});

var layer = new ol.layer.Vector({source: source});


const view = new ol.View({
  center: [2500000, 0], zoom: 5
});
const map = new ol.Map({
  layers: [ 
    new ol.layer.Tile({
        source: new ol.source.OSM()
    }),
    layer
  ],
  target: 'map',
  view 
});


map.on('singleclick', function(evt) {
  const pixel = map.getEventPixel(evt.originalEvent);
  const feature = map.forEachFeatureAtPixel(
    pixel,
    someFeature => someFeature, // return first element
    {
      hitTolerance: 2 // how far off the click can be
    }
  );
  if (feature) {
    const attr = feature.get('myHappyAttribute');
    console.log('clicked on feature with attr:', attr);
  } else {
    console.log('not clicked on a feature');
  }
});
<link href="https://openlayers.org/en/v4.6.5/css/ol.css" rel="stylesheet"/>
<script src="https://openlayers.org/en/v4.6.5/build/ol-debug.js"></script>
<div id="map" class="map"></div>

【讨论】:

  • 我可以像“POLYGON ((0 0, 150 0, 150 150, 0 150, 0 0))”这样得到多边形角的坐标,我如何在这个代码上使用这个响应 - ---------------------- features[i] = new ol.Feature({ geometry: new ol.geom.Polygon(coordinates), myHappyAttribute: ('you很漂亮 ' + i) }); --------------------------
  • 您的问题是“如何识别我单击了哪个多边形”。这显示在这个答案中。只需将附加属性(例如 ID_nom)添加到几何所属的特征并使用feature.get(attributeName) 来读取您的自定义属性。 myHappyAttribute 就是这种属性的一个例子。
  • 我的问题没问题。但我已指定我有 wkt 格式的数据
  • 我不确定 wkt 格式如何处理自定义属性。读者的代码表明它们没有被使用。但如果是, feature.get(attrName) 应该可以完成这项工作。也许将随机 wkt 功能分配给全局变量,然后使用浏览器的调试器检查它的属性。 (不要使用 console.log(feature),它会因为自引用循环而阻塞浏览器)。或者如果您无法弄清楚,请提供带有数据的代码示例
猜你喜欢
  • 1970-01-01
  • 2016-05-15
  • 1970-01-01
  • 2013-03-07
  • 2017-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多