我在一个 4 亿行的分区 mysql 表中有纬度/经度坐标。 该表每分钟增长@ 2000 个记录,并且每隔几周刷新一次旧数据。 我正在探索对收到的数据进行空间分析的方法。
大多数分析都需要确定一个点是否位于特定的纬度/经度多边形中,或者哪些多边形包含该点。
我看到以下解决多边形点 (PIP) 问题的方法:
创建一个 mysql 函数,它接受一个点和一个几何图形并返回一个 bool 值。 简单但不确定如何使用 Geometry 在纬度/经度坐标上执行操作,因为 Geometry 假设平面而不是球体。
创建一个 mysql 函数,它接受自定义数据结构的一个点和标识符并返回一个 bool 值。 多边形顶点可以存储在表中,函数可以使用球面数学计算 PIP。大量的多边形点可能会导致巨大的表和缓慢的查询。
将点数据留在mysql中,将多边形数据存储在PostGIS中,并使用应用服务器通过提供点作为参数在PostGIS中运行PIP查询。
将应用程序从 MySQL 移植到 Postgresql/PostGIS。 这将需要大量努力来重写查询和过程。 我仍然可以做到,但 Postgresql 在处理 4 亿行方面有多好。 在谷歌上快速搜索“mysql 10 亿行”会返回许多结果。对 Postgres 的相同查询不会返回任何相关结果。
想听听一些想法和建议。
最佳答案
一些想法。
首先,就性能调优而言,PostgreSQL 和 MySQL 是完全不同的野兽。因此,如果您走移植路线,请准备好重新考虑您的索引策略。 PostgreSQL 不仅拥有比 MySQL 灵活得多的索引,而且表方法也大不相同,这意味着适当的索引策略与策略一样不同。不幸的是,这意味着您可能会遇到一些困难。如果我可以提供建议,我会建议首先删除所有非关键索引,然后根据需要少量添加它们。
第二点是,此时这里没有人可以给你大量实用的建议,因为我们不了解你程序的内部结构。在 PostgreSQL 中,您最好只索引您需要的内容,但您可以索引函数的输出(这在这种情况下非常有用)并且您可以只索引表的一部分。
我更喜欢 PostgreSQL 而不是 MySQL,所以我当然认为你应该选择 PostgreSQL。但是,我不会告诉您为什么等等,也不会告诉您在这个规模上挣扎,我会告诉您一些如果我尝试这样做的话我会考虑使用的东西。
最后,在这个数量上切换数据库将是一个学习曲线,您需要为此做好准备。但是,PostgreSQL 可以很好地处理该卷。
关于MySQL Postgresql/PostGIS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9695821/
我将RoR与PostGIS结合使用来存储位置数据。我正在尝试使用圆(例如,带半径的中心点)来存储估计位置。我试过类似的东西,但它不起作用:@location=Location.new(:place_id=>place.id,:circle=>%{ST_Buffer(ST_MakePoint(#{latitude},#{longitude})::geography,#{accuracy})})我也尝试过使用RGeo,它是出厂设置,但不确定如何准确使用它。任何帮助将不胜感激。谢谢。编辑1:我取得了一些进步。factory=RGeo::Cartesian.factorycenter_poin
我需要一些帮助来构建sql查询以在带有activerecord-postgis-adapter的rails中使用。我一直在阅读大量书籍,但现在有点卡住了,非常感谢任何帮助。我有两个模型Events和Areas:事件有一个点类型的“几何”列classEvent{:srid=>4326,:type=>"polygon",:geographic=>true}区域有一个“几何”列,类型为多边形classArea{:srid=>4326,:type=>"point",:geographic=>true}我可以在谷歌地图上创建和绘制事件和区域,并通过点击map并保存到数据库来创建区域。我希望能够执
首先,我使用Rails3和Ruby1.9.2。我在将PostgreSQL与PostGIS结合使用时遇到问题。我试过两个gem:https://github.com/nofxx/georubyhttps://github.com/rgeo/activerecord-postgis-adapter问题是,来自nofxx的第一个运行良好,但它不提供rake任务,因此postgis.sql和spatial_ref_sys.sql被插入到数据库中。我需要这个,因为它使用测试很舒服而且很重要(自动创建数据库,插入postgissql并在运行“raketest”时执行迁移)。奇怪的是,在github
我在postgis中遇到st_distance函数的问题。它返回错误的结果——对于小距离,误差不大——10米,也许20米,但对于更大的距离,我的结果与例如谷歌地图结果之间的差异太大——700米,最高2公里或更高。我正在使用srid=4326。第二件事-也许这就是问题-说我有4公里远的地方。Postgis说距离大约0.0417{{some_units}}。现在我只是将结果乘以100并得到或多或少准确的结果。我可以向这个函数传递一些参数,表示“以公里/米为单位的返回值”吗?附言。postgres版本是9.0.1 最佳答案 您应该使用地理
我们使用Postgres数据库运行CakePHPv3.x。我需要选择一些经纬度与另一点在X距离以内的记录。邮政地理信息系统hasafunctionthatdoesjustthis但似乎我必须纠正原始SQL查询才能使用它。我不是在寻求编写原始查询的帮助,但我正在寻求确认原始查询方法是否是在充分利用框架的同时使用此扩展的正确方法。我搜索过,但没有找到任何库来扩展CakePHPORM以包含它。也许还有我没想到的第三种选择。[注意:这不起作用...]publicfunctionfetch(){$maxMetersAway=10*1000;$lat=$this->request->query['
我想根据我从PostgreSQL空间数据库构建的栅格输出创建图像。我有一个问题:SELECT(ST_AsPNG(ST_AsRaster(geom,1.5::doubleprecision,2::doubleprecision,11,11,'8BUI',100,0,0,0,false)))AS"png"FROM"geom"AS"g"LIMIT1当我转储返回的结果时,我得到:resource(83)oftype(stream)我已经尝试过许多使用PHP的内置图像处理函数的组合,但在实际绘制多边形时似乎无处可去。我总是遇到“提供的资源类型无效”或类似问题。似乎没有可用的有用文档-谁能指导我正
我想使用PHP在postgresql/postgis的两层上应用相交函数。其中两层,一层来自前端Geojsonjavascript对象,另一层来自数据库本身。现在如何转换或读取GeojsonJavaScript对象是作为一层的PHPpostgresql代码。请帮助我! 最佳答案 最后,我能够在PHP和postgresql中重用Java脚本Geojson对象作为层,如下所示。首先,我将JavaScript对象转换为字符串,然后将ajax请求中的相同字符串传递给PHP文件。在PHP文件中,我通过使用ST_GeomFromGeoJSONp
(注意:the_geom是一个几何值(类型:LINESTRING),在这种情况下,我将它们随机化以提高可读性)gid|kstart|kend|ctrl_sec_no|the_geom|the_sum_geom626|238|239|120802|123456|NULL638|249|250|120802|234567|NULL4037|239|249|120802|345678|NULL【实战说明】不介意者略过Iwouldliketodo'this'(asetofqueriesfrommypastquestion,linklocatedontheendofthispost)foreve
我有以下JDBC代码。请注意,我正在尝试使用PostGIS地理:PreparedStatementstmt=db.prepareStatement("INSERTINTO"+"source_imagery(image_path,boundary,image_time)"+"VALUES(?,ST_GeographyFromText('POLYGON(("+"??,??,??,??))'),?)");stmt.setString(1,file.getAbsolutePath());stmt.setDouble(2,bounds.getY());stmt.setDouble(3,bound
我正在尝试将几何对象存储到我的postgist数据库中,该数据库有一个包含几何列的表。我从另一个带有几何列的表中获取了几何值,然后打印了之前获取的值,没问题。为了存储几何值,我使用下一个函数:staticvoidinsertaGeometria(Geometrygeom,intidInstalacion)throwsClassNotFoundException,SQLException{Connectioncongeom=conectarPGA();Stringgeomsql="INSERTINTOgeorrepositorio.geometria(id,point)VALUES(?,