首页 文章

GeoServer - DWITHIN没有正确过滤点

提问于
浏览
1

我正在寻找的解决方案是将DW公里请求转换为公里数的精确方法,或者让GeoServer识别请求中指定的单位,以便能够直接传递公里数 .

我正在向GeoServer发出WFS请求以返回一定距离内的点(例如,在一个点的3km内)并且我的结果不准确 . 我目前正在使用OpenLayers版本3.11.2并运行GeoServer版本2.6.2并且还使用2.7.1进行了测试 .

这是我用于DWITHIN的CQL过滤器,其中第三个参数是返回结果的半径的度数值 . 我使用“%29”做了一个右括号,因为我在发出请求时遇到了问题 .

CQL_FILTER=dwithin(the_geom,point(46.1379%20-60.1957),0.05577532499489729,meters%29

问题是GeoServer中存在一个错误,它只支持度,即使我将单位称为米 . 关于这里的更多信息https://gis.stackexchange.com/questions/132251/dwithin-wfs-filter-is-not-working

我之前尝试过这个问题并达到了足够准确的时刻,可以在这里阅读Geoserver - filtering points using DWITHIN

这些计算是在JavaScript中完成的 . 最初我使用半径/ 111.325将km转换为未返回搜索范围内某些点的度数 . 例如,半径设定为2.7公里,结果2公里以外的地方有时不会返回 .

我现在改变了计算,使用来自这个问题的信息来调整纬度之间的距离https://gis.stackexchange.com/questions/142326/calculating-longitude-length-in-miles

//get value of a degree in radians at current Latitude
var latRadians = lat * Math.PI / 180;

//get the value in kilometers for the current latitude based off radian value 
var degreeKM = latRadians * 111.325

var converteddistance = radius / degreeKM;

然后我将CQL Fitler中的转换距离作为返回结果的半径传递 . 这个问题是一些结果现在返回到半径之外 . 这个圆的半径为5km,你可以看到结果返回5.79km .

Image Radius

我还将纬度/经度放入此网址的计算器中,用于圆心和出现在其外部的点 . 计算器给了我相同的距离和我在图像中使用的测量工具,所以我相信圆和测量工具正常工作 . http://www.movable-type.co.uk/scripts/latlong.html

1 回答

  • 1

    计算一个学位长度的方式有几个问题 .

    首先,纬度的长度与经度不同 . 这样做会产生椭圆,而不是圆形 . 如果你使用最小长度(经度)你将省略点,如果你使用最长的(纬度),你将有太多的点 .

    要获得给定纬度的经度长度,必须使用余弦并以度为单位进行计算 .

    degreeKM = cos(latDegree) * 111.325

    在60度时,它将大致为cos(60)* 111.325 = 55.66 km,这对应于找到的值here,几乎是您目前所拥有的长度的一半 .

    话虽如此,这整个方法对于诸如基本任务来说相当麻烦 . 您是否可以访问像PostGIS这样可以进行过滤的数据库?

相关问题