ThinkGeo.com    |     Documentation    |     Premium Support

Show map info with right click


Hi,


My requrement is to show map info (e.g.city name, street name) by right clicking on the map.


is it possible to use web method to do this?  call upon a function on the server side to get the feature,  when right click on the map is detected  on the client side…


 


Thanks !


Roson




Hi Roson,


We had tested using web method to implement your requirement, and it works. First of all, we write a method in the server side (C# code) and mark it to WebMethod; this method will get the feature information by the passing in coordinate:


[System.Web.Services.WebMethod]
[System.Web.Script.Services.ScriptMethod]
public static string Test(double lon, double lat)

    string result = string.Empty;
    // Write your logic to get the feature information by the lon and lat.
    return result;
}


Then in the client side javascript, you should register the mouse down event and in this event we can check if this is a right click. And call the web method if it is a right click:


[script removed]
    var tgMap;
    function OnMapCreated(map) {
        tgMap = map;
        tgMap.events.register('mousedown', map, function(evt) {
            if (evt && evt.button == 2) {
                var lonlat = map.getLonLatFromPixel(evt.xy);
                TestWebMethods(lonlat.lon, lonlat.lat);
            }
        });
    }

    function TestWebMethods(lon, lat) {
        PageMethods.Test(lon, lat, OnTestComplete);
    }

    function OnTestComplete(result) { 
    
    }
[script removed]


At last, in the OnTestComplete function to display the result.
Any more questions please let me know.
Thanks,
Sun

Hi Sun, 



It works! 

Thank you very much. 



another question.. Is it possible to do something like.. highlight a street (when it's found)? 



Thanks again! 



Roson



To highlight a street, I think you have two solutions: one solution is that you can create a LayerOverlay which contains one InMemoryFeatureLayer and add this LayerOverlay into the CusomOverlays collection. Then in the call back method (the Test() method above) add the result feature to this overlay. At last refresh this overlay in the client side. The other solution is return the WKT of the feature found in the call back method (the Test() method above) to the client side, and add this WKT to a vector layer by OpenLayers to display it. Hope this helps.


Any more questions please let me know.
Thanks,
Sun

Hi Sun, 
  
 so I try to get the feature from the shape file by passing the street name 
  
  "streetLayer.Open();
     //streetLayer is the feature layer. ST_NAME is the column name in the shape file. 
           features = streetLayer.QueryTools.GetAllFeatures(new string[] {“ST_NAME”});
           streetLayer.Close();
 
 don’t know why, the method just returns when it hits second line above… could it be too much data? or i used it wrong? 
  
 and… i tried to do streetLayer.QueryTools.GetFeaturesByColumnValue(string, string) … it complained not to recognize the GetFeaturesByColumnValue method…   which is listed in the MapSuiteWedDoc API… I have include the namespace MapSuite core… do you have any idea why? 
  
 Thanks! 
  
 Roson 


I remember that the API QueryTools.GetFeaturesByColumnValue(string, string) was added a few days ago. So you’d better upgrade your application to use the latest version of Web Edition. And another way is using the API GetFeaturesByColumnValue(string columnName, string columnValue) in ShapeFileFeatureSource, which could get the same result and without using the latest version.


Please have a try and any more questions please let me know.
Thanks,
Sun

Hi Sun,


to highlight a street..


I am trying the second solution you suggest: "return the WKT of the feature found in the call back method (the Test() method above) to the client side, and add this WKT to a vector layer by OpenLayers to display it"


I am having problem displaying the feature on the client side..


it finds the feature of the street, returns the WKT of it


it receives that from the client side and does like the following


 


 


/*wkt is returned be webserver .. e.g. MULTILINESTRING((-13707598.2315822 6306247.50580723,-13707633.8538192 6306250.91203384,-13707715.1170475 6306267.94318751))*/
function temp (wkt)
{
if(wkt !="")
{
var vectorLayer = new OpenLayers.Layer.Vector("Street");
var wktParser = new OpenLayers.Format.WKT();

var geometry = wktParser.read(wkt);
var feature = new OpenLayers.Feature.Vector(geometry);
vectorLayer.addFeatures(feature);
Map1.GetOpenLayersMap().addLayers(vectorLayer);
vectorLayer.display =true; //or something else??
}

nothing happens.. do you have any idea what's the problem is? Thanks a lot!


 


Roson


 



Roson,


Could you have a try to add ‘geometry’ to the ‘vectorLayer’ directly? The code could be like this:
function temp (wkt)
{
if(wkt !="")
{
var vectorLayer = new OpenLayers.Layer.Vector("Street");
var wktParser = new OpenLayers.Format.WKT();
 
var geometry = wktParser.read(wkt);
vectorLayer.addFeatures(geometry);
Map1.GetOpenLayersMap().addLayers(vectorLayer);
vectorLayer.display =true; //or something else??
}
Please try it to see what happens.
Any more questions please let me know.
Thanks,
Sun

Hi Sun, 
  
 I just gave it a try… still nothing happened… =( 
 btw, if i want to get the lon lat from the wkt…  I have googled for some examples … they showed something like the following and I tried…   
     
    var temp1 =new OpenLayers.Geometry.fromWKT(wkt);   
    ver center=  temp1.getBounds().getLonLat(); 
  
 but that doesn’t work… sorry to keeping asking things like this… I very much appreciate all your help! 
  
  
 Roson

Another error in your code is the statement ‘vectorLayer.display=true’. You should get rid of this statement from the function too. Sorry for forgetting pointing this in the last post. We also have some test code and it works fine in our end, please take a look:



var OnMapCreated = function(map) {
  vectorLayer = new OpenLayers.Layer.Vector("Street");
  Map1.GetOpenLayersMap().addLayer(vectorLayer);
  var wkt = "MULTILINESTRING((-13707598.2315822 6306247.50580723,-13707633.8538192 6306250.91203384,-13707715.1170475 6306267.94318751))";
  if (wkt != "") {
      var geometry = OpenLayers.Geometry.fromWKT(wkt);
      var center = geometry.getBounds().getCenterLonLat();
      var feature = new OpenLayers.Feature.Vector(geometry);
      feature.featureId = "1";
      vectorLayer.addFeatures(feature);
  }
  Map1.GetOpenLayersMap().zoomToExtent(geometry.getBounds());
}

Any more questions please let me know.
Thanks,
Sun

mm… weird… for the line  
  var geometry = OpenLayers.Geometry.fromWKT(wkt); 
  
 I got javascript error (IE script error):“Object doesn’t support this property of method”…?  =(

Hi Sun,


I did something a bit differently and it worked.  Thank you!


 


    
if(wkt !="")    
   {   
var vectorLayer = new OpenLayers.Layer.Vector("Street");   Map1.GetOpenLayersMap().addLayer(vectorLayer);     
var wktParser = new OpenLayers.Format.WKT();   
var feature = wktParser.read(wkt);   
var featGeo = feature.geometry;   
var center = featGeo.getBounds().getCenterLonLat();       
feature.featureId = "1";       
vectorLayer.addFeatures(feature);     
      }   
Map1.GetOpenLayersMap().zoomToExtent(featGeo.getBounds());  

   


Roson



OK, you are always welcome. 
  
 Any more questions please let me know. 
  
 Thanks, 
  
 Sun 


Hi Sun, 
  
 Here’s the issue caused by the right click to show info… it disables the function of zooming out by double right click…  
 I put in some logic to distinguish between single right click and double right click… that works fine on firefox.  not for IE though, IE seems to take double right click as a single right click.  Is that true? … is so is there a way to distinguish the double right click from single right click on IE too?.. 
  
 thanks! 
  
 Roson

Never mind.   
 I seem to get it working now. =P   by registering event ‘mouseup’  for ie to detect the double right click. =D 
  
 Thanks! 
  
 Roson

Lishan, 
  
 Good idea; just let us know if you have more questions. 
  
 Thanks, 
 Howard