在将数据插入我的数据库时,我遇到了一个重大的速度障碍.您可以从下面的代码中看到,我只是构建SQL语句以传递给execute命令.值是正确的,一切都很好,但python解释器似乎是在运行时添加和删除params中的引号.
这是将空间数据插入数据库的正确方法.
INSERT INTO my_table(
name, url, id, point_geom, poly_geom)
VALUES ('test', 'http://myurl', '26971012',
ST_GeomFromText('POINT(52.147400 19.050780)',4326),
ST_GeomFromText('POLYGON(( 52.146542 19.050557, bleh, bleh, bleh))',4326));
Run Code Online (Sandbox Code Playgroud)
这在Postgres查询编辑器中是可验证的......现在,当我在下面运行Python代码时,它会在ST_GeomFromText函数周围添加双引号,然后从id列中删除引号.
INSERT INTO my_table(
name, url, id, point_geom, poly_geom)
VALUES ('test', 'http://myurl', 26971012,
"ST_GeomFromText('POINT(52.147400 19.050780)',4326)",
"ST_GeomFromText('POLYGON(( 52.146542 19.050557, 52.148430 19.045527, 52.149525 19.045831, 52.147400 19.050780, 52.147400 19.050780, 52.146542 19.050557))',4326)");
Run Code Online (Sandbox Code Playgroud)
这导致插入失败,PostGIS声称它不是一个合适的几何.当我打印每个参数在屏幕上查看时,引号没有什么好玩的,所以我认为问题必须在执行命令中.我正在使用Python 2.7 ...任何人都可以帮助如何防止这种疯狂继续下去?
conn = psycopg2.connect('dbname=mydb user=postgres password=password')
cur = conn.cursor()
SQL = 'INSERT INTO my_table (name, url, id, point_geom, poly_geom) VALUES (%s,%s,%s,%s,%s);'
Data = name, url, id, point, polygon …
Run Code Online (Sandbox Code Playgroud) 我有4亿行分区的mysql表中的lat/lon坐标.该表每分钟增长2000条记录,旧数据每隔几周刷新一次.我正在探索如何对这些数据进行空间分析.
大多数分析需要查找某个点是否在特定的纬度/经度多边形中,或者哪个多边形包含该点.
我看到了以下解决多边形点(PIP)问题的方法:
创建一个mysql函数,它接受一个点和一个Geometry并返回一个布尔值.简单但不确定如何使用几何来执行lat/lon坐标上的操作,因为Geometry假设平面而不是球体.
创建一个mysql函数,它接受自定义数据结构的一个点和标识符并返回一个布尔值.多边形顶点可以存储在表格中,函数可以使用球形数学计算PIP.大量的多边形点可能会导致庞大的表和慢查询.
将点数据保留在mysql中并在PostGIS中存储多边形数据,并使用app服务器通过将点作为参数在PostGIS中运行PIP查询.
将应用程序从MySQL移植到Postgresql/PostGIS.这将需要花费大量精力来重写查询和过程.我仍然可以做到这一点,但Postgresql处理4亿行有多好.在Google上快速搜索"mysql 10十亿行"会返回许多结果.Postgres的相同查询不返回相关结果.
想听听一些想法和建议.
我正在尝试设置一个GeoDjango应用程序来测试我遇到的早期问题.我已经建立了一个postgresql数据库,创建了一个新的Django项目和应用程序,但是当我尝试时./manage.py syncdb
我得到了这个:
django.core.exceptions.ImproperlyConfigured:无法确定数据库"django_geotest"的PostGIS版本.GeoDjango至少需要PostGIS 1.3版.是否从空间数据库模板创建了数据库?
我不明白,因为我之前已经完成了GeoDjango的所有安装要求,并django_geotest
通过这样做创建了这个数据库:
$ createdb -T template_postgis django_geotest
Run Code Online (Sandbox Code Playgroud)
看起来数据库设置正确:
django_geotest=# SELECT PostGIS_full_version();
postgis_full_version
-------------------------------------------------------------------------------------------------------
POSTGIS="1.5.3" GEOS="3.2.2-CAPI-1.6.2" PROJ="Rel. 4.7.1, 23 September 2009" LIBXML="2.7.3" USE_STATS
(1 row)
Run Code Online (Sandbox Code Playgroud)
描述数据库,我得到这个:
django_geotest=# \d
List of relations
Schema | Name | Type | Owner
--------+-------------------+-------+-------
public | geography_columns | view | phil
public | geometry_columns | table | phil
public | spatial_ref_sys | table | phil
(3 rows)
Run Code Online (Sandbox Code Playgroud)
所以现在我不知道接下来要尝试什么...我对postgresql及其模板等的了解并不是那么好.有任何想法吗?谢谢.
我需要计算它们之间的距离
在从OSM导入的地图中.
我使用以下查询:
SELECT building_id, hospital_id, ST_Distance(building_centroid, hospital_location)
FROM
(
select planet_osm_polygon.osm_id building_id, ST_Centroid(planet_osm_polygon.way) building_centroid
from planet_osm_polygon
where building = 'yes'
) buildings,
(
select planet_osm_point.osm_id hospital_id, planet_osm_point.way hospital_location
from planet_osm_point
where amenity = 'hospital') hospitals
Run Code Online (Sandbox Code Playgroud)
我得到奇怪的结果 - 距离总是小于1.
我怎样才能了解报告这些值的单位?
更新1:示例结果:
更新2:此查询似乎有效
SELECT building_id, hospital_id, ST_Distance_sphere(building_centroid, hospital_location) distance
FROM
(
select planet_osm_polygon.osm_id building_id, ST_Centroid(planet_osm_polygon.way) building_centroid
from planet_osm_polygon
where building = 'yes'
) buildings,
(
select planet_osm_point.osm_id hospital_id, planet_osm_point.way hospital_location
from planet_osm_point
where amenity = 'hospital') hospitals …
Run Code Online (Sandbox Code Playgroud) 我有一个普通的postgres数据库,有很多地理编码数据.这只是纬度和经度两列.
我想将此数据库转换为PostGIs数据库.任何人都可以建议我转换数据库的方法吗?我不想创建一个新的postgis tempalte数据库,然后逐个移动整个数据.
我正在尝试在空间表中的所有多边形之间执行递归交集,并获得结果(多)pololygons以及每个多边形的每个交叉点的信息.
解释它的图像(不是真正的规模):
假设A, B, C
表格中有正方形.我想A, B, C, A+B, A+C, B+C, A+B+C
在输出中有多边形,我需要知道这A+B
是A
和B
等的交集.
到目前为止,我有一个执行交叉点的查询,但它没有"切断"原始多边形的相交部分.例如:
Polygon A should be A - (A+B) - (A+C) - (A+B+C)
Polygon A+C should be A+C - (A+B+C)
Run Code Online (Sandbox Code Playgroud)
我现在为A
和A+C
多边形得到的结果的图像:
这是一个测试脚本,使用图像中的方块作为数据.看看这个area
专栏,很明显一些递归的ST_Difference丢失了,我只是弄清楚怎么做.欢迎任何想法.
-- Create a test table
CREATE TABLE test (
name text PRIMARY KEY,
geom geometry(POLYGON)
);
-- Insert test data
INSERT INTO test (name, geom) VALUES
('A', ST_GeomFromText('POLYGON((1 2, 1 6, 5 …
Run Code Online (Sandbox Code Playgroud) 在将PostgreSQL从9.2.4升级到9.3.1(通过OS X上的自制程序)的过程中,我遇到了一个奇怪的问题.这是我到目前为止采取的步骤
initdb
在新数据库上运行pg_upgrade
pg_upgrade
执行必要的检查,创建旧集群的转储,但是当导入新集群时,我收到以下错误:
> ./pg_upgrade -b /usr/local/Cellar/postgresql/9.2.4/bin/ -B /usr/local/Cellar/postgresql/9.3.1/bin -d /usr/local/var/postgres/ -D /usr/local/var/postgres9.3.1 -u postgres
Performing Consistency Checks
-----------------------------
Checking cluster versions ok
Checking database user is a superuser ok
Checking for prepared transactions ok
Checking for reg* system OID user data types ok
Checking for contrib/isn with bigint-passing mismatch ok
Creating dump of global objects ok
Creating dump of database schemas
ok
Checking for presence of required libraries fatal
Your installation references …
Run Code Online (Sandbox Code Playgroud) 在浏览开发中的Postgres-Rails应用程序时,由于PG错误,我遇到了错误输出的页面.我认为我当前的Git分支架构可能与我的数据库不同步rake db:reset
.这导致错误(我不能再复制)声称它无法postgis.control
在usr/local/Cellar/postgresql/9.3.5/share/postgresql
目录中找到文件(IIRC).在看到我的9.3.4版Postgres的相应目录中存在该控制文件之后,我尝试了很多东西,但最终卸载了我的postgres-9.3.4并且brew已经卸载然后再次安装PostGIS.在某些时候,尽管我每次尝试重置数据库都会继续失败,但错误消息已更改为
错误:无法加载库"/usr/local/Cellar/postgresql/9.3.5/lib/rtpostgis-2.1.so":dlopen(/usr/local/Cellar/postgresql/9.3.5/lib/rtpostgis-2.1.所以,10):未加载库:/usr/local/lib/libspatialite.5.dylib
然后我尝试卸载Postgres并重新安装,但即使这样也无法解决问题.
(注意:我已尝试在Postgres控制台中创建PostGIS的扩展,但这给出了与上面列出的完全相同的错误).
在PostGIS中,&&
两个几何体之间的运算结果是什么?在我看来,&&
返回 a boolean
,但geometry
这次确实返回。在以下示例中,操作在 aLineString
和 a之间Polygon
。
首先,我猜这就是包容和被包容的关系。在我做下面的例子之前,我认为这应该是一个“交集”类型的关系。我对吗?
select ST_geomfromtext('linestring(0.1 0.1,1.9 1.9)', 4326) && st_geomfromtext('POLYGON((0 0,0 1,1 1,1 0,0 0))', 4326)
Run Code Online (Sandbox Code Playgroud)
结果是t
代表true
.
AWS 添加了对 Postgres 15.2 的支持。在启用 postgis 扩展的情况下升级到此版本失败并显示以下错误消息:
The instance could not be upgraded because there are one or more databases with an older version of PostGIS extension or its dependent extensions (address_standardizer, address_standardizer_data_us, postgis_tiger_geocoder, postgis_topology, postgis_raster) installed. Please upgrade all installations of PostGIS and drop its dependent extensions and try again.
Run Code Online (Sandbox Code Playgroud)
RDS实例已3.1.7
安装postgis,并且没有升级扩展的路径。运行精确的升级命令ALTER EXTENSION postgis UPDATE TO "3.1.8";
会导致
extension "postgis" has no update path from version "3.1.7" to version "3.1.8"
Run Code Online (Sandbox Code Playgroud)
运行SELECT postgis_extensions_upgrade();
应该升级扩展的命令会导致:
Upgrade completed, run …
Run Code Online (Sandbox Code Playgroud) postgis ×10
postgresql ×9
amazon-rds ×1
database ×1
django ×1
geodjango ×1
geospatial ×1
gis ×1
mysql ×1
psycopg2 ×1
python ×1
sql ×1
upgrade ×1