Pergunta

Estou tentando colocar um arquivo SHP no meu banco de dados PostGIS, os dados estão um pouco desativados. Eu acho que é porque estou usando o SRID errado. O conteúdo do arquivo PRJ é o seguinte:

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]]

Com que srid isso se correlaciona? E, de maneira mais geral, como posso procurar o SRID com base nas informações encontradas no arquivo PRJ? Existe uma tabela de pesquisa em algum lugar que lista todos os equivalentes do SRID e de seus 'geogcs'?

Para referência, aqui está uma imagem de alguns dos dados importados usando srid=4269 (Eu também tentei 4326 e obtive exatamente os mesmos resultados):

Imagem http://img245.imageshack.us/img245/2545/4326sand.png

O amarelo é meus dados importados do SHP e o plano de fundo é do OpenLayers (do Geodjango Admin). Isso significa que estou usando o SRID errado ou isso é apenas uma margem de erro esperada?

O arquivo shp é de aqui

Foi útil?

Solução

Para elaborar sinédoqueResposta, o SRID às vezes é chamado de código "EPSG". O código SRID/EPSG é um Defacto de mão curta para as representações de projeções de texto bem conhecido.

Você pode fazer uma pesquisa rápida na tabela SRID para ver se consegue encontrar uma correspondência exata ou semelhante:
SELECT srid, srtext, proj4text FROM spatial_ref_sys WHERE srtext ILIKE '%BLAH%'

Acima foi encontrado em http://www.bostongis.com/?content_name=postgis_tut01.

Você também pode pesquisar em SpatialReference.org Para esses tipos de coisas. A ferramenta de pesquisa é primitiva, portanto, você pode precisar usar uma pesquisa no Google e especificar o site, mas quaisquer resultados mostrarão o conteúdo da ESRI PRJ, a inserção do PostGIS SQL e várias outras representações.

Eu acho que seu PRJ está em: http://spatialreference.org/ref/sr-org/15/

Outras dicas

Prj2epsg é um pequeno site destinado a exatamente esse problema; Cole no conteúdo do PRJ e faz o possível para encontrar um EPSG correspondente. Eles também têm um API de serviço da web. Não é uma ciência exata. Eles parecem usar o Lucene e o banco de dados EPSG para fazer pesquisas de texto por correspondências.

Os dados parecem ser NAD83, que tem um SRID de 4269. Seu banco de dados PostGIS tem um spatial_ref_sys Tabela que é a tabela de pesquisa SRID.

Se os dados parecerem iguais com um SRID de 4269 (NAD83) e 4326 (WGS84), então há algo errado.

Vá e faça o download do Utilitários GDAL , o Ogrinfo (que cuspiria as informações de projeção) e os utilitários de ogro2og são inestimáveis.

James já deu um link para SpatialReference.org. Isso ajuda a encontrar informações de referência espaciais ... presumo que você carregou o spatial_ref_sys.sql quando você preparou sua instância PostGIS.

E para ser sincero, não acho que o problema esteja no lado do Postgis.

Normalmente, mantenho meus dados em diferentes srids no meu PostGIS DBS. No entanto, eu sempre preciso Para se projetar para a saída SRS. Você está mostrando ladrilhos pré-renderizados OpenStreetMap, e aposto que eles foram desenhados usando o SRID 900913 (a projeção Mercator modificada do mapa do Google que agora todo mundo usa para renderizar).

Minha recomendação para você é:

1- Defina a projeção correta no código do OpenLayers, que corresponde a qualquer azulejo que você esteja lendo.

2.- Mantenha os dados no banco de dados em qualquer srid que desejar (desde que estejam corretos, é claro).

3.- Verifique se o servidor que você está usando para gerar as imagens a partir de seus dados (servidor ArcGIS, MapServer, GeoServer ou o que quer que seja) está reprojetando para o mesmo SRS.

Tudo vai combinar.

Felicidades

Use o módulo OSR Python da GDAL para determinar o código:

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')

Certifique -se de dar uma olhada em: http://www.epsg-registry.org/

Use a opção de consulta por filtro e digite: Datum norte -americano 1983.

Isso rende -> epsg: 6269.

Espero que funcione para voce.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top