Shapefile field problem
Nicol Hermann
mapserver at GEOWORLD.DE
Tue Dec 7 13:33:22 PST 2004
Hi Abe,
i modified your script.
Instead of 'while' i use the following 'foreach' loop.
foreach ($vals as $key => $val) {
printf ("%s -- %s\n", $key, $val);
}
This statement returns all 54 fields of your shapefile.
HTH
Nicol
Am Di, den 07.12.2004 schrieb Abe Gillespie um 22:17:
> The problem with adding a value for that attribute corrupts the test
> case. Can you try the following PHP code and compare your results with
> mine?
>
> [php]
> <html>
> <body>
> <?
> dl("php_mapscript.so");
> $map = ms_newMapObj("/Users/abe/Sites/ms_test/test.map");
> for ($i = 0; $i < $map->numlayers; $i++)
> {
> $l = $map->getLayer($i);
> putBrLine($l->name.", type: ".$l->type);
> if ($l->data != null) // Shape files with data.
> {
> $l->open();
> $s = $l->getShape(-1, 0);
> $vals = $s->values;
> putBrLine("field count: ".count($vals));
> while ($fld = current($vals))
> {
> putBrLine(" ".key($vals));
> next($vals);
> }
> $s->free();
> $l->close();
> }
> }
>
> function putBrLine($line)
> {
> echo "$line<br>¥n";
> }
> ?>
> </body>
> </html>
>
> [output]
> test, type: 2
> field count: 54
> ACAD_TEXT
> COUNT
> ACCOUNT_NU
>
> See how there's a discrepancy between the field count and the number of
> field names that get dumped? From my experience, the field just after
> ACCOUNT_NU has a NULL value. I see the same behavior on my Mac OS X
> and Debian Linux installs.
>
> -Abe
>
> On Dec 7, 2004, at 2:15 PM, Jeff McKenna wrote:
>
> > Abe,
> >
> > I made a tiny mapfile with your test shp, and i see labels properly in
> > MapServer with it. I added an attribute in the "OWNERS_NAM" field and
> > I successfully displayed it in mapserver. Am i misunderstanding your
> > problem somehow? (mapfile below)
> >
> > jeff
> >
> > MAP
> > NAME "field-test"
> > STATUS ON
> > EXTENT 1260565.500000 941362.000000 1261605.125000 942198.625000
> > SIZE 400 300
> > SHAPEPATH "D:/DMSG/projects/mapserver-bugs/"
> > SYMBOLSET "../etc/symbols.sym"
> > FONTSET "../etc/fonts.txt"
> > IMAGETYPE gif
> > IMAGECOLOR 255 255 255
> > UNITS METERS
> > WEB
> > IMAGEPATH "/ms4w/tmp/ms_tmp/"
> > IMAGEURL "/ms_tmp/"
> > METADATA
> > END
> > END
> >
> > OUTPUTFORMAT
> > NAME "gif"
> > MIMETYPE "image/gif"
> > DRIVER "GD/GIF"
> > EXTENSION "gif"
> > IMAGEMODE PC256
> > TRANSPARENT FALSE
> > END
> >
> > LAYER
> > NAME test
> > TYPE POLYGON
> > STATUS ON
> > DATA test
> > LabelItem "OWNERS_NAM"
> > CLASS
> > NAME "ttt"
> > COLOR 0 255 0
> > LABEL
> > COLOR 255 0 0
> > FONT fritqat-italic
> > TYPE truetype
> > SIZE 8
> > POSITION AUTO
> > PARTIALS FALSE
> > OUTLINECOLOR 255 255 255
> > END
> > END
> > END # Layer
> >
> > END
> >
> >
> >
> >
> >
> > Abe Gillespie wrote:
> >> I do appreciate the help, but I'm not looking for an "external to
> >> MapServer" way of getting access to my DBF field values. I just use
> >> my
> >> PHP script to *reveal* problematic shapefile fields. When there is a
> >> problem it's unusable to MapServer! I.e.: I can't use the field for
> >> labelling.
> >> -Abe
> >> On Dec 7, 2004, at 11:27 AM, Ryan, Adam wrote:
> >>> Abe,
> >>>
> >>> Here's a routine I use to get the header information (field info)
> >>> from
> >>> a dbf
> >>> file.
> >>>
> >>> // ========== iDbf_fields ==============
> >>> // $f is a dbf file path, returns an array of field arrays
> >>> function iDbf_fields($f){
> >>> $h = fopen($f,"rb");
> >>> $a =
> >>> unpack("cversion/cyy/cmm/cdd/inumrecs/sheadsize/
> >>> srecsize",fread($h,12));
> >>> fread($h,20); //skip some reserved space
> >>> for($i=0;$i<($a["headsize"]-33)/32;$i++){
> >>> $fa = array();
> >>> $fname = trim(fread($h,11));
> >>> $fa["type"] = fread($h,1);
> >>> fread($h,4);
> >>> $fa =
> >>> array_merge($fa,unpack("Clen/Cpre",fread($h,2)));
> >>> fread($h,14);
> >>> $flds[$fname] = $fa;
> >>> }
> >>> fclose($h);
> >>> return $flds;
> >>> }
> >>>
> >>> When I generate a result table I'll go through the array like this:
> >>> ($so is
> >>> the shape Object)
> >>>
> >>> foreach($flds as $fname => $fA){
> >>> $val = $so->values[$fname];
> >>> if ($val==null)$val=" ";
> >>> $val = str_replace(" ","
> >>> ",$val);
> >>> if ($fA["type"]=="D"){$val =
> >>> substr($val,4,2)."-".substr($val,6,2)."-".substr($val,0,4);}
> >>> echo "<td>$val</td>";}
> >>> }
> >>>
> >>>
> >>> Cheers to all,
> >>>
> >>> Adam
> >>>
> >>>> -----Original Message-----
> >>>> From: Abe Gillespie [mailto:agillesp at VT.EDU]
> >>>> Sent: Monday, December 06, 2004 5:14 PM
> >>>> To: MAPSERVER-USERS at LISTS.UMN.EDU
> >>>> Subject: Re: [UMN_MAPSERVER-USERS] Shapefile field problem
> >>>>
> >>>>
> >>>> It's a regular shapefile. I think I've mostly narrowed it
> >>>> down. It seems to me (though I may be completely off) that
> >>>> MapServer loads the first record of the DBF in order to get
> >>>> the field definitions. If the first record has a string
> >>>> field and the value is zero length it won't give me the field
> >>>> (though the field count is always correct). In addition, it
> >>>> won't give me any fields after that either. If, however, I
> >>>> make sure that field has some value (a dash, an "x",
> >>>> whatever) then the field definition will come in correctly.
> >>>> I still haven't narrowed down a problematic number field
> >>>> though. Mind you, this is all done in MapServer PHP v. 4.2.0.
> >>>>
> >>>> -Abe
> >>>>
> >>>> On Dec 6, 2004, at 6:15 PM, Daniel Morissette wrote:
> >>>>
> >>>>> Abe Gillespie wrote:
> >>>>>
> >>>>>> A good amount of fields aren't showing up in MapServer for
> >>>>
> >>>> me. I use
> >>>>
> >>>>>> the following PHP script to dump out all layers and their
> >>>>
> >>>> fields for
> >>>>
> >>>>>> debugging. Does MapServer have problems with certain data
> >>>>
> >>>> types or
> >>>>
> >>>>>> certain values in a row?
> >>>>>>
> >>>>>
> >>>>> Are you using a tiled shapefile layer or is this a regular
> >>>>
> >>>> shapefile
> >>>>
> >>>>> layer?
> >>>>>
> >>>>> --
> >>>>> ------------------------------------------------------------
> >>>>> Daniel Morissette dmorissette at dmsolutions.ca
> >>>>> DM Solutions Group http://www.dmsolutions.ca/
> >>>>> ------------------------------------------------------------
> >>>>>
> >>>>
> >>>
> >
> >
> > --
> > Jeff McKenna
> > GIS Specialist
> > DM Solutions Group Inc.
> > http://www.dmsolutions.ca
> >
--
\\://
(o -) Dipl.-Geogr. Nicol Hermann
-------ooO-(_)-Ooo-----------------------------------------------
Chattenstraße 67
.oooO 55130 Mainz
( ) Oooo. Tel. 06131/6007550
---\ (----( )---------------------------------------------------
\_) ) / http://www.nicol.info
(_/ E-Mail: nicol at nicol.info
WWW-Tip!
--------
Geographisches Informationssystem
http://www.geoworld.de/
More information about the MapServer-users
mailing list