<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<META content="MSHTML 6.00.5730.11" name=GENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=#ffffff>
<DIV><FONT size=2>Ah right, mapserver, not postgres/postgis, I was 
confused.</FONT></DIV>
<DIV><FONT size=2>Thanks Dirk</FONT></DIV>
<DIV><FONT size=2></FONT>&nbsp;</DIV>
<DIV><FONT size=2>Regards</FONT></DIV>
<DIV><FONT size=2>Oliver</FONT></DIV>
<BLOCKQUOTE 
style="PADDING-RIGHT: 0px; PADDING-LEFT: 5px; MARGIN-LEFT: 5px; BORDER-LEFT: #000000 2px solid; MARGIN-RIGHT: 0px">
  <DIV><STRONG><FONT style="BACKGROUND-COLOR: #e4e4e4" 
  size=2></FONT></STRONG><BR></DIV>Hi,<BR><BR>sounds like the same problem I 
  had. If it is the same, it is a bug in <BR>mapserver version 4.10 and possibly 
  some 4.8. Have a look at the <BR>attached ServerMapquery.php. I added some 
  quotes in line 179 which <BR>solved the problem. Try changing your 
  <BR>coreplugins\mapquery\server\ServerMapquery.php.<BR><BR><BR>Regards,<BR>Dirk<BR><BR><BR><BR>WochteR 
  wrote:<BR>&gt; Hi,<BR>&gt; I have troubles with recentering an object.<BR>&gt; 
  Plugin search works fine, but when I clicked on result I obtain this 
  issue:<BR>&gt;<BR>&gt; Failure<BR>&gt;<BR>&gt; Class : 
  SoapFaultWrapper<BR>&gt; Message : MapServer error: Error in msDrawMap(): 
  Failed to draw layer named 'zastavba'.<BR>&gt;<BR>&gt; Error in 
  prepare_database(): Error executing POSTGIS DECLARE (the actual query) 
  statement: 'DECLARE mycursor BINARY CURSOR FOR SELECT 
  vyznamnost::text,gid::text,asbinary(force_collection(force_2d(the_geom)),'NDR'),gid::text 
  from kzarovce_zastavba WHERE (gid = 'gid IN (620)') and (the_geom &amp;&amp; 
  setSRID( 'BOX3D(-469330.214285714 -1273120,-464958.785714286 
  -1270060)'::BOX3D,find_srid('','kzarovce_zastavba','the_geom') ))' 
  <BR>&gt;<BR>&gt; Postgresql reports the error as 'ERROR:&nbsp; invalid input 
  syntax for integer: "gid IN (620)"<BR>&gt; '<BR>&gt;<BR>&gt; More 
  Help:<BR>&gt;<BR>&gt; Error with POSTGIS data variable. You specified 
  '&lt;check your .map file&gt;'.<BR>&gt; Standard ways of specifiying are : 
  <BR>&gt; (1) 'geometry_column from geometry_table' <BR>&gt; (2) 
  'geometry_column from (&lt;sub query&gt;) as foo using unique &lt;column 
  name&gt; using SRID=&lt;srid#&gt;' <BR>&gt; Make sure you put in the 'using 
  unique&nbsp; &lt;column name&gt;' and 'using SRID=#' clauses in.<BR>&gt; 
  --------------------------<BR>&gt;<BR>&gt; It is very mysterious, because on 
  my laptop it works good.<BR>&gt; This issue is displayed from server where I 
  moved working cartoweb project.<BR>&gt; Need I change anything in php.ini or 
  something else?<BR>&gt; I don't know what to do...<BR>&gt;<BR>&gt; Thanx for 
  advice<BR>&gt;<BR>&gt; wochter<BR>&gt; 
  _______________________________________________<BR>&gt; Cartoweb-users mailing 
  list<BR>&gt; Cartoweb-users@lists.maptools.org<BR>&gt; 
  http://lists.maptools.org/mailman/listinfo/cartoweb-users<BR>&gt;<BR>&gt;&nbsp;&nbsp; 
  <BR>
  <P>
  <HR>

  <P></P><?php
/**
 * Query service plugin
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 *
 * @copyright 2005 Camptocamp SA
 * @package CorePlugins
 * @author Sylvain Pasche <sylvain.pasche@camptocamp.com>* @version $Id: 
  ServerMapquery.php,v 1.33 2007-03-15 15:26:48 asaunier Exp $ */ /** * A 
  service plugin to perform queries based on a set of selected id's * @package 
  CorePlugins * @author Sylvain Pasche <SYLVAIN.PASCHE@CAMPTOCAMP.COM>*/ class 
  ServerMapquery extends ServerPlugin { /** * @var Logger */ private $log; /** * 
  Constructor */ public function __construct() { parent::__construct(); 
  $this-&gt;log =&amp; LoggerManager::getLogger(__CLASS__); } /** * Returns an 
  array of query strings (for use in queryByAttributes), from * a set of id's 
  and an attribute name. This query string can be used * in most case for 
  layers. * @param string * @param string * @param array * @return array */ 
  protected function genericQueryString($idAttribute, $idType, $selectedIds) { 
  // FIXME: does queryByAttributes support multiple id's for dbf ? $queryString 
  = array(); foreach($selectedIds as $id) { if ($idType == 'string') 
  $queryString[] = "'[$idAttribute]' = '$id'"; else $queryString[] = 
  "[$idAttribute] = $id"; } return array('(' . implode(' OR ', $queryString) . 
  ')'); } /** * Returns an array of query strings (for use in 
  queryByAttributes), from * a set of id's and an attribute name. This query 
  string is to be used * on database kind of layers. * @param string * @param 
  string * @param array * @return array */ protected function 
  databaseQueryString($idAttribute, $idType, $selectedIds) { if 
  (count($selectedIds) == 0) { return array('false'); } if ($idType == 'string') 
  { $queryString = "'"; $queryString .= implode("', '", $selectedIds); 
  $queryString .= "'"; } else { $queryString = implode(', ', $selectedIds); } 
  return array("$idAttribute IN ($queryString)"); } /** * Returns true if layer 
  is linked to a database * @param msLayer * @return boolean */ protected 
  function isDatabaseLayer($msLayer) { switch ($msLayer-&gt;connectiontype) { 
  case MS_POSTGIS: case MS_ORACLESPATIAL: return true; } return false; } /** * 
  Extracts all shapes in the given msLayer, and returns them in an array * 
  @param msLayer the layer from which to retrieve shapes * @return array the 
  array of result shapes in the given layer */ protected function 
  extractResults($layerId, $mayIgnore) { $msMapObj = 
  $this-&gt;serverContext-&gt;getMapObj(); $layersInit = 
  $this-&gt;serverContext-&gt;getMapInfo()-&gt;layersInit; $msLayer = 
  $layersInit-&gt;getMsLayerById($msMapObj, $layerId); $msLayer-&gt;open(); 
  $results = array(); $numResults = $msLayer-&gt;getNumResults(); 
  $ignoreQueryThreshold = $this-&gt;getConfig()-&gt;ignoreQueryThreshold; if 
  ($mayIgnore &amp;&amp; is_numeric($ignoreQueryThreshold) &amp;&amp; 
  $numResults &gt; $ignoreQueryThreshold) { 
  $this-&gt;getServerContext()-&gt;addMessage($this, 'queryIgnored', 
  sprintf(I18nNoop::gt( "Query spanned too many objects on layer '%s', it was 
  ignored."), $layersInit-&gt;getLayerById($layerId)-&gt;label)); return 
  array(); } $maxResults = $this-&gt;getConfig()-&gt;maxResults; if 
  (is_numeric($maxResults) &amp;&amp; $numResults &gt; $maxResults) { 
  $this-&gt;getServerContext()-&gt;addMessage($this, 'maxResultsHit', 
  sprintf(I18nNoop::gt( "This query hit the maximum number of results on '%s', 
  truncating results."), $layersInit-&gt;getLayerById($layerId)-&gt;label)); 
  $numResults = $maxResults; } for ($i = 0; $i &lt; $numResults; $i++) { $result 
  = $msLayer-&gt;getResult($i); $shape = 
  $msLayer-&gt;getShape($result-&gt;tileindex, $result-&gt;shapeindex); 
  $results[] = $shape; } $msLayer-&gt;close(); return $results; } /** * Performs 
  a query on a layer using attributes * @param ServerContext Server context * 
  @param msLayer Layer to query * @param string The attribute name used by the 
  query * @param string The query string to perform * @param boolean If true, a 
  failure in the query is not fatal (empy array * returned) * @return array an 
  array of shapes */ protected function queryLayerByAttributes(ServerContext 
  $serverContext, $layerId, $idAttribute, $query, $mayFail = false) { $log 
  =&amp; LoggerManager::getLogger(__METHOD__); $msMapObj = 
  $this-&gt;serverContext-&gt;getMapObj(); $layersInit = 
  $this-&gt;serverContext-&gt;getMapInfo()-&gt;layersInit; $msLayer = 
  $layersInit-&gt;getMsLayerById($msMapObj, $layerId); // Saves extent and sets 
  it to max extent. $savedExtent = clone($msMapObj-&gt;extent); $maxExtent = 
  $serverContext-&gt;getMaxExtent(); 
  $msMapObj-&gt;setExtent($maxExtent-&gt;minx, $maxExtent-&gt;miny, 
  $maxExtent-&gt;maxx, $maxExtent-&gt;maxy); 
  $log-&gt;debug("queryLayerByAttributes layer: $msLayer-&gt;name " . 
  "idAttribute: $idAttribute query: $query"); // Layer has to be activated for 
  query. $msLayer-&gt;set('status', MS_ON); $ret = 
  @$msLayer-&gt;queryByAttributes($idAttribute, '"'.$query.'"', MS_MULTIPLE); 
  $this-&gt;log-&gt;debug('Query on layer ' . $msLayer-&gt;name . ": 
  queryByAttributes($idAttribute, $query)"); if ($ret == MS_FAILURE) { if 
  ($mayFail) { $serverContext-&gt;resetMsErrors(); return array(); } throw new 
  CartoserverException('Attribute query returned no ' . "results. Layer: 
  $msLayer-&gt;name, idAttribute: " . "$idAttribute, query: $query"); } 
  $serverContext-&gt;checkMsErrors(); // restore extent 
  $msMapObj-&gt;setExtent($savedExtent-&gt;minx, $savedExtent-&gt;miny, 
  $savedExtent-&gt;maxx, $savedExtent-&gt;maxy); return 
  $this-&gt;extractResults($layerId, false); } /** * Checks if layer's 
  connection type is implemented * @param msLayer */ protected function 
  checkImplementedConnectionTypes($msLayer) { $implementedConnectionTypes = 
  array(MS_SHAPEFILE, MS_TILED_SHAPEFILE, MS_OGR, MS_POSTGIS, MS_ORACLESPATIAL); 
  if (in_array($msLayer-&gt;connectiontype, $implementedConnectionTypes)) 
  return; throw new CartoserverException('Layer to center on has an unsupported 
  ' . "connection type: $msLayer-&gt;connectiontype"); } /** * Performs a query 
  based on a set of selected id's on a given layer * @param IdSelection The 
  selection to use for the query. It contains a * layer name and a set of id's * 
  @param boolean If true, a failure in the query is not fatal (empy array * 
  returned) * @return array an array of shapes */ public function 
  queryByIdSelection(IdSelection $idSelection, $mayFail = false) { 
  $serverContext = $this-&gt;getServerContext(); $layersInit = 
  $serverContext-&gt;getMapInfo()-&gt;layersInit; $msLayer = 
  $layersInit-&gt;getMsLayerById($serverContext-&gt;getMapObj(), 
  $idSelection-&gt;layerId); $idAttribute = $idSelection-&gt;idAttribute; if 
  (is_null($idAttribute)) { $idAttribute = 
  $serverContext-&gt;getIdAttribute($idSelection-&gt;layerId); } if 
  (is_null($idAttribute)) { throw new CartoserverException("can't find 
  idAttribute for layer " . $idSelection-&gt;layerId); } $idType = 
  $idSelection-&gt;idType; if (is_null($idType)) { $idType = 
  $serverContext-&gt;getIdAttributeType($idSelection-&gt;layerId); } 
  self::checkImplementedConnectionTypes($msLayer); $ids = 
  Encoder::decode($idSelection-&gt;selectedIds, 'config'); // FIXME: can 
  shapefiles support queryString for multiple id's ? // if yes, then improve 
  this handling. if (self::isDatabaseLayer($msLayer)) $queryString = 
  self::databaseQueryString($idAttribute, $idType, $ids); else $queryString = 
  self::genericQueryString($idAttribute, $idType, $ids); $results = array(); 
  foreach($queryString as $query) { $new_results = 
  self::queryLayerByAttributes($serverContext, $idSelection-&gt;layerId, 
  $idAttribute, $query, $mayFail); $results = array_merge($results, 
  $new_results); } return $results; } /** * Performs a query based on a {@link 
  Shape} object on a given layer. * @param string layerId * @param Shape 
  geographic selection * @return array an array of shapes */ public function 
  queryByShape($layerId, Shape $shape) { $msMapObj = 
  $this-&gt;serverContext-&gt;getMapObj(); $layersInit = 
  $this-&gt;serverContext-&gt;getMapInfo()-&gt;layersInit; $msLayer = 
  $layersInit-&gt;getMsLayerById($msMapObj, $layerId); // layer has to be 
  activated for query $msLayer-&gt;set('status', MS_ON); if ($shape instanceof 
  Point) { $msPoint = ms_newPointObj(); $msPoint-&gt;setXY($shape-&gt;x, 
  $shape-&gt;y); // no tolerance set by default, must be set in mapfile $ret = 
  @$msLayer-&gt;queryByPoint($msPoint, MS_MULTIPLE, -1); 
  $this-&gt;log-&gt;debug("Query on layer $layerId: " . "queryByPoint(msPoint, 
  MS_MULTIPLE, -1)"); } elseif ($shape instanceof Bbox || $shape instanceOf 
  Rectangle) { $msRect = ms_newRectObj(); $msRect-&gt;setextent($shape-&gt;minx, 
  $shape-&gt;miny, $shape-&gt;maxx, $shape-&gt;maxy); $ret = 
  @$msLayer-&gt;queryByRect($msRect); $this-&gt;log-&gt;debug("Query on layer 
  $layerId: queryByRect(msRect)"); } elseif ($shape instanceof Polygon) { 
  $msShape = ms_newShapeObj(MS_SHAPE_POLYGON); $msLine = ms_newLineObj(); 
  foreach ($shape-&gt;points as $point) { $msLine-&gt;addXY($point-&gt;x, 
  $point-&gt;y); } $msShape-&gt;add($msLine); $ret = 
  @$msLayer-&gt;queryByShape($msShape); $this-&gt;log-&gt;debug("Query on layer 
  $layerId: queryByShape(msShape)"); } elseif ($shape instanceof Circle) { 
  //force mapscipt to consider radius units as geographic if 
  ($msLayer-&gt;toleranceunits == MS_PIXELS) $msLayer-&gt;toleranceunits = 
  $msMapObj-&gt;units; $msPoint = ms_newPointObj(); 
  $msPoint-&gt;setXY($shape-&gt;x, $shape-&gt;y); $ret = 
  @$msLayer-&gt;queryByPoint($msPoint, MS_MULTIPLE, $shape-&gt;radius); 
  $this-&gt;log-&gt;debug("Query on layer $layerId: queryByPoint(" . "msPoint, 
  MS_MULTIPLE, $shape-&gt;radius)"); } else { 
  $this-&gt;CartoserverException(sprintf("Query can't be done on %s " . 'type 
  selection', get_class($shape))); } 
  $this-&gt;serverContext-&gt;resetMsErrors(); if ($ret != MS_SUCCESS || 
  $msLayer-&gt;getNumResults() == 0) return array(); return 
  $this-&gt;extractResults($layerId, true); } /** * Performs a query based on a 
  bbox on a given layer * DEPRECATED: this method should no more be used. * Use 
  {@link ServerMapquery::queryByShape()} instead * @param string layerId * 
  @param Bbox * @return array an array of shapes */ public function 
  queryByBbox($layerId, Bbox $bbox) { return $this-&gt;queryByShape($layerId, 
  $bbox); } } ?&gt; 
  <P>
  <HR>

  <P></P>_______________________________________________<BR>Cartoweb-users 
  mailing 
  list<BR>Cartoweb-users@lists.maptools.org<BR>http://lists.maptools.org/mailman/listinfo/cartoweb-users<BR></BLOCKQUOTE></BODY></HTML>