我有一个英国县形状文件(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]))
但这些都没有打印警报。这有什么不对吗?
答案 0 :(得分:0)
在回答你的问题之前,我不知道" ol.extent.containsXY "的方法。 我用我糟糕的逻辑!如果在多边形中我通过以下方式检测到一个特征:
范围数组规则 [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');
}
}
}
};
最后,如果我的回答让你感到困惑,抱歉我的英语很差。
答案 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');
它有效。