ThinkGeo.com    |     Documentation    |     Premium Support

How do I get feature in InMemmoryFeature on client side?

I try to find get feature method on client side but I not found.


this step of some requirement.


1. buffer and clipping with boundary.


2. use result shape from 1 for use spatialquery and get data.then add data to gridview (I add event on tr with javascript) and feature to InMemoryFeature.


3. In data gridview, if  click on row , a map will active feature.


   or if click on feature ,data gridview will be select row of feature.


1 and 2  is finish. but 3  I not found.


my user requirement like this link : api.geoext.org/1.1/examples/feature-grid.html


 



Sumeth,


 I think that in our documentation, sample apps, code community etc, we have all the elements for you to build the step 3 of your requirements. You also need to have some general programming skills to put together all the differents elements to have the Grid working as you describe and as that is shown in the link. I can give you all the different elements and you can put everything together.


-To get the point feature clicked on by the user: We have the sample Get Feature Clicked on (Web) 2 from the Code Community  wiki.thinkgeo.com/wiki/Map_Suite_We....28Web.292.


 In the How Do I samples, we also have the sample Get Data When User Clicks under the Querying Feature Layers category. websamples.thinkgeo.com/ for showing how to have a Grid.


-To go from the Grid to the feature on the map, you could use the Feature ID and we have a sample Find By Id also the How Do I samples under the Features category.


If you are still having difficulties putting everything together to have the behavior as in your link, please let us know and I think I can ask the Web team to build a little sample resembling the one fromn the link. Thank you.



Val, Thank you for information. 

I know on server side,but I need get feature on client side. 

I think client side smooth than server side. 




I think InmemoryFeatureLayer is Vector layer in OpenLayers. But it not.


dev.openlayers.org/docs/files/OpenLayers/Layer/Vector-js.html 



Now I change to use EditOverlay.


 


It Vector Layer. and I can getFeatureByFid now.


 


 And I have question about : set style to vector layer (EditOverlay) .


How to set set style to vector layer (EditOverlay)  on client side. ?


now I use this code but I don't know how to set active "select style". 


 


    function OnMapCreated(map) {


            var map = Map1.GetMapParser().map;


            var vector = map.getLayersByName('EditOverlay');


            var myStyles = new OpenLayers.StyleMap({


                "default": new OpenLayers.Style({


                    pointRadius: "${type}", // sized according to type attribute


                    fillColor: "#ffcc66",


                    strokeColor: "#ff9933",


                    strokeWidth: 2,


                    graphicZIndex: 1


                }),


                "select": new OpenLayers.Style({


                    fillColor: "#66ccff",


                    strokeColor: "#3399ff",


                    graphicZIndex: 2


                })


            });


            vector.styleMap = myStyles;


            vector.rendererOptions = { zIndexing: true };


            var select = new OpenLayers.Control.SelectFeature(vector,


                                                                {


                                                               click: true  //< It can't use with clickFeature
<this use="" with="" span=""></this>


//                                                                    clickFeature: function (feature) {


//                                                                       I want to add code for active feature selected.


//                                                                    }


                                                                });





            map.addControl(select);


            select.activate();


        }


 


 


 




Regards 

Sumeth



Sumeth,


 Thank you for providing more specifications on your requirements. I am not completely sure on what should be the best approach for this case so I am going to have to ask for some assistance to the Web team. You should have an answer tomorrow.



Now I can make this concept but I can’t set style to Feature Selected only. 
  
  
 And I have question. 
  
 Can I add vector layer more than one with server side ? (Default is EditOverlay) 
  
 I think vector layer can add from client side, but I don’t know Can it work with server side? 
  
  
  
 thanks you. 
  
  
  


 


Hi sumeth,
I think the attached sample is right for you. Here shows how to add an InmemoryFeatureLayer on server side and get the feature from it to display on client side. It uses the Asp.NET callback and is similar to the sample you provided.
Best Regards!
Johnny

InteractWithMapPoints.zip (385 KB)

Thank you so much, Johny. 

your code is work. 

I have knowledge about ASP.NET call back a little bit. 

I will try to learn it with debug. 



Can I ask you 3 question for knowledge?  

(If you can not, It alrigth.) 



1.    How to set set style to vector layer (EditOverlay)  on client side. ? 



here code:   (I use jquery for select element and set style  ) 

--------------------------  START ----------------------------------------- 

function OnMapCreated(map) { 

var map = Map1.GetMapParser().map; 

var vector = map.getLayersByName('EditOverlay'); 

var myStyles = new OpenLayers.StyleMap({ 

"default": new OpenLayers.Style({ 

pointRadius: "${type}", // sized according to type attribute 

fillColor: "#ffcc66", 

strokeColor: "#ff9933", 

strokeWidth: 2, 

graphicZIndex: 1 

}), 

"select": new OpenLayers.Style({ 

fillColor: "#66ccff", 

strokeColor: "#3399ff", 

graphicZIndex: 2 

}) 

}); 

vector.styleMap = myStyles; 

vector.rendererOptions = { zIndexing: true }; 

var select = new OpenLayers.Control.SelectFeature(vector, 



click: true, 

onSelect: function (feature) { 

var table = jq("#tblResult"); 

var trOdd = table.find("tr:odd"); 

var trEven = table.find("tr:even"); 

var trHead = table.find("tr:first"); 

var trFocus = table.find("tr[value='" + feature.fid + "']"); 

trOdd.css("background-color", "#F9F9F9"); 

trEven.css("background-color", "#CAE4FF"); 

trHead.css("background-color", "#3366FF"); 

trFocus.css("background-color", "#FFCC00").focus(); 



}); 

_featureSelected = select; 

map.addControl(select); 

select.activate(); 







//below function is bind to event onclick with TR tag.  

// I don't know how do I active select style 

function SelectFeature(fid) { 

var map = Map1.GetMapParser().map; 

var vector = map.getLayersByName('EditOverlay'); 

var obj = vector[0].getFeatureByFid(fid); 

vector.selectedFeatures = obj; 

vector.selectedFeatures.style = { 

fillColor: "#00BA16", 

strokeColor: "#3399ff", 

graphicZIndex: 10000000 

}; 

var table = jq("#tblResult"); 

var trOdd = table.find("tr:odd"); 

var trEven = table.find("tr:even"); 

var trHead = table.find("tr:first"); 

var trFocus = table.find("tr[value='" + fid + "']"); 

trOdd.css("background-color", "#F9F9F9"); 

trEven.css("background-color", "#CAE4FF"); 

trHead.css("background-color", "#3366FF"); 

trFocus.css("background-color", "#FFCC00").focus(); 

_featureSelected.activate(); 

vector[0].redraw(); 





----------------------------END-------------------------------------------



HERE is Video: mediafire.com/?9ynhyfe1j0xn3p2 

//the problem on video: I click on table but Feature was removed. 



2.Can I add vector layer more than one with server side ? (Default is EditOverlay)  



3.I think vector layer can add from client side, but I don't know Can it work with server side?



 Hi Sumeth,


 
For your first question, we can use the code below to reset the style of the edit layer. Also there are some other ways, we can discuss it if you need.

function OnMapCreated(map) {
    var myStyles = new OpenLayers.StyleMap({
        "default": new OpenLayers.Style({
            pointRadius: "${type}", // sized according to type attribute 
            fillColor: "#000000",
            strokeColor: "white",
            strokeWidth: 4,
            graphicZIndex: 1
        }),

        "select": new OpenLayers.Style({
            fillColor: "#66ccff",
            strokeColor: "#3399ff",
            graphicZIndex: 2
        })
    });

    OpenLayers.Layer.Vector = OpenLayers.Class(OpenLayers.Layer.Vector, {
        styleMap: myStyles
    });


 
I think you are working on a different way from Johnny’s solution. That you are rendering highlight vectors on the client while Johnny’s solution is rendering on the server side and refresh the image on the client side. So we are unable to recreate your sample. If you the feature still cannot display, please send us the entire workflow in your application and we can check out the issue.
 
For the second issue, the answer is yes; but there will be a limitation; we will synchronize the state from EditOverlay, while we cannot handle the state which customers added on the client side. Which means if adding a new vector layer on the client side, the state on the client layer will lost. So please consider this one more.
 
For the third issue; it's related to the second issue that how to sync the state between client and server side. Web is stateless, we need find a way to pass the client state to the server side and save it. It's basically like how the ViewState works. For example, we can have a hidden field in the form tag of current page, serialize the features to a string and put it into the hidden field. After postback, the value will be posted to the server side, we need convert the string back to the features collection and save it to the layers where we maintains on the server side. Please let us know if you have any trouble on this. We recommend using the current EditOverlay, because you don’t need write the code to sync state between  client and server side. Secondly, if the state is too much to transfer between browser and server, the page slows down of course. Hope it makes sense.
 
Thanks,
Howard
 

thanks howard.


Now, I changed to Johny's solution because page is very slow when I select more feature. (It use more resouce from client)


 



Hello sumeth, 
  
 Please feel free to let us know if you meet problems. 
  
 Regards, 
  
 Gary