OK, i found a workaround to the original problem:
I presently have a set up in which I plot some measurements on some
background maps. Things work fine, but I want to add the possibility
to query the measurement data set by clicking on a measurement. The
measurements have coordinates in lat lon and I only manage to query
those data if I plot the entire map in the same projection.
(the map should be in utm, I would prefer not having to reproject the
measurement locations)
I create a new map object with the layer to be queried, set the projection of
the new map object to the same as the queried layer and then I do a
queryByPoint on the new map object. This works to get find a object. To plot
the query map, I get a unique id for the selected point, do a queryByAttributes
on the corresponding layer in the drawn map.
--
Morten Sickel
Norwegian Radiation Protection Authority
=== php code == some parts removed
// I am querying a map layer called mobile
// I am using smarty templating for my php script, if you don't know that, just
consider the
// $smarty-assign calls as a way to get something printed out.
function pix2geo($mapx,$mapy,$minx,$miny,$maxx,$maxy,$sizex,$sizey)
// calculates geographical coordinates in the map from click coordinates on the
image
{
list($miny,$maxy)=array($maxy,$miny);
// swaps miny and max y since the coordinates acsends upwards in the
map, downwards in the picture
$geopoint=array();
foreach( array('x','y') as $dim){
$p=array();
foreach(array('map','min','max','size') as $par){
$name=$par$dim;
$p[$par]=$$name;
}
$geowidth=$p['max']-$p['min'];
$geopoint[$dim]=$p['map']/$p['size']*$geowidth+$p['min'];
}
return(array($geopoint['x'],$geopoint['y']));
}
$map=ms_newMapObj($map_path.'mobilweb.map');
$foundresults=false;
if($_GET['extent']){
list($minx,$miny,$maxx,$maxy)=explode( ,$_GET['extent']);
$map-setextent($minx,$miny,$maxx,$maxy);
}
$clickpoint=ms_newpointObj();
$clickpoint-setXY($_GET['MAP_x']*1,$_GET['MAP_y']*1);
if(!isset($_GET['update'])){
if($_GET['action']=='QUERY'){
list($geoX,$geoY)=pix2geo($_GET['MAP_x']*1,$_GET['MAP_y']*1,$minx,$miny,$maxx,$maxy,$map-width,$map-height);
$geopoint=ms_newpointObj();
$geopoint-setXY($geoX,$geoY);
$mapproj=$map-getProjection();
$layerproj=$map-getlayerbyname('mobil')-getProjection();
if($mapproj!=$layerproj){
$oMapproj=ms_newProjectionObj($mapproj);
$oLayerproj=ms_newProjectionObj($layerproj);
$geopoint-project($oMapproj, $oLayerproj);
// projects the point from the projection of the map to
the projection of layer
$newmap=$map-clone(); // Might be better to make a new
object and then add the querylayer to that object
$newmap-setProjection($layerproj);
$querymap=$newmap;
}else{
$querymap=$map;
}
$resu...@$querymap-queryByPoint($geopoint, MS_SINGLE , -1);
if ( $result==MS_FAILURE ) {$smarty-assign('mapmessage','No
data found');}
$layername='mobil';
$layerfield='id';
$oLayer = $querymap-GetLayerByName($layername);
$numResults = $oLayer-getNumResults();
if($numResults){
$foundresults=true;
$oLayer-open();
for ($iRes=0; $iRes $numResults; $iRes++)
{
$oRes = $oLayer-getResult($iRes);
$oShape =
$oLayer-getShape($oRes-tileindex,$oRes-shapeindex);
$result=$oShape-values[$layerfield];
$smarty-assign('queryresult',$result);
$smarty-assign('querytime',date(Y.m.d
H:i:s,$oShape-values['utctime']));
$oShape-free;
}
$oLayer-close;
if($querymap!=$map){ // Must transfer the information
back to the map that is to be plotted
// NB, the field I'm using is the primary index
in the database table, i know it is unique.
$oLayer=$map-GetLayerByName($layername);
$oLayer-queryByAttributes($layerfield,$result,MS_SINGLE);
}
}
}
}
___
mapserver-users mailing list
mapserver-users@lists.osgeo.org