我正在寻找的解决方案是将DW公里请求转换为公里数的精确方法,或者让GeoServer识别请求中指定的单位,以便能够直接传递公里数。
我正在向GeoServer发出一个WFS请求以返回一定距离内的点(例如,在一个点的3公里内)并且我的结果不准确。我目前正在使用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。
我还将纬度/经度放入此网址的计算器中,用于圆圈的中心和出现在其外部的点。计算器给了我相同的距离和我在图像中使用的测量工具 我相信圆和测量工具正常工作。 http://www.movable-type.co.uk/scripts/latlong.html
答案 0 :(得分:1)
计算一度的长度的方式有几个问题。
首先,纬度的长度与经度不同。这样做会产生椭圆,而不是圆形。如果你使用最小长度(经度),你将省略点,如果你使用最长的(纬度),你将有太多的点。
要获得给定纬度的经度长度,必须使用余弦并以度数进行计算。
degreeKM = cos(latDegree) * 111.325
在60度时,它大致为cos(60)* 111.325 = 55.66 km,对应于找到的值here,几乎是您目前所用长度的一半。
话虽如此,这整个方法对于诸如基本任务来说相当麻烦。您是否可以访问像PostGIS这样可以进行过滤的数据库?
答案 1 :(得分:0)
在我的回答中,DWITHIN 基本上坏了。它不能正确接受单位,也没有为我绘制正确的圆圈,即使在赤道附近的小比例尺上使用正确的投影输入,它也会出现椭圆形。
我的解决方法/解决方案:使用客户端上的空间库将圆计算为多边形,生成众所周知的文本 (WKT) 并使用 WITHIN
而不是 DWITHIN
。
在阅读了 GeoServer 上关于 DWITHIN 的几个投诉并且没有尝试修复它之后,我决定我现在不应该使用它。也许你或我可以花一些时间来修复它:)
客户端代码会更复杂,我不会在这里演示,但 CQL 代码会简单得多,没有半径或单位,看起来像这样:
WITHIN(the_geom,POLYGON((<circle-path-here>)))