konto usunięte

Temat: Geoserver + OpenLayers (GetFeatureInfo nie działa)

Witam!

Mam problem dotyczący braku wyświetlania atrybutów z warstwy WMS Geoserwera podpiętej do OpenLayers. Gdy wyświetlam podgląd warstwy (Layer Preview) z panelu administracyjnego Geoservera używając opcji OpenLayers to po kliknięciu w dowolne miejsce w oknie mapy, poniżej pojawia się tabela z atrybutami obiektów znajdujących się w miejscu kliknięcia. W momencie gdy skopiuję całość tej strony i umieszczę ją w dowolnym miejscu na dowolnym serwerze to wyświetlanie atrybutów przestaje działać (pozostała część strony działa bez problemu). Po kliknięciu pojawia się na chwilę napis Loading...please wait... a tabela nie wyświetla się.

Jedyna różnica jaką zauważyłem przy pomocy Firebug'a to różne nagłówki wysyłanego zapytania. Działająca strona wyświetlana z Layer Preview ma opcję Referer nagłówka ustawioną na:

http://localhost:8080/geoserver/wms?service=WMS&versio...

Kopia strony, w której wyświetlanie atrybutów nie działa ma opcję Referer:

http://localhost/temp/wms.htm - czyli miejsce gdzie skopiowana została strona.

Z góry dziękuję za wszelkie pomysły rozwiązania tego problemu.
Dominik Mikiewicz

Dominik Mikiewicz maps made easy,
www.cartomatic.pl ||
cartoninjas.net

Temat: Geoserver + OpenLayers (GetFeatureInfo nie działa)

Wygląda na to, że geoserver zostaje tam, gdzie był i migrujesz tylko kod client-side?
Jeżeli tak, to masz problem z x-domain request. Domyślnie nie jesteś w stanie wyonać xhr (xml http request, czyli zapytanie ajax) do innej domeny, czy poddomeny (same origin policy). To standardowe zabezpieczenie przeglądarek i raczej załóż, że tak jest i już... Nie znaczy to, że nie można tych danych pobrać ;-)

Jedna z opcji to script injection - dodajesz nowy element skryptu do DOM ustawiając jego src na web service zwracający dane w postaci json. Jednak w Twoim przypadku to nie zagra, ponieważ chcesz skonsumować dane w xml zwracane przez getFeatureInfo. Pozostaje Ci więc opcja nr2, czyli proxy.

Proxy to taki mały mechanizm, który pozwala Ci na zrobienie x-domain request server-side. Tutaj nie masz żadnych ograniczeń i możesz zasysać dane skąd chcesz.
OpenLayers ma gdzieś na stronach info o tym, jak zrobić proxy (jest ifo o tym jak je zrobić skonfigurować). Jeżeli masz kompa na windowsie i wystawiasz stronkę na IIS, to może Ci się przydać info stąd: http://cartoninjas.net/post/2010/11/24/ASPNET-xDomainP.... Jest tam link do demo (http://sandbox.cartoninjas.net/xdomainproxy/) zasysającego dane z geoserver.cartoninjas.net, czyli z innej poddomeny.

Weź pod uwagę, że proxy przedstawione w poście to wersja mimalistyczna i nie ma tam żadnych mechanizmów reagujących na błędy - jeżeli jakiś się pojawi proxy się wywali.

konto usunięte

Temat: Geoserver + OpenLayers (GetFeatureInfo nie działa)

Doinstalowałem do Geoservera coś co nazywa się Geoserver Proxy Extension ( http://geoserver.org/display/GEOS/GeoServer+Proxy+Exte... ) i gdy odpalam

http://localhost:8080/geoserver/rest/proxy?url=http://localhost


(geoserver jest pod localhost:8080 a strona pod localhost)

atrybuty wyświetlają się idealnie. Problemem dla mnie jest teraz wbudowanie tego w OpenLayers. Myślę, że chodzi o

OpenLayers.ProxyHost = "???"

tylko co musi być wpisane w miejsce znaków zapytania bo

"http://localhost:8080/geoserver/rest/proxy?url="


nie działa.
Dominik Mikiewicz

Dominik Mikiewicz maps made easy,
www.cartomatic.pl ||
cartoninjas.net

Temat: Geoserver + OpenLayers (GetFeatureInfo nie działa)

Chodzi o OpenLayers.ProxyHost w rzeczy samej. Tyle że to, o którym mówisz pozwala na wykonywanie zapytań do innych domen geoserverowi (oraz z poziomu hosta geoservera), a ty potrzebujessz proxy, które będzie działało w przy twojej aplikacji.
Czyli mając aplikację opartą na OL potrzebujesz wpisać OpenLayers.ProxyHost = 'myProxy?url=', zakładając ze Twoje proxy jest w ścieżce myhost/myapp/myproxy, podobnie jak aplikacja. Musisz mieć tam aplikację, która będzie działała jako proxy.

Ty zrobiłeś rzecz odwrotną - z hosta na porcie 8080 wysłałeś zapytanie do hosta na porcie 80, który miał urle kierujące do localhosta:8080, a więc siłą rzeczy nie było x-domain request.

Innymi słowy Twoje proxy powinno pozwolić na wykonanie requesta do zdalnej domeny: myhost/myapp/myProxy?url=http://localhost:8080/geoserver/wms?request=getFeature.......
Michał K.

Michał K. WebGIS Magician

Temat: Geoserver + OpenLayers (GetFeatureInfo nie działa)

Ja używałem proxy napisanego w PHP:
http://svn.codehaus.org/mapbuilder/trunk/mapbuilder/se...
Umieszczasz ten skrypt tam, gdzie stronę z OL i dodajesz OpenLayers.ProxyHost = "proxy.php?url=".
Na stronie OpenLayers jest też proxy CGI http://trac.osgeo.org/openlayers/wiki/FrequentlyAskedQ...

konto usunięte

Temat: Geoserver + OpenLayers (GetFeatureInfo nie działa)

skrypt w PHPie ma niezdefiniowane funkcje (Apache zwraca blad) - curl_init, curl_setopt, curl_exec i curl_close ponizej linii 144 - gdy je wykomentuje to calosc nie dziala (atrybuty dalej sie nie wyswietlaja).

Proxy cgi ze strony OpenLayers po wczytaniu do folderu cgi-bin Apache'a (jak w instrukcji) po wejściu na localhost/cgi-bin/proxy.cgi wywala Internal Server Error zamiast przejść do strony OpenLayers.org (jak w opisie).
Michał K.

Michał K. WebGIS Magician

Temat: Geoserver + OpenLayers (GetFeatureInfo nie działa)

Wygląda na to, że w ogóle nie masz zainstalowanej biblioteki curl lub nie jest ona włączona jako moduł PHP. Być może podobnie wygląda sprawa z proxy w CGI - pewnie trzeba coś doinstalować.

Ale najprościej chyba będzie tak :)
<?php
echo file_get_contents($_GET["url"]);
?>

konto usunięte

Temat: Geoserver + OpenLayers (GetFeatureInfo nie działa)

ok działa

Apache miał wyłączone php_curl.dll

Wielkie dzięki za pomoc, małe rzeczy a mogą napsuć nerwów :)

Pozdrawiam!
Maciej L.

Maciej L. Student, UR Kraków

Temat: Geoserver + OpenLayers (GetFeatureInfo nie działa)

Witam, jestem tu nowy :)

Odświeżę trochę temat. W ramach pracy magisterskie tworzę "geoportal" na bazie Geoservera i Openlayers, baza danych to Postgis.

Chciałem zaimplementować usługę GetFeatureInfo i napotkałem się na problemy opisane wyżej, tj. potrzeba zainstalowania proxy- rozwiązana za pomocą Geoserver Proxy Extension, oraz plikiem proxy.php podanym w tym temacie.
Jako przykładu wyświetlania informacji użyłem http://openlayers.org/dev/examples/getfeatureinfo-popu...

Problem jest następujący:
Kiedy kliknę na mapie to w dymku zamiast tabeli z informacjami pojawia się kawałek kodu z proxy.php (wklejony poniżej- nie wiem czy to całość, bo dymek z kodem jest bardzo duży i wychodzi poza obszar strony i nie ma możliwości przewinięcia tekstu). Czy ktoś wie gdzie tkwi problem?

Pozdrawiam :)

Treść kodu z dymka:

substr($result, $pos, $len); } //$result = str_replace("xlink:","",$result); echo $result; // define class with functions to open socket and post XML // from http://www.phpbuilder.com/annotate/message.php3?id=101... by Richard Hundt class HTTP_Client { var $host; var $path; var $port; var $data; var $socket; var $errno; var $errstr; var $timeout; var $buf; var $result; var $agent_name = "MyAgent"; //Constructor, timeout 30s function HTTP_Client($host, $port, $data, $timeout = 30) { $this->host = $host; $this->port = $port; $this->data = $data; $this->timeout = $timeout; } //Opens a connection function connect() { $this->socket = fsockopen($this->host, $this->port, $this->errno, $this->errstr, $this->timeout ); if(!$this->socket) return false; else return true; } //Set the path function set_path($path) { $this->path = $path; } //Send request and clean up function send_request() { if(!$this->connect()) { return false; } else { $this->result = $this->request($this->data); return $this->result; } } function request($data) { $this->buf = ""; fwrite($this->socket, "POST $this->path HTTP/1.0\r\n". "Host:$this->host\r\n". "User-Agent: $this->agent_name\r\n". "Content-Type: application/xml\r\n". "Content-Length: ".strlen($data). "\r\n". "\r\n".$data. "\r\n" ); while(!feof($this->socket)) $this->buf .= fgets($this->socket, 2048); $this->close(); return $this->buf; } function close() { fclose($this->socket); } } function send_request() { global $onlineresource; $ch = curl_init(); $timeout = 5; // set to zero for no timeout // fix to allow HTTPS connections with incorrect certificates curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt ($ch, CURLOPT_URL,$onlineresource); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); curl_setopt ($ch, CURLOPT_ENCODING , "gzip, deflate"); $file_contents = curl_exec($ch); curl_close($ch); $lines = array(); $lines = explode("\n", $file_contents); if(!($response = $lines)) { echo "Unable to retrieve file '$service_request'"; } $response = implode("",$response); return $response;
Michał K.

Michał K. WebGIS Magician

Temat: Geoserver + OpenLayers (GetFeatureInfo nie działa)

A masz w ogóle zainstalowane i skonfigurowane PHP na serwerze? Bo teraz to wygląda tak, że serwer nie interpretuje i nie wykonuje kodu w pliku .php, ale traktuje go jako zwykły tekst.
Maciej L.

Maciej L. Student, UR Kraków

Temat: Geoserver + OpenLayers (GetFeatureInfo nie działa)

Mea culpa!

Faktycznie, brakowało PHP...

Teraz już działa jak należy :D Wielkie dzięki.

Pozdrawiam.

Temat: Geoserver + OpenLayers (GetFeatureInfo nie działa)

Witam, podepnę się do pytania.

Moim problemem jest to, że OpenLayers nie wyświetla warstwy WMS, która pokazana jest w 'LayersSwitcher',i do której działa zapytanie getFeatureInfo (po kliknięciu w miejsce, gdzie powinnna być widoczna warstwa WMS pokazuje się dymek z tabelką z atrybutami, natomiast warstwy na mapie nie widać).

Poniżej załączam kod:

OpenLayers.ProxyHost = "proxy.php?url=";

var map, info;

function init(){
map = new OpenLayers.Map ({
div: "map",
}
);

var wms = new OpenLayers.Layer.WMS ("Roads",
"http://localhost:8081/geoserver/KOR/wms",
{layers: "roads", transparent: true, format:"image/png"}
);
var osm = new OpenLayers.Layer.OSM("map");
map.addLayers([wms, osm]);

map.setCenter ([2277379.15, 7123345.82],14);

info = new OpenLayers.Control.WMSGetFeatureInfo({
url: 'http://localhost:8081/geoserver/KORTOWO/wms',
title: 'Identify features by clicking',
queryVisible: true,
eventListeners: {
getfeatureinfo: function(event) {
map.addPopup(new OpenLayers.Popup.FramedCloud(
"chicken",
map.getLonLatFromPixel(event.xy),
null,
event.text,
null,
true
));
}
}
});
map.addControl(info);
info.activate();

map.addControl(new OpenLayers.Control.LayerSwitcher());
}
$(document).ready(init);

Czy ktoś ma jakieś sugestie jak można rozwiązać ten problem?

P.S. Php_curl.dll jest włączone, sprawdzałam za pomocą phpsetup.php

Następna dyskusja:

WMS nie działa




Wyślij zaproszenie do