我想从这个网站:https://ispu.mgipu.hr/抓取数据这个想法是提取出你放大后可以看到的小点(它们的坐标)。
下面是我想要自动化的过程(至少缩放到1:5000之后):
- 你必须点击右边有正方形、三角形和圆形的符号。 然后你必须点击下面的"Info lokacija"。
- 那么你必须选择'Poligonom'而不是'Odabir'。 现在你必须用鼠标绘制任何东西,完成后双击。
如果您在上述过程中检查网络,您可以看到出现一个新的XHR请求:'obuhvat'。这是一个POST请求,它只有一个有效载荷元素(POLYGON with coordinates)。
我试图让这些POST请求直接到同一个网站,但我总是得到400响应。
只有当我首先在浏览器中完成所有操作并将相同的有效负载复制粘贴到请求中时,它才有效。
这是我的尝试:
library(httr)
# params
url <- 'https://ispu.mgipu.hr/geo/api/info-lokacija/obuhvat'
ua <- 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36'
# this works becuase I have already draw these polygon in app manually
data <- list(
geom = "POLYGON((466131.6322632646 5062601.925203851,466141.4322828647 5062489.924979851,466292.63258526527 5062489.924979851,466287.03257406526 5062596.325192652,466131.6322632646 5062601.925203851))"
)
req <- POST(url, body = data, encode = 'json', user_agent(ua))
print(req$status_code)
# this doesnt work, I have just change the one number in data
data <- list(
geom = "POLYGON((466131.6322632647 5062601.925203851,466141.4322828647 5062489.924979851,466292.63258526527 5062489.924979851,466287.03257406526 5062596.325192652,466131.6322632646 5062601.925203851))"
)
req <- POST(url, body = data, encode = 'json', user_agent(ua))
print(req$status_code)
所以,这不是我想给出的完整答案,但可能是10的开始。
回想学校的几何,我想起了关于多边形的规则,并假设你改变坐标可能违反了规则。
举你的例子-
工作:
POLYGON((470883.3817753086 4925329.690667927,470757.9415158831 4925207.6103212265,470924.8218453713 4925156.090320726,470883.3817753086 4925329.690667927))
不工作:
POLYGON((466131.6322632647 5062601.925203851,466141.4322828647 5062489.924979851,466292.63258526527 5062489.924979851,466287.03257406526 5062596.325192652,466131.6322632646 5062601.925203851)))
我决定通过一个包,可以检查至少一些多边形的规则,并给我返回比http代码更有意义的信息。
library(sf)
#> Warning: package 'sf' was built under R version 4.0.3
#> Linking to GEOS 3.8.0, GDAL 3.0.4, PROJ 6.3.1
x = st_as_sfc("POLYGON((466131.6322632646 5062601.925203851,466141.4322828647 5062489.924979851,466292.63258526527 5062489.924979851,466287.03257406526 5062596.325192652,466131.6322632646 5062601.925203851)))")
st_is_valid(x, reason = TRUE)
#> [1] "Valid Geometry"
# your altered
x = st_as_sfc("POLYGON((466131.6322632647 5062601.925203851,466141.4322828647 5062489.924979851,466292.63258526527 5062489.924979851,466287.03257406526 5062596.325192652,466131.6322632646 5062601.925203851)))")
st_is_valid(x, reason = TRUE)
#> Error in CPL_geos_is_valid_reason(x): Evaluation error: IllegalArgumentException: Points of LinearRing do not form a closed linestring.
由reprex包(v0.3.0)创建于2021-02-09
根据sf包中应用的规则,我们现在得到了一些关于你的调整有效性的有用信息。
Error in CPL_geos_is_valid_reason(x):求值错误:IllegalArgumentException: Points of LinearRing do not form a closedlinestring .
在谷歌上搜索这个错误,我得到了@yellowcap:
的答案。一个有效的多边形或多多边形必须有相同的起始点和起始点端点。
是有意义的。你改变了起始点,所以它与结束点不匹配,这意味着你没有一个封闭的多边形。
# start 466131.6322632647 5062601.925203851
# end 466131.6322632646 5062601.925203851
测试改变不同的坐标集(不是first|last);保持起始和结束对相同,修改第二对
# 466141.4322828647 5062489.924979851 >> 566141.4322828647 6062489.924979851
x = st_as_sfc("POLYGON((466131.6322632647 5062601.925203851,566141.4322828647 6062489.924979851,466292.63258526527 5062489.924979851,466287.03257406526 5062596.325192652,466131.6322632647 5062601.925203851))")
st_is_valid(x, reason = TRUE)
# [1] "Valid Geometry"
但是,这并不能保证在POST中被接受。所以,我想象一些其他的约束条件是sf的应用没有处理到的。我对GIS的了解不足以解决这个问题但也许GIS。stackexchange.com上的人可以?
我看过这个对于一些背景,它列出了:
21.1。什么是有效性
有效性对于多边形来说是最重要的,因为多边形定义了有界的区域,并且需要大量的结构。行是很简单,不能无效,也不能分。
一些多边形有效性的规则感觉很明显,而另一些感觉任意的(事实上,是任意的)。
- 多边形环必须闭合
- 定义孔的环应该是定义外部边界的内环。
- 环不能自相交(它们既不能接触也不能交叉)。
- 环不能接触其他环,除非有一点。
所以,我想知道sf包是否提供了一个快速解决方案:
st_make_valid()
遗憾的是,我无法用它来解决你的失败案例。
然后我开始掉进一个大的GIS洞里,几乎不知道我要去哪里。我开始查看QGIS,看看我是否可以编辑几何图形并计算更多,但没有走远。
这是我的假设,有一些证据,一个关于下一步问/看哪里的建议,一个"目前失败但感兴趣的,所以会重新审视";退出 ........
阅读:http://postgis.refractions.net/docs/ST_MakeValid.html
https://docs.qgis.org/testing/en/docs/user_manual/working_with_vector/editing_geometry_attributes.html vertex-tool
https://r-spatial.github.io/sf/articles/sf5.html- https://postgis.net/workshops/postgis-intro/validity.html
- https://www.rdocumentation.org/packages/lwgeom/versions/0.2-1/topics/valid