我有一个应用程序,基本上我有一个巨大的表(1亿条记录)的信息,每行包含一个lat/long值.
我一直在查询这个表,以获得适合某个点的半径范围内的所有记录.例如,"所有记录在5.89288,-104.919434之间的5英里内"
为此,我有一个Lat/Long列的索引,我得到了点的"边界",然后丢弃了我的ASP.Net应用程序中所有落在圆圈之外的点,因为那样更快而不是在SQL Server中进行循环计算.
注意:这是关于美国的所有数据,所以我认为地球是平坦的,我的计算,这足以满足我的需要.
现在,Lat/Long索引的主要问题是作为点的"正方形",并且因为我试图找到"在x和y之间拉"和"在x和y之间长",它实际上不是真的超级有效地使用索引,因为如果我在搜索"一行"点,就可以.
我一直在阅读SQL 2008的空间功能,但我还没有找到足够的具体信息来了解这对我是否有用.
所以问题是:SQL 2008是否有某种不同类型的索引可以使这种特定类型的查询比SQL 2005更快?
我需要使用Rails应用程序中的现有PostGIS数据库.到目前为止,我能够很好地访问数据库,GeoRuby很好地将'geom'列转换为Point对象.
我正在寻找的是一种在这些表上执行类似ActiveRecord的查询的简单方法,例如
Poi.find_within_radius(...)
Run Code Online (Sandbox Code Playgroud)
或类似的空间查询,如距离计算等.人.
我尝试了几种geokit组合,附带了rails插件,但我确信在ruby/rails宇宙中必须有更好的东西.任何提示?
SpatialKey会生成一些非常好看的热图,我们正在研究为内部项目执行此操作所涉及的内容,以便可视化大量的点.我正在寻找关于从何处入手的一些想法的反馈(这只是一个非常有趣的问题).
SpatialKey热图http://img697.imageshack.us/img697/7964/resolutiondays508x17550.jpg
我们知道他们正在使用Flash,从我们可以看出,热图是交互式的,而不是从平铺服务器渲染.我们对如何实现这一点的第一个猜测是服务器为他们的Flash客户端提供一个网格 - 每个单元格都有一个由服务器计算的计数.然后,Flash客户端根据网格中的单元格值进行一些插值,以生成您在上面看到的漂亮输出.
在这个阶段,我只对如何有效地在服务器端生成网格感兴趣(如果我们对它们的实现的假设是正确的).它似乎涉及:
以理智的网格分辨率在多个缩放级别执行此操作,看起来您需要自定义空间索引才能提高效率.
任何接受解释替代路线的人?如果它很重要,我们习惯于将我们的数据存储在PostgreSQL中,并使用PostGIS进行空间索引,但我愿意尝试任何东西.
我正在尝试在表column(bbox polygon default NULL)上创建空间索引,但得到错误:All parts of a SPATIAL index must be NOT NULL.
问题是我认为有些行会包含NULL.问题是:有没有办法用默认的空多边形声明列?
我有一堆数据,我在县一级绘制,没有边界.我想加入州界.我有一个状态shapefile(多边形),但spplot似乎没有任何方法可以添加到上一个地图之上.有没有办法做到这一点,没有重写面板功能,以采取两个SPDF(这似乎非常专业的可能是其他人的问题)?
这是一个可重复的例子:
library(sp)
Srs1 = Polygons(list(Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2)))), "s1")
Srs2 = Polygons(list(Polygon(cbind(c(5,4,2,5),c(2,3,2,2)))), "s2")
county <- SpatialPolygonsDataFrame( SpatialPolygons(list(Srs1,Srs2)),
data.frame( z=1:2, row.names=c("s1","s2") ) )
SrsA <- Polygons(list(Polygon(cbind(c(3,5,5,1,3),c(3,4,6,5,3)))),"sA")
state <- SpatialPolygonsDataFrame( SpatialPolygons(list(SrsA)),
data.frame( z=1,row.names="sA" ))
spplot( county, zcol="z",col=NA )
spplot( state, add=TRUE ) # Note the add=TRUE does nothing here, but that's the spirit of what I want to accomplish
Run Code Online (Sandbox Code Playgroud) 我有一个带有街道的SpatialLinesDataFrame,我有一个GPS坐标列表.我需要做的是为每个GPS坐标输出10个最近的街道名称.
R中是否有一个函数/包可以计算一行和一个SpatialLinesDataFrame的点之间的距离?我看不到任何对'sp'有帮助的东西.
有一个相关的问题:计算R中多边形和点之间的距离,但我想找到一个线对象和一个点之间的距离,而不是多边形/点,点/点.
我有空间数据类型的数据库.我使用数据库第一模型和实体框架6.0.2和.NET 4.5.当我尝试使用生成的类时,我得到以下错误:
指定的架构无效.错误:未加载关系"Name_FK1",因为"Model.TypeB"类型不可用.以下信息可用于解决先前的错误:类型"Data.TypeB"上的属性"Position"具有属性类型"System.Data.Spatial.DbGeography",该属性类型无法映射到基本类型.
我使用空间类型的所有表都列出了相同的错误.'Name_FK1'是外键关系.
我究竟做错了什么?
谢谢您的帮助.
我正在使用HURDAT数据集绘制飓风轨迹.我目前在R中生成了一个SpatialPointsDataFrame对象,它在2004年看起来像这样.
> str(cluster.2004.sdf)
Formal class 'SpatialPointsDataFrame' [package "sp"] with 5 slots
..@ data :'data.frame': 2693 obs. of 4 variables:
.. ..$ Sid : int [1:2693] 1331 1331 1331 1331 1331 1331 1331 1331 1331 1331 ...
.. ..$ clusterid: num [1:2693] 2 2 2 2 2 2 2 2 2 2 ...
.. ..$ name : Factor w/ 269 levels "","ABBY ",..: 6 6 6 6 6 6 6 6 6 6 ...
.. ..$ WmaxS : num [1:2693] 78.9 …Run Code Online (Sandbox Code Playgroud) 我正在使用ggplot2绘制一些半球场,当我尝试将它们投影到立体投影时,渲染需要很长时间.这是一个最小的例子:
lat <- seq(-87.159, -2, by = 3.7)
lon <- seq(0, 360, by = 3.75)
month <- 1:12
gdata <- expand.grid(lat = lat, lon = lon, month = month)
gdata$z <- rnorm(nrow(gdata))
g <- ggplot(gdata, aes(lon, lat)) +
geom_tile(aes(fill = z)) +
facet_wrap(~month, ncol = 4)
benchplot(g)
Run Code Online (Sandbox Code Playgroud)
我明白了:
step user.self sys.self elapsed
1 construct 0.000 0.000 0.000
2 build 0.156 0.004 0.162
3 render 0.976 0.016 0.990
4 draw 0.464 0.000 0.464
5 TOTAL 1.596 0.020 1.616
Run Code Online (Sandbox Code Playgroud)
如果我添加一个投影 coord_map()
benchplot(g …Run Code Online (Sandbox Code Playgroud) 我正在用C#编写WinForms应用程序.我需要确保Datarow我Datatable的距离不超过100公里.每行在单独的DataColumns中具有UTM区域,东区和北区.所有坐标都使用相同的数据,但有些具有不同的区域(否则,我会使用pythag数学,因为UTM以米为单位).到目前为止,我正在使用以下代码来执行此操作,但似乎我的DbGeography.PointFromText方法工作得不正常(请参阅代码中的*),因为当代码到达带有'**'的代码行时在它的开头,我得到一个错误说"24201:纬度值必须介于-90和90度之间".我也尝试过:
dtTrap.Rows[i]["TrapGeog"] = DbGeography.PointFromText(pointWellKnownText: "POINT M(" + dtTrap.Rows[i][intEastingIndex].ToString() + " " + dtTrap.Rows[i][intNorthingIndex].ToString() + " " + dtTrap.Rows[i][Zone].ToString() + ")", coordinateSystemId: SRID);
Run Code Online (Sandbox Code Playgroud)
只是让它抱怨"没有列#17"(17是我的UTM区域).
我发现使用这些东西的文档很少......据我所知,我的SRID是正确的(我从这个站点中取出它们).我之前使用Lat + Longs做过这种事情,并且效果非常好.我找不到UTM的正确语法.
using System.Data.Entity.Spatial;
...
DataColumn dcGeog = new DataColumn("TrapGeog", typeof(DbGeography));
dtTrap.Columns.Add(dcGeog);
byte Zone;
Int16 SRID;
for (int i = 0; i < dtTrap.Rows.Count; ++i)
{
if (dtTrap.Rows[i][intZoneIndex] != null
&& dtTrap.Rows[i][intNorthingIndex] != null
&& dtTrap.Rows[i][intEastingIndex] != null
&& byte.TryParse(dtTrap.Rows[i][intZoneIndex].ToString(), out Zone) == true)
{
if …Run Code Online (Sandbox Code Playgroud)