4 votos

¿Por qué esta capa de Mapserver no se superpone correctamente en Google Maps?

Estoy usando mapserver para servir a una superposición de datos meteorológicos en un mapa de google (V2) y el tiempo de los datos no muestra donde debe.

La imagen siguiente muestra el problema que estoy teniendo. Las líneas negras son la tierra de la frontera de Alaska, como se puede ver, que no se alinean. Las líneas marrones representan lat largo de las líneas.

Como se puede ver la relación entre el lat lon líneas y las fronteras de Alaska alinear correctamente, sin embargo, que no coinciden con la de google.

enter image description here

La petición WMS estoy utilizando el siguiente aspecto:

http://mysite.com/cgi-bin/mapserv?map=/opt/fgs/www/htdocs/mymap.map&REQUEST=GetMap&SERVICE=WMS&VERSION=1.1.1&LAYERS=radarALASKA_TEST,Graticule&STYLES=&FORMAT=image/png&BGCOLOR=0xFFFFFF&TRANSPARENT=TRUE&SRS=EPSG:4326&BBOX=0,66.51326044311185,45,79.17133464081945&WIDTH=256&HEIGHT=256&reaspect=true

El cuadro delimitador se construye mediante el siguiente javascript:

var lULP = new GPoint(a.x * 256, (a.y + 1) * 256);
var lLRP = new GPoint((a.x + 1) * 256, a.y * 256);

var lUL = G_NORMAL_MAP.getProjection().fromPixelToLatLng(lULP, b, false);
var lLR = G_NORMAL_MAP.getProjection().fromPixelToLatLng(lLRP, b, false);

var lBbox = lUL.x + "," + lUL.y + "," + lLR.x + "," + lLR.y;

y este es mi mapfile

MAP
#CONFIG "PROJ_DEBUG" "ON"
#CONFIG "CPL_DEBUG" "ON"
#CONFIG "MS_ERRORFILE" "/opt/fgs/www/htdocs/airlog/logs/ms_error.txt"
#DEBUG 5
IMAGETYPE PNG

SIZE 400 300
SHAPEPATH "/opt/fgs/www/htdocs/data"
#FONTSET   "/opt/fgs/www/htdocs//data/fonts.txt"
IMAGECOLOR 255 255 255 
TRANSPARENT OFF

WEB
METADATA
"wms_title"           "WMS Demo Server"
"wms_onlineresource"  "http://10.142.62.153/cgi-bin/mapserv?map=/opt/fgs/www/htdocs/mymap.map&"
"wms_srs"             "epsg:4326 epsg:900913"
END
END

PROJECTION
"proj=merc"
"a=6378137"
"b=6378137"
"lat_ts=0.0"
"lon_0=0.0"
"x_0=0.0"
"y_0=0"
"k=1.0"
"units=m"
"nadgrids=@null"
"wktext"
"no_defs"
END

EXTENT -20037508.34 -20037508.34 20037508.34 20037508.34
UNITS meters

LAYER
TYPE RASTER
STATUS ON
#NAME GISIMAGE_RADAR_CUR_ALASKA_TEST
GROUP radarALASKA_TEST
DATA "/opt/fgs/www/htdocs/Bristow/GISIMAGE_RADAR_CUR_ALASK.png"

PROJECTION
"proj=latlong"
"a=6367451.5"
"b=6367451.5"
END 
UNITS DD
PROCESSING "DITHER=YES"

# For Mapserver 3.x, we would use
# OFFSITE 0
OFFSITE 0 0 0
END

SYMBOL
NAME "circle"
TYPE ellipse
FILLED true
POINTS
1 1
END
END

#  Graticule (lines of constant lat-lon)
LAYER
NAME "Graticule"

PROJECTION
"proj=latlong"
"a=6378137"
"b=6378137"
#"ellps=WGS84"
#"datum=WGS84"
END

TYPE LINE
STATUS ON
CLASS
COLOR 180 180 180

LABEL
TYPE BITMAP
SIZE SMALL
COLOR 90 90 90
POSITION AUTO
OUTLINECOLOR 255 255 255
END
END

GRID
#  In lat-lon coordinate system, lines will always be straight (need 2 pts)
MINSUBDIVIDE 2
MAXSUBDIVIDE 180 
# MAXINTERVAL must be < MININTERVAL or mapserver will hang.
# MININTERVAL 15
# MAXINTERVAL 10
# MINARCS 18
# MAXARCS 10
LABELFORMAT '%.f'
END
END
END

Creo que el problema está relacionado con la salida de WKT en el archivo de mapa pero no estoy muy seguro y me gustaría apreciar la ayuda de aquellos con más experiencia que yo en estas cosas!

Gracias a todos por adelantado, y si me he olvidado de incluir algunos críticos de la información, por favor haganmelo saber :)

1voto

becko Puntos 114

Tienes razón, la proyección debe ser transformada:

     function get_wms_url(bounds) {
         // recalculate bounds from Google to WGS
        var proj = new OpenLayers.Projection("EPSG:4326");
        bounds = bounds.transform(map.baseLayer.projection, proj);

        //construct WMS request

      var url = this.url;
        url += "&REQUEST=GetMap";
        url += "&SERVICE=WMS";
        url += "&VERSION=1.1.1";
        url += "&LAYERS=" + this.layers;
        url += "&FORMAT=" + this.format;
        url += "&TRANSPARENT=TRUE";
        url += "&SRS=" + "EPSG:4326";
        url += "&BBOX=" + bounds.toBBOX();
        url += "&WIDTH=" + this.tileSize.w;
        url += "&HEIGHT=" + this.tileSize.h;
        return url;
     }
    var layerWMS = new OpenLayers.Layer.WMS( "Roads",
        "http://"+location.host+"/cgi-bin/mapserv?map="+basePath+"&", {
            layers: 'roads,buildings,buildingssm,creek,fences,waterbodies',
            format: "image/png",
            getURL: get_wms_url,
            isBaseLayer: false
            }, {gutter: 15, isBaseLayer: false, singleTile: true} );
 

1voto

Ben Puntos 11

El problema resultó ser la definición del cuadro delimitador en la solicitud. Necesitaba usar las bibliotecas proj4.js para definir correctamente el cuadro delimitador en 3857 para que esto funcione. Una vez que hice esto, funcionó perfectamente, así que no había nada malo con mi mapfile después de todo :)

1voto

Brian R. Bondy Puntos 1715

He notado que en la definición de la EPSG:900913 (= EPSG:3857) en spatialreference.org difiere de otras definiciones: El parámetro "nadgrids=@null" se sustituye por "towgs84=0,0,0,0,0,0,0".

No sé el significado exacto de los parámetros, así que puedo decir que la definición en el derecho, pero es posible que vale la pena tratar de adaptar la proyección en el mapfile.

(Me interesaría si alguien puede explicar la diferencia...)

0voto

HenryR Puntos 3026

Recientemente hemos instalado MapServer y también trató de utilizar 900913. Que no se pudo. Pero el uso de 3857 (la versión moderna de 900913). Así, parece que cuando MapServer está instalado, es posible que ya tenga el 3857 definición. Y que se deben incluir en el wms_srs línea de su mapfile. Por CIERTO, usted puede obtener más debug/información de error si se pega todo el conseguir solicitud de mapa para MapServer en una ventana del navegador y pulse la tecla de retorno. Si funciona con 3857, se obtiene el png de superposición. Si no, hoperfully MapServer devolverá una línea con información de error para ayudarle a solucionar. Si usted todavía consigue errores, hay una proyección de definición de área que MapServer se refiere a (MapServer docs dice /usr/local/share/proj/epsg) que puede que tenga que modificar en consecuencia.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X