MapTools.org

[Chameleon] Item Query

Paul Spencer spencer@dmsolutions.ca
Thu, 29 Jan 2004 13:33:51 -0500
Rene, from the PHP mapscript documentation:

shapefileObj ms_newShapefileObj(string filename, int type)
         Opens a shapefile and returns a new object to deal with it.
         Filename should be passed with no extension.
         To create a new file (or overwrite an existing one), type should
         be one of MS_SHP_POINT, MS_SHP_ARC, MS_SHP_POLYGON or
         MS_SHP_MULTIPOINT.
         Pass type as -1 to open an existing file for read-only access,
   and type=-2 to open an existing file for update (append).

passing MS_SHP_POLYGON is causing the problem (sorry, I didn't refresh 
my memory when I wrote it), pass -1 instead of MS_SHP_POLYGON

Cheers,

Paul

Rene Teniere wrote:

> Hi Paul,
> 
> The code is very logical and makes sense, it will cycle through the
> database and make the match, however, I think there is something wrong
> with having ms_newShapeFileObj(), It is overwriting my original
> shapefile with a new one, because there are no shapes in it. The
> numshapes count is 0. Should I be using getShape() instead??
> 
> Here is the PHP code:
> 
> Rene
> 
>         $szPMS = "";
>         if (isset($this->moURLArray["PMS"]))
>             $szPMS = $this->moURLArray["PMS"];
> 
>         if ($szPMS > 0 && is_numeric($szPMS))
>         {
>             $hDB = dbase_open('d:/gis_data/juan/juan_indx.dbf',0);
>             $nRecs = dbase_numrecords($hDB);
> 
>             error_log("Number of Records: ".$nRecs);
> 
>             $nIndex = -1; //-1 means not found
>             for ($i=0; $i<=$nRecs; $i++)
>             {
>               $aRec = dbase_get_record_with_names($hDB,$i);
>               $aResult = $aRec['MAPSHEET'];
> 
>               error_log("Search criteria: ".$szPMS);
>               error_log("Line ".$i." of text from the Database:
> ".$aResult);
> 
>               if (strcasecmp($aResult,$szPMS) == 0)
>               {
>                 //Found a match
>                 $nIndex = $i;
>                 error_log("Match Found, Index: ".$nIndex);
>                 break;
>               }
>             }
>             dbase_close($hDB);
>             if($nIndex>=0)
>             {
>               //Open the shapefile
>               $oShapeFile =
> ms_newShapeFileObj('d:/gis_data/juan/juan_indx.shp',MS_SHP_POLYGON);
>               $nShapes = $oShapeFile->numshapes;
>               Error_Log("Number of shapes: ".$nShapes);
>               if($nShapes < $nIndex)
>               {
>                 //Not enough shapes
>                 Error_Log("Not Enough Shapes in ".$oShapeFile);
>               }
>               else
>               {
>                 $oRect=$oShapeFile->getExtent($nIndex);
>                 $myMinX = $oRect->minx;
>                 $myMinY = $oRect->miny;
>                 $myMaxX = $oRect->maxx;
>                 $myMaxY = $oRect->maxy;
>                 Error_Log("Min X: ".$myMinX);
>                 Error_Log("Min Y: ".$myMinY);
>                 Error_Log("Max X: ".$myMaxX);
>                 Error_Log("Max Y: ".$myMaxY);
>                 $oMap->setExtent($myMinX,$myMinY,$myMaxX,$myMaxY);
>               }
>             }
>             else
>             {
>               //Report no records
>             }
>             $oShapeFile->free();
>         }
> 
> 
> 
>>>>pagameba@magma.ca 2004-01-27 11:37:07 PM >>>
> 
> Rene, it is indeed possible but I am not entirely sure that I
> understand 
> exactly what you are trying to accomplish and what your inputs are. 
> Let 
> me try to outline what I think you are trying to do and how to solve
> the 
> issue:
> 
> Requirements:
> 
> * you have a shapefile consisting of polygons that define the extents
> of 
> provincial map sheets
> * you want the user to be able to enter a mapsheet number and be zoomed
> 
> to that mapsheet's extents
> 
> Unknowns:
> 
> * is the shapefile included in your application?  Assume no.
> 
> Approach:
> 
> * using a copy of the LocateWidget with all inputs removed except NTS 
> MapSheet, and added a Provincial Map Sheet
> 
> You need to locate the code that decides what the user wants to lookup,
> 
> and supply some code to do your lookup.  This is some code that looks 
> roughly right, but I haven't tested it and I don't guarantee that it is
> 
> without typos or erroneous function names, but I think you will get the
> 
> idea.
> <?php
> dl( 'php_dbf.dll' );
> $hDB = dbase_open( 'path-to-shapefile.dbf' );
> $nRecs = dbase_numrecords( $hDB );
> $nIndex = -1; //-1 means not found
> for ($i=0; $i<$nRecs; $i++)
> {
>    $aRec = dbase_get_record_with_names( $hDB, $i );
>    if (strcasecmp( $aRec['fieldname'], $szUserInput ) == 0)
>    {
>      //found a match
>      $nIndex = $i;
>      break;
>    }
> }
> dbase_close( $hDB );
> 
> if ($nIndex >= 0)
> {
>    //open shapefile using mapscript
>    $oShapeFile = ms_newShapeFileObj( 'path-to-shapefile.shp', 
> MS_SHP_POLYGON );
>    if ($oShapeFile->numshapes < $nIndex )
>    {
>      //oops, not enough shapes, error
>    }
>    else
>    {
>      //get the bounding box of the shape in a RectObj
>      $oRect = $oShape->getExtent( $nIndex );
>      $oMap->setextent( $oRect->minx, $oRect->miny, $oRect->maxx, 
> $oRect->maxy );
>    }
> }
> else
> {
>    //report no records
> }
> $oShapeFile->free();
> ?>
> 
> Rene Teniere wrote:
> 
> 
>>Hi Paul,
>>
>>That's very similar to what I started off with (only I used the
>>LocateWidget and got rid of all the inputs except NTS Map Sheet, and
>>added my own - Provincial Map Sheet). The problem comes in that there
> 
> is
> 
>>a polygon index covering the whole province containing cells
>>representing specific mapsheets. I have to be able to get chameleon
> 
> to
> 
>>find the mapsheet number within the index shapefile (the MAPSHEET
> 
> item
> 
>>in the index's table) using the user inputted text (essentially an
> 
> item
> 
>>query), then once I have the map object's extents returned, I would
> 
> use
> 
>>the setextent object to see it. Is this at all possible? If I
>>misunderstood you, I apologize, however, I don't think I exactly
>>explained the situation properly.
>>
>>Thanks,
>>
>>Rene
>>
>>
>>
>>
>>
>>>>>pagameba@magma.ca 2004-01-27 2:36:20 PM >>>
>>
>>Rene,
>>
>>to do this in Chameleon, you create a new widget from one of the 
>>existing ones that does something similar.  For instance, the Scale 
>>widget does something similar (it uses an input box to allow the
> 
> user
> 
>>to 
>>type in a new scale value and then zooms to that scale.  You would
> 
> make
> 
>>a copy of this widget and rename stuff appropriately.
>>
>>Your main work would go in the ParseURL function which is where you
>>will 
>>get the FORM variables that were submitted (Scale is a good example
> 
> of
> 
>>this) and do something with them.  In your case, you would use the
>>input 
>>value to lookup the bounding box of a Map sheet and then apply those
> 
> 
>>extents to the map object using something like 
>>$this->moMapSession->oMap->setextent( $nMinX, $nMinY, $nMaxX, $nMaxY
>>);
>>
>>That's pretty much it.  Note that the Scale widget is just a
> 
> container
> 
>>for the value, you use an UpdateMap widget to actually submit the
>>page.
>>
>>Cheers,
>>
>>Paul
>>
>>Rene Teniere wrote:
>>
>>
>>
>>>Hi All,
>>>
>>>Been sitting down here with the office MapServer programmer, looking
>>
>>to
>>
>>
>>>create an Item Query. This goes back to the message I left yesterday
>>
>>on
>>
>>
>>>having an input box for the user to input a mapsheet number and
>>
>>return
>>
>>
>>>the result on the map display. In MapServer, you would just set the
>>>variables and send them to MapServer for processing. The question is
>>
>>how
>>
>>
>>>is this achieved through Chameleon? In fact, how does it talk to
>>>mapserver? All we need to do is be able to figure out what variables
>>
>>to
>>
>>
>>>set, and where to send them.
>>>
>>>Example: In the bounding box widget, you set the user-defined
>>
>>bounding
>>
>>
>>>coordinates to the variables and them pass them
>>>on:window.opener.applyBoundingBox( nMinX, nMinY, nMaxX, nMaxY ); 
>>>
>>>Is there anything that can help me out on figuring this stuff out?
>>
>>What
>>
>>
>>>about the utils in htdocs_admin?
>>>
>>>Any help would be greatly appreciated
>>>Rene
>>>
>>>Rene J.R. Teniere - BSc., D.GIS
>>>GIS Technician
>>>Nova Scotia Department of Natural Resources
>>>Forestry Division (GIS) - Truro
>>>
>>>Phone: (902) 893-5655
>>>Mobile: (902) 209-8956
>>>_______________________________________________
>>>Chameleon mailing list
>>>Chameleon@lists.maptools.org 
>>>http://lists.maptools.org/mailman/listinfo/chameleon 
>>>
>>
>>
> 

-- 
  -----------------------------------------------------------------
|Paul Spencer                           spencer@dmsolutions.ca    |
|-----------------------------------------------------------------|
|Applications & Software Development                              |
|DM Solutions Group Inc                 http://www.dmsolutions.ca/|
  -----------------------------------------------------------------



This archive was generated by Pipermail.