Ocena wątku:
  • 0 Głosów - 0 Średnio
  • 1
  • 2
  • 3
  • 4
  • 5
Powielone dane z MapServer
10-01-2011, 11:22,
#1
Powielone dane z MapServer
Cześć!
Jako nowy, chciałbym się z Wami przywitać Smile

I jednocześnie zadać pytanie, które spędza mi sen z powiek od kilku dni...
Mam dane postgisowe, które są na pewno poprawne (QuantumGIS wyświetla je bez problemu). Uruchomiłem MapServer, co by mi te dane publikował, w przeglądarce nawet mogę zobaczyć obrazek, co już jest niewielkim sukcesem.
Jednak gdy próbuję wyświetlić dane z MapServera w OpenLayers, dane są powielone, obrazki obok siebie. Gdy zmieniam skalę, nic właściwie się nie zmienia: wciąż obrazki są tego samego rozmiaru i wypełniają całą dostępną przestrzeń.
Dane mam zapisane w PostGis w EPSG:2180, co - mam nadzieję, że nie ma tutaj pomyłki - jest jednym z odwzorowań dla Polski.
Macie jakieś pomysły, dlaczego mam to powielenie?
Jeśli to zbyt enigmatyczne, chętnie rozwinę swoją wypowiedź Smile
10-01-2011, 13:21,
#2
RE: Powielone dane z MapServer
A pokaż swój plik .map (tylko hasło do postgisa wymażWink ) i kod OpenLayers (a co najmniej: tworzenie mapy, tej warstwy oraz wstępny zoom mapy)
10-01-2011, 17:52, (Ten post był ostatnio modyfikowany: 10-01-2011, 17:55 {2} przez Umberto.)
#3
RE: Powielone dane z MapServer
Staram się uzyskać cokolwiek, na dodatek to dopiero mój wstęp do MapServera, więc bądź wyrozumiały Smile

MapFile:
Kod:
MAP
  NAME           "testowa_mapa"
  EXTENT         16.0 52.0 18.0 53.0
  SIZE           600 500
  IMAGETYPE      PNG
  PROJECTION
    "init=epsg:2180"
  END
  
  WEB
    METADATA
      "wms_title"           "WMS Hub Server"
      "wms_onlineresource"  "http://hubmapserver.org/cgi-bin/mapserv?map=/home/umberto/systherm/hubmapserver/test.map&"
      "wms_srs"             "EPSG:2180"
    END
  END

  LAYER
    CONNECTIONTYPE postgis
    NAME "ulica"
    PROJECTION
      "init=epsg:2180"
    END
    CONNECTION "user=postgres password=psdatabase dbname=punktyadresowe host=localhost"
    PROCESSING "CLOSE_CONNECTION=DEFER"
    DATA "geometria from ad_ulica using srid=2180 using unique id"
    STATUS ON
    TYPE LINE
    CLASS
      STYLE
        COLOR 255 22 22
        WIDTH 2
      END
    END
  END
END

Kawałek z OL, tworzący mapę:

Kod:
map = new OpenLayers.Map("ap_open_layers_map", { controls: [] });

Kawałek z OL, tworzący warstwę WMS:

Kod:
var roads = new OpenLayers.Layer.WMS("Osie dróg", "http://hubmapserver.org/cgi-bin/mapserv?",
                {
                  map: '/home/umberto/systherm/hubmapserver/test.map',
                  layers: "ulica",
                  transparent: true,
                  mode: 'map'
                },
                {
                  isBaseLayer: false,
                  maxExtent: new OpenLayers.Bounds(16.0, 52.0, 18.0, 53.0),
                  projection: new OpenLayers.Projection('EPSG:2180'),
                  units: 'meters'
                });
  map.addLayer(roads);

Wstępny zoom w OL:
Kod:
map.setCenter(new OpenLayers.LonLat(16.9, 52.4), 10);
10-01-2011, 20:28,
#4
RE: Powielone dane z MapServer
Najpierw podłącz jakiś działający WMS, serwujący w układzie 1992 - jak w przykładzie poniżej. To obiekt map, a nie warstwę, trzeba skonfigurować do pracy w układzie 1992. maxScale wyznacza zerowy poziom zoomu, więc gdy dalej w komendzie MapCenter podaję poziom 2, to on jest liczony od tego miliona. Współrzędne podajesz w układzie 92, a nie w stopniach. W warstwie nie ustawiasz już układu i jednostek, weźmie to z mapy.

Kod:
<html>
<head>
    <script src="http://openlayers.org/api/OpenLayers.js" type="text/javascript"></script>
    <script type="text/javascript">
        var map;
        function laduj() {
            mapOptions = {
//                 controls: [],
                projection: new OpenLayers.Projection("EPSG:2180"),
                units: "m",
                maxExtent: new OpenLayers.Bounds(150000, 120000, 920000, 800000),
                maxScale: 1000000
            };
            map = new OpenLayers.Map('map', mapOptions);

            gdos = new OpenLayers.Layer.WMS( 'gdos',
                'http://wms.gdos.gov.pl/geoserver/wms',
                {layers: 'gdos_int:ObszarySpecjalnejOchrony,gdos_int:SpecjalneObszaryOchrony'}
            );

            map.addLayer(gdos);
            map.setCenter(new OpenLayers.LonLat(600000, 600000), 2);
        };
    </script>
<head>
<body onload='laduj()'>
    <div id="map" style="width:600; height:400; border: 1px solid gray"></div>
</body>
</html>

Potem próbuj podłączyć swojego MapServera Smile
10-01-2011, 22:36,
#5
RE: Powielone dane z MapServer
Jak już wspomniał Borys, extenty podaje się w układzie mapy (czyli tutaj 1992) - zarówno w OpenLayers jak i Mapserverze.
Możesz też podejrzeć ten plik http://bpn.e-mapa.net/mapa.js - mapa OL i warstwy WMS w układzie 92 - choć może trochę zagmatwane i niezbyt eleganckie Wink
10-01-2011, 23:40, (Ten post był ostatnio modyfikowany: 10-01-2011, 23:42 {2} przez Umberto.)
#6
RE: Powielone dane z MapServer
Bardzo Wam dziękuję za pomoc. Pomogło!
Przeniosłem opis odwzorowania do obiektu OL.Map i z definicji warstwy OL.Layer.WMS usunąłem mode: 'map'. Poprawiłem też wyśrodkowanie na współrzędne odwzorowania - tak w OL, jak i w mapfile'u.
Wreszcie widzę swoje warstwy!
Mam teraz jeszcze jedno pytanie. Te wszystkie modyfikacje spowodowały, że położenie myszy (OL.Control.MousePosition) przestało wyświetlać współrzędne geograficzne (Lon/Lat), wyświetla współrzędne odwzorowania. Czy można coś z tym zrobić?

BTW: miałem już jedną warstwę w 92 wczytywaną, jednak teraz po tych zmianach nareszcie nie jest taka rozciągnięta w poziomie i zaczyna przypominać kawałek Polski. Warstwa, którą wstawił Borys też wygląda całkiem zgrabnie Smile
11-01-2011, 00:06,
#7
RE: Powielone dane z MapServer
Żeby wyświetlać współrzędne w stopniach, obok parametru mapy projection musisz ustawić też displayProjection. Ale to nie wystarczy, bo Ola ma wbudowaną reprojekcję tylko między popularnymi światowymi układami. Żeby to zadziałało z układem 92, musisz ściągnąć i podłączyć w htmlu bibliotekę Proj4js oraz dopisać w swoim skypcie deklarację układu 92:

Kod:
Proj4js.defs['EPSG:2180'] = '+proj=tmerc +lat_0=0 +lon_0=19 +k=0.9993 +x_0=500000 +y_0=-5300000 +ellps=GRS80 +units=m +no_defs';
11-01-2011, 22:03,
#8
RE: Powielone dane z MapServer
Dzięki, spróbuję na pewno. Dam znać, jak poszło.


Skocz do: