Shapefile field problem
Abe Gillespie
agillesp at VT.EDU
Tue Dec 7 14:52:41 PST 2004
Dang it, dang it. You're right, I forgot the darned template tag.
That gets me a lot. Well geez, I swear I've had worse problems with
this. Just can't seem to get it right now. Maybe I'll come across
something more concrete as I continue on this project.
Anyways, would the way you iterate through the fields be considered a
"work around." I.e.: should the fields of the values array be able to
be iterated via either method?
Thanks for all the help.
-Abe
On Dec 7, 2004, at 5:29 PM, Nicol Hermann wrote:
> Try adding a template tag to the layer section in your mapfile
> e.g.
> TEMPLATE "dummy.html"
>
> getNumResults() are now 1
>
> Nicol
>
> Am Di, den 07.12.2004 schrieb Abe Gillespie um 23:19:
>> Ok, you've proven to me you can *force* MapServer to give you the
>> names
>> of problem fields. But try this one (use the newly edited DBF file):
>>
>> <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);
>>
>> // Query test.
>> @$l->queryByAttributes("CITY", "/foo/",
>> MS_MULTIPLE);
>> putBrLine($l->getNumResults());
>>
>> 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);
>> }
>> */
>> foreach ($vals as $key => $val) {
>> printf ("%s -- %s<br>\n", $key,
>> $val);
>> }
>> $s->free();
>> $l->close();
>> }
>> }
>>
>> function putBrLine($line)
>> {
>> echo "$line<br>\n";
>> }
>> ?>
>> </body>
>> </html>
>>
>> For me I get 0 as the number of results but you can clearly see the
>> value getting dumped out. Barring I didn't screw up the query, this
>> is
>> a problem no?
>>
>> Thanks as always.
>> -Abe
>>
>>
>> ______________________________________________________________________
>> On Dec 7, 2004, at 4:30 PM, Nicol Hermann wrote:
>>
>>> 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