From: Jesse E. <je...@re...> - 2007-03-23 18:44:21
|
THanks for this. I will apply the fix as soon as I can. Jesse On Mar 8, 2007, at 2:24 AM, <mic...@ri...> =20 <mic...@ri...> wrote: > Hello, > > I am quite new in the geotools usergroup. First of all I want to =20 > say that geotools is a really nice library with very interesting =20 > and useful functions. > > In my actual project i worked with the indexed shapefile datastore. > > In my tests the reading of point shapefile data seemed to be quite =20 > slow when using the quadtree-index. When I searched for a solution =20 > I debugged the class "ShapeFileIndexer.java". I found out that the =20 > BoundingBox of the of the points was wrong. > Maybe someone wants to check out if it is really a bug or if the =20 > shapefiles itself make the problems. They where generated with a =20 > software called FME. > > The following workaround in the ShapeFileIndexer.java solved my =20 > problems (Look for the comment "Workaround": > > //////////////////////////////////////////////////////////////////////=20= > ///////////////////////////////// > private int buildQuadTree(ShapefileReader reader, File file, =20 > boolean verbose) > throws IOException, StoreException { > byte order =3D 0; > > if ((this.byteOrder =3D=3D null) || =20 > this.byteOrder.equalsIgnoreCase("NM")) { > order =3D IndexHeader.NEW_MSB_ORDER; > } else if (this.byteOrder.equalsIgnoreCase("NL")) { > order =3D IndexHeader.NEW_LSB_ORDER; > } else { > throw new StoreException("Asked byte order '" + =20 > this.byteOrder > + "' must be 'NL' or 'NM'!"); > } > > String ext =3D this.fileName.substring=20 > (this.fileName.lastIndexOf('.')); > > String idxFileName =3D this.fileName.substring(0, > this.fileName.length() - 4) > + (ext.equals(".shp") ? ".shx" : ".SHX"); > > FileInputStream fisIdx =3D new FileInputStream(idxFileName); > FileChannel channelIdx =3D fisIdx.getChannel(); > IndexFile shpIndex =3D new IndexFile(channelIdx); > QuadTree tree=3Dnull; > int cnt =3D 0; > try{ > int numRecs =3D shpIndex.getRecordCount(); > ShapefileHeader header =3D reader.getHeader(); > Envelope bounds =3D new Envelope(header.minX(), header.maxX(), > header.minY(), header.maxY()); > > tree =3D new QuadTree(numRecs, bounds, shpIndex); > > Record rec =3D null; > > while (reader.hasNext()) { > rec =3D reader.nextRecord(); > > /////Workarround > ////because of wrong boundingbox at points > if(header.getShapeType()=3D=3DShapeType.POINT){ > rec.maxX=3Drec.minX; > rec.maxY=3Drec.minY; > } > > tree.insert(cnt++, > new Envelope(rec.minX, rec.maxX, rec.minY, rec.maxY)); > > if (verbose && ((cnt % 500) =3D=3D 0)) { > System.out.print('.'); > } > } > }finally{ > channelIdx.close(); > fisIdx.close(); > shpIndex.close(); > } > FileSystemIndexStore store =3D new FileSystemIndexStore(file, =20= > order); > store.store(tree); > > return cnt; > } > //////////////////////////////////////////////////////////////////////=20= > ///////////////////// > -- > RIWA GmbH > Gesellschaft f=FCr Geoinformationen > Sitz der Gesellschaft : Zwingerstrasse 1, 87435 Kempten (Allg=E4u) > Registergericht : Amtsgericht Kempten, HRB 6480 > Gesch=E4ftsf=FChrer : Dipl.-Ing. G=FCnter Kraus > > > ----------------------------------------------------------------------=20= > --- > Take Surveys. Earn Cash. Influence the Future of IT > Join SourceForge.net's Techsay panel and you'll get the chance to =20 > share your > opinions on IT & business topics through brief surveys-and earn cash > http://www.techsay.com/default.php?=20 > page=3Djoin.php&p=3Dsourceforge&CID=3DDEVDEV > _______________________________________________ > Geotools-gt2-users mailing list > Geo...@li... > https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users |