我使用带有GIS扩展的PostgreSQL来存储地图数据,以及OpenLayers,GeoServer等.给定一个多边形,例如邻域,我需要找到存储在某些表格中的所有LAT/LONG点(例如交通信号灯,餐馆)在多边形内.或者给定一组多边形,我想每个多边形内找到一组点的(如GROUP BY查询,而然后再遍历每个多边形).
这些功能是我需要编程的,还是可用的功能(作为扩展SQL)?请详细说明.
另外,对于我所做的简单2D数据,我实际上需要GIS扩展(GPL许可是限制)还是PostgreSQL就足够了?
谢谢!
如果GIS应用具有不具备GIS相关的列了一些表,当使用多个数据库(django.db.backends.postgresql_psycopg2和django.contrib.gis.db.backends.postgis)使用django.contrib中相比确实更出色的表现.gis.db.backends.postgis只?
多个数据库还会引入一些性能开销和复杂性.有谁能告诉我这种情况的最佳做法?
这可能是一个相当愚蠢的问题,但我在这里做错了什么?它创建表但INSERT INTO不起作用,我想我的占位符有问题吗?
conn = psycopg2.connect("dbname=postgres user=postgres")
cur = conn.cursor()
escaped_name = "TOUR_2"
cur.execute('CREATE TABLE %s(id serial PRIMARY KEY, day date, elapsed_time varchar, net_time varchar, length float, average_speed float, geometry GEOMETRY);' % escaped_name)
cur.execute('INSERT INTO %s (day,elapsed_time, net_time, length, average_speed, geometry) VALUES (%s, %s, %s, %s, %s, %s)', (escaped_name, day ,time_length, time_length_net, length_km, avg_speed, myLine_ppy))
conn.commit()
cur.close()
conn.close()
Run Code Online (Sandbox Code Playgroud)
INSERT INTO调用不起作用,它给了我
cur.execute('INSERT INTO %s (day,elapsed_time, net_time, length, average_speed,
geometry) VALUES (%s, %s, %s, %s, %s, %s)'% (escaped_name, day ,time_length,
time_length_net, length_km, avg_speed, …Run Code Online (Sandbox Code Playgroud) 当我在我的postgres数据库中并尝试为我的数据库创建扩展时,我收到此错误
ERROR: could not open extension control file "/usr/share/postgresql/9.5/extension/postgis.control": No such file or directory
我知道有很多帖子都有这个错误和解决方案,我也尝试过它们.在stackoverflow中找到了这么多,但没有一个工作.
我意识到在我的postgresql目录下有9.2,9.3,9.4,9.5,9.6,
我走进错误的目录,然后我意识到真的没有postgis.control内9.5
我检查了我的psql版本并显示了9.6.1
我进了9.6文件夹,我看到了postgis.control它.
我想更改安装目录,以便我运行时
create extension postgis
它会去
"/usr/share/postgresql/9.6/extension/postgis.control"
代替
"/usr/share/postgresql/9.5/extension/postgis.control"
有人可以帮我一把吗?
提前致谢.
PS使用Ubuntu 14.04并将Ubuntu 16.04作为桌面,我还没有尝试安装postgis
我正在运行Postgres 9.6.1和PostGIS 2.3.0 r15146并且有两个表.
geographies可能有150,000,000行,paths可能有10,000,000行:
CREATE TABLE paths (id uuid NOT NULL, path path NOT NULL, PRIMARY KEY (id))
CREATE TABLE geographies (id uuid NOT NULL, geography geography NOT NULL, PRIMARY KEY (id))
Run Code Online (Sandbox Code Playgroud)
给定一个数组/套ids的表geographies,什么是查找所有交叉路径与几何的"最佳"的方式?
换句话说,如果一个初始geography有一个相应的交叉,path我们还需要找到这个相交的所有其他 .从那里,我们需要找到这些新发现的所有其他相交,依此类推,直到我们找到所有可能的交叉点.geographiespathpathsgeographies
初始地理标识(我们的输入)可以是0到700之间的任何位置.平均值大约为40.
最小交叉点将为0,最大值将为大约1000.平均值可能大约为20,通常小于100连接.
我创建了一个这样做的功能,但我是PostGIS中的GIS和Postgres的新手.我发布了我的解决方案作为这个问题的答案.
我觉得应该有比我想出的更有说服力和更快速的方式.
我试图使用COPY FROM STDIN将数据导入到我的表中.我表中的一列是几何类型.我的命令看起来像这样......
COPY "WeatherStations" ("Station_ID", "Station_Code", "Station_Name", "Station_Location") FROM stdin;
1 KAVP WILKES-BARRE ST_GeomFromText('POINT(41.338055 -75.724166)')
2 KOKV WINCHESTER ST_GeomFromText('POINT(39.143333 -78.144444)')
3 KSHD SHENANDOAH ST_GeomFromText('POINT(38.263611 -78.896388)')
...
Run Code Online (Sandbox Code Playgroud)
不过,我认为它正试图插入文本"ST_GeomFromText('POINT ...",而是未能计算表达式和插入表达式的结果的.有谁知道什么可能怎么回事,我怎么能得到插入实际的geoms?
我正在尝试将我的RDS实例从9.5.4升级到9.6.1,并且我因为需要首先升级的PostGIS版本的错误而被阻止.
数据库实例处于无法升级的状态:PreUpgrade检查失败:无法升级实例,因为有一个或多个数据库安装了旧版本的PostGIS.请升级PostGIS的所有安装,然后重试.
RDS 9.5.4支持的PostGIS的最高版本是2.2.2
alter extension postgis update
产量
注意:已经安装了扩展名为"postgis"的版本"2.2.2"
我尝试明确升级到9.6.1中的版本
将扩展postgis更新为'2.3.0'
入门
[错误]错误:扩展名"postgis"没有从版本"2.2.2"到版本"2.3.0"的更新路径
所以我的问题是:我该如何升级?我怀疑我可以在升级之前删除扩展并在之后安装新版本,但我不知道这将对我的数据做什么,或者是否能正确升级我的空间结构或功能.
我已经检查了文档中提到的这种情况
我使用Postgresql和PostGIS扩展进行临时空间分析.我通常在psql中手工构造和发出SQL查询.我总是在一个事务中包装一个分析会话,所以如果我发出一个破坏性的查询,我可以回滚它.
但是,当我发出包含错误的查询时,它会取消该事务.任何进一步的查询都会引出以下警告:
错误:当前事务被中止,命令被忽略直到事务块结束
有没有办法可以解决这个问题?每次我输入错字时回滚事务并重新运行以前的查询都很烦人.
我刚刚将我的开发机器升级到Windows 7,因此重新安装了PostgreSQL和PostGIS.我按照Postgres网站上的建议使用了Postgres Plus安装程序,并按照本教程进行安装.我使用template_postgis创建了一个数据库,我当前正在开发的应用程序能够毫无问题地连接到数据库.
但是,我的旧代码无法Geography像以前那样使用PostGIS创建表.例如,当我尝试创建下表时:
CREATE TABLE test_area (
id SERIAL PRIMARY KEY,
name VARCHAR(1000),
area GEOGRAPHY(POLYGON, 4326),
start_time DATE,
end_time DATE
)
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
ERROR: type "geography" does not exist
LINE 4: area GEOGRAPHY(POLYGON, 4326),
^
Run Code Online (Sandbox Code Playgroud)
如果我查看pgAdmin III的Object brower中的数据库,我会看到一堆Geometry函数,因此安装似乎已正确运行.我不确定我的问题是什么.安装程序是否可以仅安装PostGIS Geometry,但不能Geography?
该ST_DWithin文件说,第三个参数(距离)以米为单位.但是当我执行一些查询时,它似乎将第3个参数作为'degree'?
这是我的简化表结构:
> \d+ theuser;
Table "public.theuser"
Column | Type | Modifiers | Storage | Description
----------+------------------------+-----------+----------+-------------
id | bigint | not null | plain |
point | geometry | | main |
Indexes:
"theuser_pkey" PRIMARY KEY, btree (id)
"point_index" gist (point)
Referenced by:
...
Has OIDs: no
Run Code Online (Sandbox Code Playgroud)
所有点都以SRID = 4326存储.
这是查询:
> select * from theuser where ST_DWithin(point , ST_GeomFromText('POINT(120.9982 24.788)',4326) , 100 );
Run Code Online (Sandbox Code Playgroud)
它将第3个参数(100)作为'degree',因此它返回所有数据,我必须缩小到0.001以找到附近的点.
但是如何直接传递米作为第三个参数(我不想做米/度变换)?我的查询有什么问题?为什么postgreSQL不像文件那样把它作为米?
环境:
> select version();
version
-----------------------------------------------------------------------------------------------------------
PostgreSQL 8.4.9 on i486-pc-linux-gnu, compiled …Run Code Online (Sandbox Code Playgroud) postgis ×10
postgresql ×9
database ×3
gis ×3
amazon-rds ×1
django ×1
polygon ×1
psycopg ×1
psycopg2 ×1
python ×1
sql ×1
sqlgeography ×1
srid ×1
ubuntu ×1