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

geo_james
fonte

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"
                })
            });
CaptDragon
fonte
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)

tmcw
fonte
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
2

Seu problema é que você tem o prefixo no nome do recurso e um espaço para nome que confunde o GeoServer (e / ou o OpenLayers).

Experimentar:

 featureType : "parks",

Eu tenho alguns exemplos do WFS em http://ian01.geog.psu.edu/geoserver/www/wfs/index.html com o código fonte comentado que você pode estudar.

Ian Turton
fonte
Obrigado iant. Eu já tentou sem o prefixo e eu acho que há uma questão mais ampla
geo_james
link não está funcionando iant
Sam007 14/05
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/

Thomas B
fonte
-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.

shahida umar
fonte