36

我正在尝试将 SHP 文件放入我的 PostGIS 数据库中,数据只是有点偏离。我认为这是因为我使用了错误的 SRID。PRJ文件内容如下:

GEOGCS["GCS_North_American_1983",
DATUM["D_North_American_1983",
SPHEROID["GRS_1980",6378137.0,298.257222101]],
PRIMEM["Greenwich",0.0],
UNIT["Degree",0.0174532925199433]]

这与什么 SRID 相关?更一般地说,如何根据 PRJ 文件中的信息查找 SRID?某处是否有列出所有 SRID 及其“geogcs”等价物的查找表?

使用srid=4269和 4326 导入的数据是完全相同的结果。

这是否意味着我使用了错误的 SRID,或者这只是预期的误差范围?

shp 文件来自这里

4

6 回答 6

24

为了详细说明synecdoche的答案,SRID 有时被称为“EPSG”代码。SRID/EPSG 代码是投影的众所周知的文本表示的事实上的简写。

您可以在 SRID 表上进行快速搜索,以查看是否可以找到完全匹配或相似匹配:
SELECT srid, srtext, proj4text FROM spatial_ref_sys WHERE srtext ILIKE '%BLAH%'

上面是在http://www.bostongis.com/?content_name=postgis_tut01找到的。

您还可以在spatialreference.org上搜索此类内容。搜索工具是原始的,因此您可能必须使用 Google 搜索并指定站点,但任何结果都会向您显示 ESRI PRJ 内容、PostGIS SQL INSERT 和一堆其他表示。

我认为您的 PRJ 位于:http ://spatialreference.org/ref/sr-org/15/

于 2009-10-12T19:58:11.917 回答
21

Prj2EPSG是一个专门针对这个问题的小网站;粘贴 PRJ 内容,它会尽力找到匹配的 EPSG。他们还有一个网络服务 API。这不是一门精确的科学。他们似乎使用 Lucene 和 EPSG 数据库来进行匹配的文本搜索。

于 2012-12-06T22:53:40.353 回答
12

数据似乎是 NAD83,其 SRID 为 4269。您的 PostGIS 数据库有一个spatial_ref_sys表,即 SRID 查找表。

如果 SRID 为 4269 (NAD83) 和 4326 (WGS84) 的数据看起来相同,则说明有问题。

于 2009-10-09T03:12:31.500 回答
8

去下载GDAL 实用程序,ogrinfo(它会吐出投影信息)和 ogr2ogr 实用程序是无价的。

James 已经给出了指向spatialreference.org的链接。这有助于查找空间参考信息...我假设您在准备 postgis 实例spatial_ref_sys.sql时确实加载了。

老实说,我认为问题不在于 PostGIS 方面。

我通常将我的数据保存在 PostGIS 数据库中的不同 SRID 中。但是,我总是需要投影到输出 SRS。您正在展示 OpenStreetMap 预渲染的图块,我敢打赌它们是使用 SRID 900913(谷歌地图修改后的墨卡托投影,现在每个人都用来渲染)绘制的。

我给你的建议是:

1- 在 OpenLayers 代码中设置正确的投影,以匹配您正在读取的任何图块。

2.- 将数据库中的数据保存在您想要的任何 SRID 中(当然只要它是正确的)。

3.- 确保您用于从数据中生成图像的服务器(ArcGIS Server、Mapserver、GeoServer 或其他任何东西)正在重新投影到同一个 SRS。

一切都会匹配。

干杯

于 2009-10-15T18:20:17.373 回答
7

使用 GDAL 的 OSR Python 模块确定代码:

from osgeo import osr

srsWkt = '''GEOGCS["GCS_North_American_1983",
DATUM["D_North_American_1983",
SPHEROID["GRS_1980",6378137.0,298.257222101]],
PRIMEM["Greenwich",0.0],
UNIT["Degree",0.0174532925199433]]'''

# Load in the projection WKT
sr = osr.SpatialReference(srsWkt)

# Try to determine the EPSG/SRID code
res = sr.AutoIdentifyEPSG()
if res == 0: # success
    print('SRID=' + sr.GetAuthorityCode(None))
    # SRID=4269
else:
    print('Could not determine SRID')
于 2012-05-29T22:53:35.803 回答
1

请务必查看:http ://www.epsg-registry.org/

使用按过滤器查询选项并输入:North American Datum 1983。

这产生-> EPSG:6269。

希望这对你有用。

于 2009-10-25T03:35:43.413 回答