我从 RGeo 多边形相交函数(Ruby 2.3.0、RGeo 0.5.3)得到奇怪/不正确的结果
我有两个多边形,我相信它们共享一个边界但不共享任何内部空间(即它们接触但不重叠):
wkt_1 = "POLYGON ((-8226874.27782158 4962626.76394919, -8223358.174520462 4961756.817075645, -8223358.174520462 4960289.557693501, -8224471.369428394 4960289.557693501, -8226874.27782158 4962253.674727506, -8226874.27782158 4962626.76394919))"
wkt_2 = "POLYGON ((-8224757.546680832 4960523.476563589, -8225269.1002275925 4959296.105368667, -8226993.791361805 4959219.668340384, -8226420.900079966 4961883.087589158, -8224757.546680832 4960523.476563589))"
poly_1 = RGeo::Geos.factory(:srid => 3857).parse_wkt(wkt_1)
poly_2 = RGeo::Geos.factory(:srid => 3857).parse_wkt(wkt_2)
Run Code Online (Sandbox Code Playgroud)
当我们检查它们之间的交点时,它返回一条线,正如预期的几何图形仅共享一个边界:
poly_1.intersection poly_2
=> #<RGeo::Geos::CAPILineStringImpl:0x3fc0249af168 "LINESTRING (-8224757.546680832 4960523.476563589, -8225598.074380083 4961210.51680879)">
Run Code Online (Sandbox Code Playgroud)
但是,在运行以下检查时,我们得到了与预期相反的结果:
poly_1.overlaps? poly_2
=> true
poly_1.touches? poly_2
=> false
Run Code Online (Sandbox Code Playgroud)
我们取两个合法重叠的多边形:
wkt_3 = "POLYGON ((-8243237.0 4970203.0, -8243237.0 4968735.0, -8242123.0 …Run Code Online (Sandbox Code Playgroud) 我是新手使用地理空间数据并正在使用Rails RGeo gem.我在rails控制台中收到以下错误:
> geo_shape = ES_Zone::FACTORY.parse_wkt
RGeo::Error::UnsupportedOperation: Proj4 is not supported because the proj4 library was not found at install time.
Run Code Online (Sandbox Code Playgroud)
当我测试是否支持proj4时,它可以预测会返回为假.
> RGeo::CoordSys::Proj4.supported?
=> false
Run Code Online (Sandbox Code Playgroud)
我用Google搜索了错误消息,但我找不到任何有关此特定问题的资源.有任何想法吗?
我需要知道一个点是否在多边形中,在我的 rails 应用程序中,以便我想使用 rgeo gem。
要安装这个 geme,我按照rgeo git上的说明进行操作
然后我确定 GEOS 和 Proj4 已正确安装。
我还添加了这个 gem 'ffi-geos',没有特别的原因,只是按照 rgeo doc
最后我在 rails 控制台上进行了测试以检查是否正常工作
更多信息:rails version 5.1.2 ide c9 os ubuntu
如果有人有解决方案,提前致谢,我也愿意使用另一个 gem,或者其他什么,我的目标是解决我的点/多边形问题。
我最近买了一台新的 MacBook Pro,但遇到了一些与 R 图形相关的问题。在绘制 sf 对象时,R 的运行速度非常慢。我发现这个问题已有几年历史了(此处: https: //github.com/rstudio/rstudio/issues/3866),但从未提出任何解决方案。作为参考,RStudioGD绘制对象的速度比它慢 300 倍以上pdf,这让我抓狂。从上面的链接分享可重现的示例(尽管系统时间数字是我的):
<<================= 从上面的链接复制:========================== =>>
我想绘制此处找到的缅甸形状文件:
https://gadm.org/download_country_v3.html
library(rgdal)
library(sp)
tdir = tempdir()
get_poly = function() {
tmp = tempfile(tmpdir = tdir)
download.file(
'https://biogeo.ucdavis.edu/data/gadm3.6/shp/gadm36_MMR_shp.zip',
tmp
)
unzip(tmp, exdir = tdir)
readOGR(tdir, 'gadm36_MMR_0', stringsAsFactors = FALSE)
}
Run Code Online (Sandbox Code Playgroud)
使用 RStudioGD 绘制此图比绘制 pdf 慢得多:
mmr = get_poly()
system.time(plot(mmr))
# user system elapsed
# 128.162 0.510 129.271
unlink(tdir, recursive = TRUE)
Run Code Online (Sandbox Code Playgroud)
重新启动 R 以清除缓存/开销并再次运行:
mmr = get_poly()
tpdf = tempfile(tmpdir …Run Code Online (Sandbox Code Playgroud) 我有一个包含位置属性的模型,由 RGeo::Cartesian::Point 对象表示,并作为空间数据存储在我的数据库中。
为了运行测试,我需要通过夹具创建此类模型的一些示例。
我尝试了几种不同的语法来初始化 erb YAML 中的位置属性,但都没有奏效。
我怎样才能做到这一点?
我有一个代表学区的多边形,我从NYC Open Data导入.我相信坐标是在epsg投影2263 - nad83/new york long island
我无法将坐标转换为Google地图可用的格式.
这是我从原始shapefile导入多边形的代码:
proj4 = "+proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs"
factory = RGeo::Geographic.projected_factory(:projection_proj4 => proj4, :projection_srid => 2263)
RGeo::Shapefile::Reader.open("/Users/dmanaster1/flatiron_school/nycdata/db/source/ES_Zones_2013-2014.shp", :factory => factory.projection_factory) do |file|
file.each do |record|
school_zone = ES_Zone.new
...
school_zone.geometry = record.geometry
school_zone.save
end
file.rewind
end
Run Code Online (Sandbox Code Playgroud)
在我的模型中:
class ES_Zone < ActiveRecord::Base
proj4 = "+proj=lcc +lat_1=41.03333333333333 +lat_2=40.66666666666666 +lat_0=40.16666666666666 +lon_0=-74 +x_0=300000.0000000001 +y_0=0 +ellps=GRS80 +datum=NAD83 +to_meter=0.3048006096012192 +no_defs"
FACTORY = RGeo::Geographic.projected_factory(:projection_proj4 => proj4, :projection_srid => 2263) …Run Code Online (Sandbox Code Playgroud) 90%肯定这是我的设置错误,但我不能做self.factory并试图访问lonlat给我一个例外"未定义的方法'点'为nil:NilClass"
设置lonlat使用:
mfactory = RGeo::ActiveRecord::SpatialFactoryStore.instance.factory(:geo_type => 'point')
self.lonlat = mfactory.point(long, lat)
self.save
Run Code Online (Sandbox Code Playgroud)
这给了我像0101000020E610000061C3D32B65965DC03657CD7344F64040数据库中的值.
我不能用:
self.lonlat = "POINT(#{long},#{lat})"
self.save
Run Code Online (Sandbox Code Playgroud)
我是否需要在模型中设置特定的内容?