使用开放层3检查lat long是否在范围内

时间:2017-03-30 10:47:47

标签: javascript geolocation openlayers-3 geoserver

我有一个英国县形状文件(Multipolygon),在我的地理服务器中使用EPSG:4326。我使用开放图层3在我的应用程序中加载此形状文件,如下所示:

source = new ol.source.XYZ({url: '/gmaps?zoom={z}&x={x}&y={y}&Layers=UKCounties', crossOrigin: "anonymous"});
countiesLayer = new ol.layer.Tile({source: source});
map.addLayer(countiesLayer);

这很有效。我要求用户获取当前位置,这是以

完成的
var coordinate = geolocation.getPosition();

我能够找到正确的lat&在这里。例如:Lat = 53.797534899999995,Lng = -1.5449。现在我需要检查哪些县(多边形)这些点在使用开放层3&的JavaScript。 使用Geoserver WFS,我能够获得每个县的边界框

$.each(features, function(index, eachFeature) {
            var bbox = eachFeature.properties.bbox;
            if (bbox != null) {
              var bottomLeft = ([bbox[0], bbox[1]]);
              var topRight = ([bbox[2], bbox[3]]);
              var extent = new ol.extent.boundingExtent([bottomLeft, topRight]);

            if (ol.extent.containsXY(extent1,lat,long)) {
                alert("got the feature");
            }
        }

});

问题是我的代码没有打印警告声明。我也尝试过使用

if (ol.extent.containsXY(extent,long,lat))

var XY = ol.proj.transform([long, lat], 'EPSG:4326', 'EPSG:3857');

if(ol.extent.containsXY(extent,XY [0],XY [1])) if(ol.extent.containsXY(extent,XY [1],XY [0]))

但这些都没有打印警报。这有什么不对吗?

2 个答案:

答案 0 :(得分:0)

在回答你的问题之前,我不知道" ol.extent.containsXY "的方法。 我用我糟糕的逻辑!如果在多边形中我通过以下方式检测到一个特征:

  1. 功能容器(多边形)转换为坐标[lon,lat]
  2. 检测容器是否包含功能
  3. 范围数组规则 [minLon,minLat,maxLon,maxLat]

    代码段:( my destinationPro:' EPSG:3857',sourcePro:' EPSG:4326'

    QyGIS.prototype.isInner = function(featureExtent, containerExtent) {
        var featureLonLat = ol.proj.transformExtent(featureExtent, destinationPro, sourcePro);
        var containerLonLat = ol.proj.transformExtent(containerExtent, destinationPro, sourcePro);
        // in my condition, the feature is a point, so featureLonLat[0] = featureLonLat[2], featureLonLat[1] = featureLonLat[3]. what's more extent have four value in a array so the loop length is 4
        for (var i = 0; i < featureLonLat.length; i++) {
        /* actually:
         featureLonLat[0] < containerLonLat[0] || featureLonLat[0] > containerLonLat[2]
         featureLonLat[1] < containerLonLat[1] || featureLonLat[1] > containerLonLat[3]
         featureLonLat[2] < containerLonLat[0] || featureLonLat[2] > containerLonLat[2]
         featureLonLat[3] < containerLonLat[1] || featureLonLat[3] > containerLonLat[3]
        */
            if (featureLonLat[i] < containerLonLat[i % 2] || featureLonLat[i] > containerLonLat[i % 2 + 2]) {
                return false;
            }
        }
        return true;
    };
    
    QyGIS.prototype.getInnerFeatures = function(layerName, extent) {
        var self = this;
        var layer = self.getLayer(layerName);
        if (layer) {
            var source = layer.getSource();
            var features = source.getFeatures();
            for (var i = 0; i < features.length; i++) {
                var curFeatureExtent = features[i].getGeometry().getExtent();
                if (self.isInner(curFeatureExtent, extent)) {
                    console.log(features[i].get('name') + 'in area');
                }
            }
        }
    };
    

    enter image description here

    最后,如果我的回答让你感到困惑,抱歉我的英语很差。

答案 1 :(得分:0)

我必须使用

var XY = ol.extent.applyTransform(extent, ol.proj.getTransform("EPSG:3857", "EPSG:4326"));

而不是

var XY = ol.proj.transform([long, lat], 'EPSG:4326', 'EPSG:3857');

它有效。