MapTools.org

[maplab-users] maplab/mapserver/PHP-mapscript function to search a object

Paul Spencer pgs@magma.ca
Mon, 07 Oct 2002 21:58:32 -0400
Andreas,

cool app :)  I think I can help point you in the right direction.  My 
appologies if there is too much detail here and you have already figured 
some/all of this out.  I am hoping to also help others who may not have 
tried to customize their gmapfactory application.

Let's assume that your application is called MyApp and is in a directory 
called MyApp under maplab-2.0rc3/projects/gmf_apps/MyApp/.

The main user interface file is called MyApp_contents.php.  You will add 
your new input box to this file in the appropriate location.  It should 
be easy to determine where to put it, there are comments ;)

The next file of interest is called MyApp.php.  This is the main file 
that does all the work for navigation among other things.  In here are a 
series of if() statements that check for various modes of navigation 
that the user could have performed.  You will add an if() here something 
like:

if ( $http_form_vars["parcel-number"] )
{
	// the parcel number to query for
	$szParcelNumber = $http_form_vars["parcel-number"];

	// the current extents will be the default if we fail.
	$oExtents = $oMapSession->oMap->extents;

	//first we need a handle on the layer, let's assume that we have
	//it's name
	$oParcelLayer = $oMapSession->oMap->getLayerByName( "Parcels" );

	// set up the layer for a query in ms 3.6 - in 3.7 we don't need
	// to do this, we can just use querybyattribute.  Here we assume
	// that the data file associated with the layer has an attribute
	// called parcel_number that we are querying.
	$oParcelLayer->set( "FILTERITEM", "parcel_number" );
	$oParcelLayer->setFilter( $szParcelNumber );
	
	// use querybyattribute to generate the result, assume a single
	// one for simplicity but this can be extended to multiple
	// results easily
	$oParcelLayer->queryByAttribute( MS_SINGLE );

	//now check to see if there are any results?
	if ($oParcelLayer->getNumResults() > 0 )
	{
		//at least one result, assume only one for this example
		$oResult = $oParcelLayer->getResult( 0 );
		//oResult is a resultCacheMemberObj
		$oShape = $oParcelLayer->getShape( $oResult->tileindex,
						   $oResult->shapeid );
		$oExtents = $oShape->bounds;
		$oShape->free();

		//at this point we might add a buffer to the extents
		$nXBuffer = ( $oExtents->maxx - $oExtents->minx )*0.05;
		$nYBuffer = ( $oExtents->maxy - $oExtents->miny )*0.05;
		$nMinX = $oExtents->minx - $nXBuffer;
		$nMaxX = $oExtents->maxx + $nXBuffer;
		$nMinY = $oExtents->miny - $nYBuffer;
		$nMaxY = $oExtents->maxy + $nYBuffer;
		$oExtents->setExtents( $nMinX, $nMinY, $nMaxX, $nMaxY );
	}

	// now use $oMapNavigator to navigate to the parcel
	// location.  There are two useful options now.  We
	// can zoom to a rectangle which we have calculated or
	// to a point and scale.  Let's assume we have calculated
	// a rectangle and put a buffer around it if necessary.
	$oMapNavigator->zoomRectangle($oExtents->minx, $oExtents->miny,
				      $oExtents->maxx, $oExtents->maxy);

	// alternately if it's a point and a scale ...
	// $oMapNavigator->zoomScale( $nScale, $nX, $nY );
}

The $oMapSession and $oMapNavigator are MapScript wrapper objects that 
we created to make working with a map object simpler for us, they can be 
found in the wrapper directory of your app.  The documentation for 
MapScript itself can be found at:

http://www2.dmsolutions.ca/mapserver/php_mapscript/php_mapscript_docs36.html.

Daniel has also mentioned that you should get the old GMap demo and look 
for GMapDumpQueryResults() for some related ideas to working with 
queries.  You should find it at 
http://www2.dmsolutions.ca/mapserver/dl/gmap-ms36.zip

For questions like this, you may get faster response by posting to the 
mapserver-users mailing list, its very active and responsive ;)

Cheers,

Paul


Andreas Berweger BHA AG wrote:
> Hello together
> 
> For first excuse my english. i'm from switzerland and im speaking a bad
> english but well german.
> im working on a project for little communes and there internet-maping.
> 
> - i'm using maplab v2.0-rc3, mapserver 3.6.2 with OGR support and PHP 4.2.2
> on windows
> - my data commes from mapinfo Ver 6.0 and im using the tab files with OGR
> 
> first i have to say that maplab and mapserver are working very fine on my
> system. maplab is easy to use and understand. The application i've made is
> temporaly browsable at
> 
> http://193.246.110.38/mappub/GIS/BHA_apps/GIS_warth-weiningen/GIS_warth-wein
> ingen.phtml
> 
> now my question:
> 
> I have to made a textbox at the bottom of the legend. The user could input a
> parcell-number and klick on search. now (i hope it would be possible)
> mapserver/maplab had to search for this parcell in the Layer
> "Liegenschaften"(=parcells in german) and zoom on it. Thats all :)
> "liegenschaften" is a polygon layer with the attributes parcell-number and
> area from mapinfo/OGR. You see im not so familar with PHP and mapscript.
> 
> I hope you could help me an give me some hints. when i have forgotten
> something or you need data to help me i could give you ...
> 
> Thanks a lot and good night
> 
> 
> 
> 
> _______________________________________________
> Maplab-users mailing list
> Maplab-users@dmsolutions.ca
> http://lists.dmsolutions.ca/mailman/listinfo/maplab-users
> 


-- 
Paul Spencer
Applications and Software Development
DM Solutions Group




This archive was generated by Pipermail.