这可能是一个简单的问题,但我不是很擅长PostGIS,也没有完全理解这一切.
基本上我有一个nodes带有POINT列(point)的table ().我在这个专栏上创建了一个索引
create index nodes__points on nodes using gist (point)
Run Code Online (Sandbox Code Playgroud)
该列是用.创建的
select addgeometrycolumn('nodes', 'points', 'POINT', 4326, 2)
Run Code Online (Sandbox Code Playgroud)
我正在使用srid 4326,因为我正在添加形式(纬度,经度)的数据.(即爱尔兰都柏林的位置= 53.353 lon = -6.264(我已加入GeomFromText('POINT(-6.264 53.535)'))的坐标系).
对于每个点,我想找到大致在1km框内的所有点,以该点为中心(所以selcet a.id, count(*) from nodes as a, nodes as b where SOME_DISTANCE_FUNCTION_HERE(a.point, b.point, 1000) group by a.id;.它不一定是精确的,只是一个粗略的人文数字.1km的bbox很好,1km的圆圈很好它不一定是1公里,只是那个数量级.
在ST_Distance/ ST_DWithin的/ etc.所有都使用SRID的单位,4326/WGS64是度(因此1 = 1度的纬度/经度).但我想用米.
我试过ST_distance_sphere并且st_dwithin可以使用米,但如果我这样做,则explain显示索引未被使用.
我怎样才能大致得到我想要的东西,并使用地理索引?
更新:这是在PostgreSQL 9.1和PostGIS 2.0 svn构建上.
我正在尝试将hibernate空间与JPA集成以进行地理搜索.我一直在官方网站上引用该教程(我与hibernatespatial无关).
遗憾的是,本教程未介绍如何从纬度/经度对创建Point实例.我试图在这里这样做,但我仍然不确定这是否是将纬度/经度对转换为JTS Point实例的正确方法:
import com.vividsolutions.jts.geom.Coordinate;
import com.vividsolutions.jts.geom.GeometryFactory;
import com.vividsolutions.jts.geom.Point;
import org.geotools.geometry.jts.JTSFactoryFinder;
import org.hibernate.annotations.Type;
import javax.persistence.*;
@Entity
public class Location {
private Double latitude;
private Double longitude;
@Type(type = "org.hibernatespatial.GeometryUserType")
private Point coordinates;
private final GeometryFactory geometryFactory = JTSFactoryFinder.getGeometryFactory(null);
@PrePersist
@PreUpdate
public void updateCoordinate() {
if (this.latitude == null || this.longitude == null) {
this.coordinates = null;
} else {
this.coordinates = geometryFactory.createPoint(new Coordinate(latitude, longitude));
}
}
public Double getLatitude() {
return latitude;
}
public void setLatitude(Double latitude) { …Run Code Online (Sandbox Code Playgroud) 标准凸包算法不适用于(经度,纬度)点,因为标准算法假设您需要一组笛卡尔点的船体.纬度 - 经度点不是笛卡尔坐标,因为经度在反子午线(+/- 180度)处"环绕".即,经度179以东两度是-179.
因此,如果您的一组点恰好跨越反子午线,您将计算出错误地在世界各地伸展的虚假船体.
我可以使用标准凸包算法来解决这个问题的任何建议,或指向正确的"地球"船体算法?
现在我想起来,有更多有趣的案例需要考虑而不是跨越反梅迪安.考虑一个包围地球的点"带" - 它的凸包将没有东/西边界.或者甚至更进一步,{(0,0),(0,90),(0,-90),(90,0),( - 90,0),(180,0)}的凸包是什么? - 它似乎包含整个地球表面,所以它的周边有哪些点?
geometry geospatial latitude-longitude convex-hull computational-geometry
哪个更适合计算两个纬度/经度点,Haversine公式或Vincenty公式之间的距离?为什么?
距离显然是在地球上计算的.WGS84与GCJ02坐标是否影响计算或距离(Vincenty的公式考虑了WGS84轴)?
例如,在Android中,Haversine公式用于Google Map Utils,但Vincenty公式由android.Locationobject(Location.distanceBetween())使用.
language-agnostic trigonometry geospatial latitude-longitude
我见过很多人最近使用Redis作为缓存,为什么不使用Mongo?据我所知,Redis可以在一个索引上设置一个过期日期,比如memcache但是否有任何理由不使用Mongo呢?
我问,因为我在MySQL中进行大量连接,然后在选择后更改数据.我已经在网站的其他部分使用了memcache,但是将其保存在Mongo中将允许我对缓存的数据进行地理空间搜索.
当我尝试在我的Windows 64位计算机上安装Shapely时,我无法使GEOS库工作.
到目前为止,我已经运行了安装了GDAL的OSGeo4W安装程序(我相信地理库包含在该软件包中).之后,我检查了我的C:\OSGeo4W\bin目录上有geos_c.dll ,但要么我错过了一些配置步骤,要么库不起作用.
我需要Shapely来工作,所以我也在pip install shapely安装GDAL之后运行,它显然有效(尽管它找不到GEOS的C库).
在我的代码中,我可以导入Shapely,但是当我尝试使用它时,我收到一个错误,告诉我"geos.dll"找不到.
任何有关这方面的帮助将非常感激.谢谢!
也许我错过了什么.我有一个"Geography"数据类型的SQL Server列.
我想在我的c#代码中使用DbGeography类型.有什么方法可以从sql的地理位置转换或转换为dbgeography吗?
我想比较地理空间数据的R-Tree和Quadtree.虽然有文献,但我很难找到涵盖真正基本比较的文件.所以我决定问这个问题.
在我看来,R-Tree具有平衡的优点,树没有空叶.作为缺点,插入或删除等基本操作可能导致重构整个索引.
四叶树是相反的,它不平衡并且有空叶,但它不需要被重新修剪.
因此,作为一个讽刺,我会说R-Tree确实需要更少的内存,并且由于最小的高度,搜索速度更快.当有许多更新操作时,四叉树更好,但结果树可能是不平衡的.
您认为这些观点是否正确?那里有没有涵盖这个主题的好文件?
Auf Wiedersehen,安德烈
如何在eloquent ORM中处理mysql空间数据类型?这包括如何创建迁移,插入空间数据和执行空间查询.如果没有实际的解决方案,是否有任何解决方法?
我希望能够提取嵌入在网站中的Google地图的位置(本网站底部的随机示例).
<iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3128.340699934565!2d-0.46482818466529047!3d38.3642391796565!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0xd62377123a70817%3A0x85e89b65fcf7c648!2sCalle+Cruz+de+Piedra%2C+4%2C+03015+Alicante!5e0!3m2!1ses!2ses!4v1476192292052" width="100%" height="350" frameborder="0" style="border:0" allowfullscreen=""></iframe>Run Code Online (Sandbox Code Playgroud)
所以,基本上我想从地图URL中提取精确位置:
https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3128.340699934565!2d-0.46482818466529047!3d38.3642391796565!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0xd62377123a70817%3A0x85e89b65fcf7c648!2sCalle+Cruz+de+Piedra%2C+4%2C+03015+Alicante!5e0!3m2!1ses!2ses!4v1476192292052
Run Code Online (Sandbox Code Playgroud)
谷歌似乎在这里使用专有的参数设计.此博客文章和此Stackoverflow文章总结了如何理解这些参数.参数的结构类似于(![id][type][value]),类型如下:
m: matrix
f: float
d: double
i: integer
b: boolean
e: enum (as integer)
s: string
u: unsigned int
Run Code Online (Sandbox Code Playgroud)
矩阵可以封装多个数据条目,例如,!1m3!1i2!1i4!1i17意味着ID为1的矩阵包含三个整数值[2, 4, 17].
有了这些知识,参数的结构可以这样:
!1m18
!1m12
!1m3
!1d3128.340699934565
!2d-0.46482818466529047
!3d38.3642391796565
!2m3
!1f0
!2f0
!3f0
!3m2
!1i1024
!2i768
!4f13.1
!3m3
!1m2
!1s0xd62377123a70817:0x85e89b65fcf7c648
!2sCalle Cruz de Piedra, 4, 03015 Alicante
!5e0
!3m2
!1ses
!2ses
!4v1476192292052
Run Code Online (Sandbox Code Playgroud)
现在看起来很简单,我们几乎以明文形式看到坐标.但正如博客文章指出的那样,参数 …
geospatial ×10
gis ×3
geolocation ×2
c#-4.0 ×1
convex-hull ×1
eloquent ×1
geometry ×1
google-maps ×1
hibernate ×1
iframe ×1
indexing ×1
java ×1
jpa ×1
laravel ×1
laravel-5 ×1
memcached ×1
mongodb ×1
php ×1
postgis ×1
postgresql ×1
python ×1
quadtree ×1
r-tree ×1
redis ×1
shapely ×1
spatial ×1
sql-server ×1
trigonometry ×1