[Geomoose-users] problems in searching with keyword in MapScript Model

xiaobao zang cnzang at gmail.com
Tue Jan 6 01:35:23 EST 2009


I want to change keywords searching from CGI Model to PHP/MapScript Model.
But I have some problems

something changed as follow:

petrochina_admin.xml:
        <service title="ËÑË÷¹ÜÏß" selectable="false" default="false"
locked="true" div="buildingsearch">
            <url>php/search.php</url>
            <input type="hidden" name="map"
value="/ms4w/apps/GeoMOOSE/petrochina/itemquery.map"/>
            <input type="hidden" name="mode" value="nquery"/>
            <input type="user" name="id" title="Zoom to building#:"/>
        </service>

petrochina.html:
<div id="CustomForms">
    <div id="Buildingsearch">
                    <font color="black"><b>ËÑË÷¹ÜÏߣº</b></font><br/>
                    <input name="id"/><input type="submit" value="²éѯ"/>
                    <input type="hidden" name="map"
value="/ms4w/apps/GeoMOOSE/petrochina/itemquery.map"/>
                    <input type="hidden" name="mode" value="nquery"/>
                    <br><i>ÊäÈë¹ÜÏßÃû³Æ<i/>
    </div>

<div id="WaitingMessage">
<b>ÇëÉÔºò...</b>
</div>

and new search.php:
<?php
#
# select.php (c) 2007 Dan "Ducky" Little
# Write for the GeoMOOSE project, sponsored by the OpenMNND Organization
# PHP Translation of the Perl script select.pl
#

# Make the PHP Script Shut Up, but still give something useful if there
# is a legit error or parsing bug.
error_reporting(E_ERROR | E_PARSE);

# Include the GeoMOOSE PHP Library Utilities
# Get in the information from the request
$coordinates = $_REQUEST['coords'];
$title = $_REQUEST['title'];
$shapeType = $_REQUEST['shape'];
$buffer = $_REQUEST['buffer'];
$layer = $_REQUEST['layer'];
$output = $_REQUEST['output'];
$identifyMap = $_REQUEST['map'];
$selectMap = $_REQUEST['select'];
$string = $_REQUEST['qstring'];


# Check for some vitals
if(!isset($layer)) {
    appError('Layer value is not set or invalid: '.$layer);
}
if(!isset($output)) {
    $output = $DEFAULT_OUTPUT;
}

# Check the CGI for the layer/column Delimiter,
# If it's not found, then use the default.
$delim = $_REQUEST['delim'];
if(!isset($delim)) {
    $delim = $DEFAULT_DELIM;
}
# This splits the input layer sting into the Layer Name and the Column
Containing the ID's for the layer
list($layer, $queryColumn) = explode($delim, $layer);

# This checks for the existance of the select mapfile.
# If it does not exist the application quits with an error message.
if(!file_exists($selectMap)) {
    appError('Could not find: '.$selectMap);
}

# This checks to see what "shape" is being passed to the script to query
against.
if($shapeType == "point") {
    $shapeType = MS_SHAPE_POINT;
} elseif($shapeType == 'circle') {
} elseif($shapeType == 'line') {
    $shapeType = MS_SHAPE_LINE;
    if(empty($buffer)) {
        $buffer = 1;    # Makes the line work if there is no buffer
specified or the buffer = 0
    }
} else {
    $shapeType = MS_SHAPE_POLYGON;
}


# Convert the coordinates to a new shape object
# This takes the coordinates from the CGI and adds them to a Shape for
querying.
$shape = ms_newShapeObj($shapeType);
$coords = array();
$coords = explode(' ', $coordinates);
$line = ms_newLineObj();
foreach ($coords as $coord) {
    list($x, $y) = explode(',',$coord);
    $line->addXY($x,$y);
}
$shape->add($line);    # This adds the line with all the coordinates from
the CGI
#$shape->setBounds();    # This initalizes the shape.

# Buffer as desired.
if(isset($buffer)) {
    $shape = $shape->buffer($buffer);    # Mapscript using GEOS to bufffer
the shape
    if(!isset($shape)) {             # Check to make sure the function
returned a valid shape, if not, error.
        appError("Buffering Failed. Buffer size: $buffer. Verify mapscript
was linked with GEOS and that the buffer is a positive-real number.");
    }
}

# Create a new Coordinate string based on any potential buffering.
# This is needed because after the object has been buffered it will have a
new coordinate string.
# This information is passed back to the GeoMOOSE client so that it can set
the "mapshape" parameter
# which displays the layer highlighting.
$coordString = '';
for($line = 0; $line < $shape->{numlines}; $line++) {
    $lineObj = $shape->line($line);
    for($point = 0; $point < $lineObj->{numpoints}; $point++) {
        $pointObj = $lineObj->point($point);
        $coordString = $coordString.$pointObj->{x}.' '.$pointObj->{y}.' ';
    }
}

# Set up the query to perform the select, with the buffer and all!
# If the Map does not open correctly, error out.
$queryMap = ms_newMapObj($selectMap) or appError('Could not open mapfile:
'.$selectMap."\n".'Please verify the Map file is valid.');

# This section of code searches for the query layer.
# If a layer is not the query layer, it is turned off so that
errorneous/extraneous results are not
# also returned.  This also helps speed queries so that multiple large
datasets are not simultaneously queried.
$queryLayerFound = false;    # Set an error condition in case we do not find
the layer
for($l = 0; $l < $queryMap->{numlayers}; $l++) {
    $queryLayer = $queryMap->getLayer($l);
    $queryLayer->set('status', MS_OFF);        # Turn the layer off
    if($queryLayer->{name} == $layer) {        # If it's the layer we're
trying to search...
        $queryLayer->set('status',MS_ON);    # Turn it on!
        $queryLayerFound = true;        # "Unset" the Error Condition
    }
}

if(!$queryLayerFound) {    # If they layer is not found in the mapfile,
error out.
    appError("The Query Layer '$layer' could not be found in the mapfile
($selectMap).");
}
# Perform the Query.
//$qstring='´ó';
# select a Chinese char as example
$searchstring=iconv("gbk", "ISO-8859-13", $qstring);
# charset convert
$searchstring="/".$searchstring."/";
$searchstring="/".$qstring."/";

$queryMap= $queryMap->getLayerByName($layer);
$queryMap->set("status", MS_ON);

$queryResultCheck = $queryMap->queryByAttributes('Name', $searchstring,
MS_SINGLE);;
if($queryResultCheck == MS_FAILURE) {        # If the query fails, error
out.
    # Check to see if the Map has any pointers to an empty file
    $empty = $queryMap->web->empty;
    # If it's set then show that HTML instead. :D
    if(isset($empty) and $empty != '') {
        readfile($empty);
        exit(0);
    } else {
        appError('²éѯ·µ»Ø½á¹ûʧ°Ü!');
    }
}

# Cycle through the results of the query and build an array containing the
results.
$resultContents = array();
for($l = 0; $l < $queryMap->{numlayers}; $l++) {        # Cycle through the
layers
    $queryLayer = $queryMap->getLayer($l);        # Get they layer object
from the map.
    if($queryLayer->{name} == $layer) {            # Check to make sure it's
our layer of interest.
#        $queryResults = $queryLayer->getResults();    # Get the results
from the query.
        $queryColumns = array();                # Hash table to hold the
column names.

        $queryLayer->open();                # Open the layer for operation.

        # This loop deserves from definition.
        # What this look is doing is creating a assosciative array (hash
table) containing the shapefile
        # indexes of the column names
        # Example:
        #     A layer could contain the following columns: 0 - ID, 1 -
OWNER, 2 - CITY
        #     This loop would create an associative array that has the
indexes of {'ID','OWNER','CITY'} and the corresponding values {0,1,2}
        #     Ergo, $queryColumns{'OWNER'} will return 0
        for($item = 0; $item < $queryLayer->{numitems}; $item++) {
            $queryColumns{$queryLayer->getItem($item)} = $item;
        }

        if($queryLayer->getNumResults() > 0) {  # Check to make sure we have
SOME results
            #            for($result = 0; $result <
$queryResults->{numresults}; $result++) {    # Loop through the results
            for($result = 0; $result < $queryLayer->getNumResults();
$result++) {
                # Get the member of the result set
                $queryResult = $queryLayer->getResult($result);
                # Get the feature from that result.
                # I left getFeature in here, as getShape will be deprecated
for getFeature
                #$queryFeature =
$queryLayer->getFeature($queryResult->{shapeindex},
$queryResult->{tileindex});
                $queryFeature =
$queryLayer->getShape($queryResult->{tileindex},
$queryResult->{shapeindex});
                # Here's where the array from before becomes very handy.
The column *name* is passed
                # into the CGI, so we need to result the shapefile-column
index and the name,
                # which is query %queryColumns does! So now, we can just
pull the ID column from the object.
                $v = $queryFeature->{values}[$queryColumn];
                # And put that ID onto the stack of results...
                array_push($resultContents, $v);
            }
        } else {
            appError('Ñ¡¶¨Í¼²ãûÓÐÈκβéѯ½á¹û');
        }

        $queryLayer->close(); # Close the layer
    }
}

# Process the query template from the mapfile and return it to the user
# This way the results are displayed exactly as they are definied in the
mapfile.
$template = $queryMap->processQueryTemplate(array(), array());

if($output == 'xml') {
    header('Content-type: text/xml; charset=gbk');
    # Return the XML that tells GeoMOOSE what to do!
    #
    # By passing "mapbook fragments" back to GeoMOOSE we can change the
behavior and
    # definition of the maps being displayed.  $layer contains the mapbook
name of the
    # layer we were selecting-against.  The "<param.../>" line will set the
mapshape parameter for
    # the layer we selected against.
    print "<return>";
    printf("<map title='Highlight' default='true'>", $layer);
    printf("    <file>%s</file>", $identifyMap);
    $strippedLayer = preg_replace("/ /",'',$layer);
    printf("    <param name='layers' value='%s'/>", $strippedLayer);
    printf("    <param name='qlayer' value='%s'/>", $strippedLayer);
    printf("    <param name='mapshape' value='%s'/>", $coordString);

    # This takes the ID's from the results stack and puts it inside the
layer.
    foreach ($resultContents as $id) {
        #    print "\t\t<selected id='$id'/>\n";
        printf("    <selected id='%s'/>", $id);
    }

    print "\t</map>";

    # Print some header information.
    print '<results title="Select Results">';
    print '        <header><col value="Selected Objects:"/></header>';
    print "        <row><col value='".count($resultContents)."'/></row>";
    print '</results>';


    print $template;

    print "</return>";    # End the XML Page.
} elseif($output == 'html') {
    header('Content-type: text/html; charset=gbk');
    #gbk is charset sopport Chinese
    ## HTML OUTPUT
    # This is a HTML/XML trick that uses XML namespaces in order to embed a
GeoMOOSE
    # mapbook into a HTML document.
    print '<html xmlns:moose="http://geomoose.org/">';
    print "<head>\n";
    print "<moose:mapbook>\n";
    #    print "<moose:map title="'.$layer.'" default="true">\n";
    printf("<moose:map title='Highlight' default='true'>\n",$layer);
    printf("    <moose:file>%s</moose:file>", $identifyMap);
    $strippedLayer = preg_replace("/ /",'',$layer);
    printf("    <moose:param name='layers' value='%s'/>", $strippedLayer);
    printf("    <moose:param name='qlayer' value='%s'/>", $strippedLayer);
#    print "    <moose:param name='mapshape' value='".$coordString."'/>\n";
    printf ("<moose:param name='mapshape' value='%s'/>\n", $coordString);
    foreach ($resultContents as $id) {
        printf("    <moose:selected id='%s'/>\n", $id);
    }
    print "</moose:map>\n";
    print "</moose:mapbook>\n";
    print "</head>";
    print "<body>";
    print "<![CDATA[";
    print $template;
    print "]]>";
    print "</body>";
    print "</html>";
} else {
    appError('Unrecognized output option: '.$output);
}

exit; # End the Program!
?>


but it doesn't work,Someone can help me?
-- 
Leopard
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.osgeo.org/pipermail/geomoose-users/attachments/20090106/c558c120/attachment.html


More information about the Geomoose-users mailing list