Getting UTM and stereographic projections to overlap

Trond Michelsen trondmm-mapserver at CRUSADERS.NO
Mon Oct 31 06:35:07 PST 2005


Hi.

I'm having a bit of trouble displaying a shapefile in UTM33-format
properly together with my maps that use polar stereographic
projection.

I've made a small perl-program (included below) that creates two
shapefiles, one with the same projection parameters as my map, and one
in UTM33. Both files simply contains one point for every fifth
latitude and longitude.

I also have a map of Norway as a shapefile in UTM33.

When I plot my basemap together with the two point layers, and the
shapefile of Norway, the stereographic point layer matches the
latitudes and logitudes of the basemap. The UTM33 point layer has an
offset that seems to grow the further south you get. The shapefile of
Norway seems to have pretty much the same offset as the UTM33 point layer

Here are some examples:

http://crusaders.no/~trondmm/mapserv/utm_vs_stere.png
http://crusaders.no/~trondmm/mapserv/utm_vs_stere2.png
http://crusaders.no/~trondmm/mapserv/utm_vs_stere3.png

  red dots    = stereographic point layer
  yellow dots = UTM33 point layer


Now, after some experimenting, I've found out that I can get the two
point layers to overlap completely, if I change the stereographic
shapefile to use the WGS84 ellipsoid. Unfortunately, my basemaps
depend on a spherical earth, and it's not possible for me to convert
them.

So - is there anything I can do in the mapfile to get mapserver to get
the layers to overlap more precisely?


Here are my projection parameters from the mapfile:

The Web object:

PROJECTION
  "proj=stere"
  "lat_0=90"
  "lon_0=0"
  "lat_ts=60"
  "a=6371000"
  "b=6371000"
  "units=m"	
END

The stereographic point layer and all basemaps:

PROJECTION
  "proj=stere"
  "lat_0=90"
  "lon_0=0"
  "lat_ts=60"
  "a=6371000"
  "b=6371000"
  "units=m"	
END

The UTM33-point layer and shapefile of Norway:

PROJECTION
  "proj=utm"
  "zone=33"
  "ellps=WGS84"
  "datum=WGS84"
  "units=m"
END

and here's the program I used to generate the point layers:

--8<--
#!/usr/bin/perl

use strict;
use warnings;
use Geo::Proj4;
use Geo::Shapelib ':constants';

my %proj = (stere => Geo::Proj4->new(proj   => "stere",
                                     lat_0  => 90,
                                     lon_0  => 0,
                                     lat_ts => 60,
                                     a      => 6371000,
                                     b      => 6371000,
                                     units  => "m",
                                     ),
	    utm33 => Geo::Proj4->new(proj   => "utm",
                                     zone   => 33,
                                     ellps  => "WGS84",
                                     datum  => "WGS84",
                                     units  => "m",
                                     ),
	    );
	    
while (my ($name, $proj) = each %proj) {
    my $shape = Geo::Shapelib->new();

    $shape->{Shapetype} = POINT;

    $shape->{FieldNames} = [qw/POS       LAT    LON   /];
    $shape->{FieldTypes} = [qw/String:64 Double Double/];
    
    for (my $lat = 0;$lat <= 90; $lat += 5) {
        for (my $lon = -30; $lon <= 30; $lon += 5) {
            my ($x, $y) = $proj->forward($lat, $lon);
	    
            push @{$shape->{Shapes}}, {SHPType  => POINT,
                                       Vertices => [[$x,$y]]
                                      };
            push @{$shape->{ShapeRecords}}, ["$lat $lon",
                                             $lat,
                                             $lon,
                                            ];
        }
    }

    $shape->save("shapetest_$name");
}
--8<--

-- 
Trond Michelsen



More information about the MapServer-users mailing list