|
||||
[Chameleon] Item QueryPaul Spencer spencer@dmsolutions.caThu, 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. |
MapTools.org -- Hosted by DM Solutions Group |