Como adicionar uma camada WFS simples do GeoServer ao mapa OpenLayers?


19

Estou tentando adicionar um dos conjuntos de dados incluídos com o GeoServer a um mapa do OpenLayers. Eu segui os tutoriais do OpenGeo, vi tópicos semelhantes aqui, mas não consigo decifrá-lo. Alguém pode dar uma olhada no meu código e na configuração do GeoServer e me dizer onde estou errado?

Aqui está o meu código:

//WMS map
world = new OpenLayers.Layer.WMS("Global Imagery", "http://maps.opengeo.org/geowebcache/service/wms", {
    layers : "openstreetmap",
    format : "image/png"
});
map.addLayer(world);

//WFS
parks = new OpenLayers.Layer.Vector("WFS", {
    strategies : [new OpenLayers.Strategy.BBOX()],
    protocol : new OpenLayers.Protocol.WFS({
        url : "http://localhost:8081/geoserver/wfs",
        featureType : "medford:parks",
        featureNS : "http://medford.opengeo.org/medford"
    })
});

map.addLayer(parks);

map.zoomToMaxExtent();

Detalhes do GeoServer: nome da área de trabalho = medford, URI do namespace = http://medford.opengeo.org Para o tipo de recurso, tentei "parques" e "medford: parques"

A camada está ativada, anunciada e tem um limite de retorno de 30 recursos.

Estou lutando para montar um mapa simples.

Solução atualizada. Trabalhando agora.

wfs = new OpenLayers.Layer.Vector("Fields_WFS", {
        strategies : [new OpenLayers.Strategy.Fixed()],
        protocol : new OpenLayers.Protocol.WFS({
        version : "1.1.0",
        url : GEOSERVER_HOST + ":" + GEOSERVER_PORT + "/geoserver/wfs", 
        featurePrefix : "rpid",
        featureType : "FIELDS_SUBSET_BNG_OSGB36_1",
        featureNS : "<namespace>", 
        //geometryName : "GEOM", type "Geometry"
        srsName : "EPSG:27700"
}),
    renderers : renderer
})

Não precisa especificar o nome da geometria na definição de Camada. Como o SRS nativo era nulo em nosso conjunto de dados, se mantivermos geometryName do que o padrão, mas sem ele, ele usará a projeção de mapa (27700- no nosso caso).

Respostas:


24

Dê uma olhada na minha resposta neste post .

  1. Verifique se o valor featureNS está na "Editar página da área de trabalho em URI do espaço para nome" no seu GEOSERVER. Não use algo tão genérico como " http://postgis.org ". Use algo como " http: // seudominio / aplicativo / catalogLayer " ou algo único assim. Você pode criar esse URI, apenas torná-lo único.
  2. Você tem o novo BBOX () como estratégia, mas o que essa caixa tem como dimensões? Eu mudaria para [novo OpenLayers.Strategy.Fixed ()] para teste.
  3. featureType não é realmente o tipo de geometria, é o seu "Nome da camada" no GEOSERVER (eu sei, enganoso).
  4. geometryName é o nome do campo no seu banco de dados postgis que possui o tipo de dados Geometry. No GEOSERVER, em "Editar camada", você pode ver na parte inferior "Detalhes do tipo de recurso". Lá você verá um campo com o tipo "Geometria". Use o valor na coluna de propriedades

Eu especificaria featurePrefix e versão. Tente algo como isto:

var wfs = new OpenLayers.Layer.Vector(
            "Stavros Features",
            {
                strategies: [new OpenLayers.Strategy.Fixed()]
                , projection: new OpenLayers.Projection("EPSG:4326")
                , protocol: new OpenLayers.Protocol.WFS({
                    version: "1.1.0",
                    url: "http://localhost:8081/geoserver/wfs",
                    featurePrefix: 'myWorkspace', //geoserver worspace name
                    featureType: "medford:parks", //geoserver Layer Name
                    featureNS: "http://medford.opengeo.org/medford", // Edit Workspace Namespace URI
                    geometryName: "bounds" // field in Feature Type details with type "Geometry"
                })
            });

Obrigado capdragon. Eu tomei todas as etapas, mas ainda não tenho alegria ... meu espaço de trabalho agora é chamado rpid e adicionei um featurePrefix. Eu tentei featureType com e sem anexar a área de trabalho. Eu tentei vários namespaces, incluindo: " rpid.opengeo.com ", " localhost: 8081 / rpid ". Ainda estou confuso sobre essa propriedade. Eu inseri o nome da projeção e geometria (GEOM). Minha página map.html mora aqui: file: /// C: /Aptana/Workspace/GIS/map.html. Isso me surpreenderá com a mesma política de origem abaixo? Minha aba Net no Firebug mostra um 'OPTIONS wfs' sem resposta
— geo_james

2
O espaço de nomes do featureNS pode ser o que você quiser, para que ambos funcionem. O importante é que você tenha exatamente o mesmo no seu servidor geográfico. Ou então, as coisas não são serializadas e você não recebe resposta do serviço da web. Então, entre no geoserver, clique no seu workspace(isso o levará à página Edit Workspace. O Nameé o que você coloca como featurePrefix. E o Namespace URIque você coloca como featureNS. Além disso, não tenho certeza se o file:///c:local exigirá que você use um proxy. o arquivo vivo no http://localhostpara testar e certificar-se.
— CaptDragon

OK Agora mudei meu código para localhost: 8081 / apps / index.html e alterei meu featureNS. Agora posso ver 30 recursos retornando à resposta ... <rpid: OBJECTID> 25 </ rpid: OBJECTID> <rpid: FIELD_ID> NS / 86427/74196 </ rpid: ‌ FIELD_ID> <rpid: GROSS_AREA> 2.307 </ rpid: GROSS_AREA>. Progresso! No entanto, não estou vendo nenhum dos recursos no meu mapa. Quando adicionado como WMS, posso vê-los bem. A única outra camada é um WMS básico. Meu console também está cheio de erros como: OpenLayers.Marker é indefinido e Ext.preg não é uma função. Estou importando todas as minhas bibliotecas localmente ...
— geo_james

Quando você diz que há 30 recursos na resposta. Eles estão no formato xml agrupados em um <wfs:FeatureCollection numberOfFeatures="30"... elemento pai , certo?
— CaptDragon

Eu diria que criar uma nova página de teste muito simples e adicionar essa camada WFS. Parece-me que esses erros vêm de outras partes do seu código desde o OpenLayers.Marker não está envolvido com o WFS. Talvez eu esteja errado, mas a criação de uma página de teste simples sempre ajuda a determinar se está funcionando ou não. É o que eu faço de qualquer maneira.
— precisa saber é o seguinte

3

Primeira coisa a verificar: a sua página de servidor / teste está em 'medford.opengeo.org'? Caso contrário, você não poderá acessar o WFS devido à mesma diretiva de origem . Tecnicamente, você pode usar um proxy para corrigir isso. (embora, na minha opinião, este seja apenas um caso de WFS ser um protocolo mal projetado)


1
Mesma origem é um problema do navegador, o WFS funciona exatamente como projetado.
— Ian Turton

Sim e não: o WFS é XML, portanto, é necessário um analisador de XML em todas as plataformas, exceto o Firefox (e 'a área de trabalho'), e também não combina bem com a única maneira de fazer a comunicação entre domínios: JSONP. O GeoJSON, por outro lado, é analisado nativamente em quase todos os navegadores e é fácil e comumente agrupado para ser compatível com vários domínios. Obviamente, não de maçãs para laranjas, e essa não é a extensão da minha crítica do WFS (inchada, mal estendida etc.).
— tmcw

Você está assumindo que os navegadores são bons clientes WFS. Você quase nunca deseja extrair grandes quantidades de dados geográficos para um navegador da web como vetores.
— Ian Turton

Oi tmcw. Nenhuma página de teste é apenas um arquivo local na minha unidade C. Com o que devo definir meu URI do espaço para nome se eu quiser trabalhar com um GeoServer local na porta 8081?
— Geo_james 30/01/12


0

basta corrigir o tipo de característica de "medford: parques" para "parques"

var wfs = new OpenLayers.Layer.Vector(
            "Stavros Features",
            {
                strategies: [new OpenLayers.Strategy.Fixed()]
                , projection: new OpenLayers.Projection("EPSG:4326")
                , protocol: new OpenLayers.Protocol.WFS({
                    version: "1.0.0",
                    url: "http://localhost:8081/geoserver/wfs",
                    featureType: "parks", //geoserver Layer Name without workspace prefix
                    featureNS: "http://medford.opengeo.org/medford"

                })
            });

Veja jsfiddle como exemplo: http://jsfiddle.net/expedio/ucrtthya/


-1

Seu código está ok. Você só precisa alterar o endereço do navegador da sua página. Aponte a página do navegador através de "localhost: 8080 / geoserver / www / your_file_name.html" em vez de "file: \ c ......"

Então a camada vetorial será renderizada perfeitamente.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.