basemap icon indicating copy to clipboard operation
basemap copied to clipboard

readshapefile fails on certain filenames

Open aaschwanden opened this issue 11 years ago • 7 comments

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

aaschwanden avatar Apr 28 '14 22:04 aaschwanden

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 [email protected]:

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

guziy avatar Apr 28 '14 22:04 guziy

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

aaschwanden avatar Apr 28 '14 22:04 aaschwanden

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 [email protected]:

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 [email protected]:

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 avatar Apr 28 '14 22:04 guziy

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 [email protected]:

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 [email protected]:

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 [email protected]:

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

guziy avatar Apr 28 '14 22:04 guziy

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 avatar Apr 28 '14 22:04 aaschwanden

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

aaschwanden avatar Apr 28 '14 23:04 aaschwanden

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).

guziy avatar Aug 31 '22 14:08 guziy