matplotlib / basemap

Plot on map projections (with coastlines and political boundaries) using matplotlib
MIT License
779 stars 392 forks source link

readshapefile fails on certain filenames #151

Open aaschwanden opened 10 years ago

aaschwanden commented 10 years ago

Hi,

(Tested with basemap 1.0.6)

This works:

m.readshapefile('foo.shp', 'my_shape')

while this fails:

m.readshapefile('bar_0.1.shp', 'my_shape')

raise IOError('error reading shapefile %s.shp' % shapefile)
  fields = shf.fields
  coords = []; attributes = []

IOError: error reading shapefile bar_0.1.shp

Note that foo.shp and bar_0.1.shp are exactly the same file except for the filename. So it seems that the additional . causes the problem. Minimal example to reproduce behavior:

Rename huralll020.{shp,dfb,shx} to huralll020_0.1.{shp,dbf,shx} and change filename in examples/hurrtracks.py accordingly. Run hurrtracks.py.

Of course the obvious workaround is not to use . in filenames. But this is somewhat impracticable as I have a large number or files and would like keeping the filenames consistent accross filetypes (netCDF, shapfiles, pngs, etc).

Is there an easy fix?

Thanks very much,

Andy

guziy commented 10 years ago

Hmm:

I look at the code and do not understand how it worked for you .... What happens if you don't specify the .shp extension?

Thanks

2014-04-28 18:10 GMT-04:00 Andy Aschwanden notifications@github.com:

Hi,

(Tested with basemap 1.0.6)

This works:

m.readshapefile('foo.shp', 'my_shape')

while this fails:

m.readshapefile('bar_0.1.shp', 'my_shape')

raise IOError('error reading shapefile %s.shp' % shapefile) fields = shf.fields coords = []; attributes = []

IOError: error reading shapefile bar_0.1.shp

Note that foo.shp and bar_0.1.shp are exactly the same file except for the filename. So it seems that the additional . causes the problem. Minimal example to reproduce behavior:

Rename huralll020.{shp,dfb,shx} to huralll020_0.1.{shp,dbf,shx} and change filename in examples/hurrtracks.py accordingly. Run hurrtracks.py.

Of course the obvious workaround is not to use . in filenames. But this is somewhat impracticable as I have a large number or files and would like keeping the filenames consistent accross filetypes (netCDF, shapfiles, pngs, etc).

Is there an easy fix?

Thanks very much,

Andy

— Reply to this email directly or view it on GitHubhttps://github.com/matplotlib/basemap/issues/151 .

Sasha

aaschwanden commented 10 years ago

Sorry, I was not clear enough, the above code was a snippet from my scripts. I don't specify the the .shp extension, so the above should read:

This works:

m.readshapefile('foo, 'my_shape')

while this fails:

m.readshapefile('bar_0.1', 'my_shape')

Andy

guziy commented 10 years ago

I think you are not passing the extension to readshapefile, it is just a typo in your example, right?

If this is so then the culprit is this line:

https://github.com/matplotlib/basemap/blob/master/lib/mpl_toolkits/basemap/shapefile.py#L249

It is not to hard to fix, so If you want the glory, go ahead) If Jeff won't mind.

Cheers

2014-04-28 18:31 GMT-04:00 Oleksandr Huziy guziy.sasha@gmail.com:

Hmm:

I look at the code and do not understand how it worked for you .... What happens if you don't specify the .shp extension?

Thanks

2014-04-28 18:10 GMT-04:00 Andy Aschwanden notifications@github.com:

Hi,

(Tested with basemap 1.0.6)

This works:

m.readshapefile('foo.shp', 'my_shape')

while this fails:

m.readshapefile('bar_0.1.shp', 'my_shape')

raise IOError('error reading shapefile %s.shp' % shapefile) fields = shf.fields coords = []; attributes = []

IOError: error reading shapefile bar_0.1.shp

Note that foo.shp and bar_0.1.shp are exactly the same file except for the filename. So it seems that the additional . causes the problem. Minimal example to reproduce behavior:

Rename huralll020.{shp,dfb,shx} to huralll020_0.1.{shp,dbf,shx} and change filename in examples/hurrtracks.py accordingly. Run hurrtracks.py.

Of course the obvious workaround is not to use . in filenames. But this is somewhat impracticable as I have a large number or files and would like keeping the filenames consistent accross filetypes (netCDF, shapfiles, pngs, etc).

Is there an easy fix?

Thanks very much,

Andy

— Reply to this email directly or view it on GitHubhttps://github.com/matplotlib/basemap/issues/151 .

Sasha

Sasha

guziy commented 10 years ago

I would do smth like this:

if os.path.isfile(shapefile): (shapeName, ext) = os.path.splitext(shapefile) else: shapeName = shapefile

self.shapeName = shapeName

Cheers

2014-04-28 18:44 GMT-04:00 Oleksandr Huziy guziy.sasha@gmail.com:

I think you are not passing the extension to readshapefile, it is just a typo in your example, right?

If this is so then the culprit is this line:

https://github.com/matplotlib/basemap/blob/master/lib/mpl_toolkits/basemap/shapefile.py#L249

It is not to hard to fix, so If you want the glory, go ahead) If Jeff won't mind.

Cheers

2014-04-28 18:31 GMT-04:00 Oleksandr Huziy guziy.sasha@gmail.com:

Hmm:

I look at the code and do not understand how it worked for you .... What happens if you don't specify the .shp extension?

Thanks

2014-04-28 18:10 GMT-04:00 Andy Aschwanden notifications@github.com:

Hi,

(Tested with basemap 1.0.6)

This works:

m.readshapefile('foo.shp', 'my_shape')

while this fails:

m.readshapefile('bar_0.1.shp', 'my_shape')

raise IOError('error reading shapefile %s.shp' % shapefile) fields = shf.fields coords = []; attributes = []

IOError: error reading shapefile bar_0.1.shp

Note that foo.shp and bar_0.1.shp are exactly the same file except for the filename. So it seems that the additional . causes the problem. Minimal example to reproduce behavior:

Rename huralll020.{shp,dfb,shx} to huralll020_0.1.{shp,dbf,shx} and change filename in examples/hurrtracks.py accordingly. Run hurrtracks.py.

Of course the obvious workaround is not to use . in filenames. But this is somewhat impracticable as I have a large number or files and would like keeping the filenames consistent accross filetypes (netCDF, shapfiles, pngs, etc).

Is there an easy fix?

Thanks very much,

Andy

— Reply to this email directly or view it on GitHubhttps://github.com/matplotlib/basemap/issues/151 .

Sasha

Sasha

Sasha

aaschwanden commented 10 years ago

Correct, I realized that basemap does not accept the extension, so my script removes it first, before passing the name to m.readshapfile. The script looks something like this

    shape_filename = ['foo.shp', 'bar_0.1.shp']
    for index, shpfile in enumerate(shape_filename):
        # remove .shp extension
        shpfile = shpfile.split('.shp')[0]
        m.readshapefile(shpfile,
                            'my_shapefile', linewidth=.75)

I'm not an expert python programmer, so this is sort of a hack as it can fail when the filename contains the pattern .shp besides the extension.

aaschwanden commented 10 years ago

@guziy :+1: Yes that should work. I can go ahead and make the code change, if that's ok.

guziy commented 2 years ago

This issue can be closed here, if the issue is still there, then it should be reported to the pyshp project (I am guessing here: https://github.com/GeospatialPython/pyshp).