Shapefile field problem
Abe Gillespie
agillesp at VT.EDU
Tue Dec 7 13:17:10 PST 2004
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
>
More information about the MapServer-users
mailing list