coastlines in matplotlib.toolkits.basemap

I would like to use a higher resolution coastline than the high resolution
coastline optionally provided with (specifically, I would like to use the
NOAA/NOS Medium Resolution Coastline). I can see two ways to do this:

Option 1) Create a coastline file using the in the NOAA/NOS data in the same
format as the data files used by the basemap toolkit. I couldn't find a
description of this format, but it appears that it is partially explained by
the code snippet:

if line.startswith('P'):
                area = float(linesplit[5])
                west,east,south,north =
float(linesplit[6]),float(linesplit[7]),float(linesplit[8]),float(linesplit[9])
                typ = int(linesplit[3])

So the first line of the existing high resolution coastline is:
P 0 169598 1 W 79866900.000 -17.53378 190.35911 -34.83044 77.71958

Which should be interpreted as
typ = 1
area = 79866900.000
west = -17.53378
east = 190.35911
south = -34.83044
north = 77.71958

area is used to control whether this segment of coastline is displayed
the directions are the bounding box for the coastline segment
I am not clear on how typ is used (I see it getting manipulated, but I don't
see it ever getting used), or what its acceptable values are. I am also not
clear what the first, second and fourth values of the line are (not counting
the initial 'P'). Any help with this format would be appreciated.

Option 2) Load a coastline by whatever means I choose as a list of lists of
touples (or some other format?) and then transform those values using the
basemap object. If the coastline were easily expressed as a pair of lists or
arrays lon,lat, then I could simply use

b=basemap(...)
coastx,coasty = b(lcoastlon,coastlat)

but the coastline is made up of multiple segments (islands, etc). Is the
best way to transform a collection of segments simply to loop over the
segments?

coast = [ [(x11,y11),... (x1n,y1n)], [(x21,y21),... (x2n,y2n)],...
[(xn1,yn1),...(xnn,ynn)] ]
newcoast = []
for c in coast:
  ln,lt = map(list,zip(*c))
  x,y = m(ln,lt)
  newcoast.append(zip(x,y))

Once I have a transformed list of lists of touples, I can replace the
basemap objects coastsegs
b.coastsegs = newcoast

and then draw the coastline using the built-in
b.drawcoastlines()

Or is there some method that I am missing?

···

--
View this message in context: http://www.nabble.com/coastlines-in-matplotlib.toolkits.basemap-tf4617110.html#a13186210
Sent from the matplotlib - users mailing list archive at Nabble.com.

Charles Seaton wrote:

I would like to use a higher resolution coastline than the high resolution
coastline optionally provided with (specifically, I would like to use the
NOAA/NOS Medium Resolution Coastline). I can see two ways to do this:

Option 1) Create a coastline file using the in the NOAA/NOS data in the same
format as the data files used by the basemap toolkit. I couldn't find a
description of this format, but it appears that it is partially explained by
the code snippet:

if line.startswith('P'):
                area = float(linesplit[5])
                west,east,south,north =
float(linesplit[6]),float(linesplit[7]),float(linesplit[8]),float(linesplit[9])
                typ = int(linesplit[3])

So the first line of the existing high resolution coastline is:
P 0 169598 1 W 79866900.000 -17.53378 190.35911 -34.83044 77.71958

Which should be interpreted as typ = 1
area = 79866900.000
west = -17.53378 east = 190.35911 south = -34.83044 north = 77.71958

area is used to control whether this segment of coastline is displayed
the directions are the bounding box for the coastline segment
I am not clear on how typ is used (I see it getting manipulated, but I don't
see it ever getting used), or what its acceptable values are. I am also not
clear what the first, second and fourth values of the line are (not counting
the initial 'P'). Any help with this format would be appreciated.

Option 2) Load a coastline by whatever means I choose as a list of lists of
touples (or some other format?) and then transform those values using the
basemap object. If the coastline were easily expressed as a pair of lists or
arrays lon,lat, then I could simply use

b=basemap(...) coastx,coasty = b(lcoastlon,coastlat)

but the coastline is made up of multiple segments (islands, etc). Is the
best way to transform a collection of segments simply to loop over the
segments?

coast = [ [(x11,y11),... (x1n,y1n)], [(x21,y21),... (x2n,y2n)],...
[(xn1,yn1),...(xnn,ynn)] ]
newcoast = []
for c in coast:
  ln,lt = map(list,zip(*c))
  x,y = m(ln,lt)
  newcoast.append(zip(x,y))

Once I have a transformed list of lists of touples, I can replace the
basemap objects coastsegs
b.coastsegs = newcoast

and then draw the coastline using the built-in b.drawcoastlines()

Or is there some method that I am missing?

Charles: If you can get the coastlines in a shapefile, that's probably the easiest way to do it. See the fillstates.py example for reading in and plotting shapefiles on maps.

-Jeff

···

--
Jeffrey S. Whitaker Phone : (303)497-6313
NOAA/OAR/CDC R/PSD1 FAX : (303)497-6449
325 Broadway Boulder, CO, USA 80305-3328