<div>Hi Trond,</div>
<div> </div>
<div>thanks for your example code. I've coded a <a href="http://VB.NET">VB.NET</a> utility for tile index file, it should work well. Just one thing for you, don't forget to destroy every shapeObject after having added it to shape file, at the end to close the shape file and the attribute table.
</div>
<div> </div>
<div>Cheers</div>
<div> </div>
<div>Zhonghai<br> </div>
<div><span class="gmail_quote">On 9/26/07, <b class="gmail_sendername">Trond Michelsen</b> <<a href="mailto:trondmm-mapserver@crusaders.no">trondmm-mapserver@crusaders.no</a>> wrote:</span>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">On Wed, Sep 26, 2007 at 10:35:36AM +0200, Zhonghai Wang wrote:<br>> thanks you for your clues for creating the index file, I am looking forword
<br>> to sharing your experience of creating the utility programmatically.<br>> Actually, I create more often MapInfo seamless layer programmatically, but I<br>> am not very familar with the ESRI index file format, so I am just not sure
<br>> how I should use the ShapeLib to create the index file.<br><br>My initial tests were successful, and it turned out to be very easy to<br>create a tileindex for rasterimages. It's basically exactly the same<br>
as a tileindex for shapefiles.<br><br>I need to clean it up a bit, and make it possible to choose<br>outputfilename, but for now, here's a simple example:<br><br>--8<--<br>#!/usr/bin/perl<br><br>use strict;<br>use warnings;
<br>use Geo::Shapelib ':constants';<br><br>my $tileindex = Geo::Shapelib->new();<br><br>$tileindex->{Shapetype}  = POLYGON;<br>$tileindex->{FieldNames} = ["Location"];<br>$tileindex->{FieldTypes} = ["String:255"];
<br><br>for my $filename (@ARGV) {<br>   my ($xmin, $ymin, $xmax, $ymax) = get_coordinates($filename);<br>   push @{$tileindex->{Shapes}}, {<br>       SHPType  => POLYGON,<br>       Vertices => [[$xmin, $ymin],<br>
                    [$xmax, $ymin],<br>                    [$xmax, $ymax],<br>                    [$xmin, $ymax],<br>                    [$xmin, $ymin]]<br>   };<br>   push @{$tileindex->{ShapeRecords}}, [$filename];<br>
}<br><br>$tileindex->save('tileindex');<br><br>sub get_coordinates {<br>   my $filename = shift;<br>   my ($bbox) = $filename =~ /ec_world_(.*)\.png/;<br>   return split "," => $bbox;<br>}<br>__END__
<br>--8<--<br><br>This program will take a list of files as arguments, and create a<br>tileindex, which is saved as tileindex.* in the current directory. The<br>subroutine get_coordinates() figures out what xmin, xmax, ymin and
<br>ymax is for the current rasterimage. In my case, the bbox is embedded<br>in the filename, but you might have to read a worldfile or do<br>something else for your images.<br><br>Speaking of worldfiles. The tileindex only tells mapserver which files
<br>to load for a given view. Mapserver still need the worldfiles to<br>figure out where and how each of the pictures it opens should be<br>positioned.<br><br>Anyway - just like with a tileindex for shapefiles, mapserver<br>
interprets the "Location" value as relative to shapepath if you use<br>relative paths. So I think it's better to use absolute paths when you<br>run the program.<br><br>To use this tileindex in a mapfile, you just include something like this:
<br><br>LAYER<br>  NAME "tiled_raster"<br>  STATUS ON<br>  TILEINDEX "tileindex"<br>  TILEITEM "Location"<br>  TYPE RASTER<br>END<br><br><br>--<br>Trond Michelsen<br></blockquote></div><br>