-
30 Jul 2012 6:27 AM #1
Answered: Extract Latitude and Longitude from model and create a map marker
Answered: Extract Latitude and Longitude from model and create a map marker
Hi, I have a model which looks like this:
This model is based off an XML feed that contains those fields. However, I do not know how to create a map marker based on the 'Latitude' and 'Longitude' from the model. I currently just set my map to my current location like this:Code:Ext.define('demo.model.new', { extend: 'Ext.data.Model', config: { fields: [ { name: 'id' }, { name: 'Message' }, { name: 'Latitude' }, { name: 'Longitude' } ] } });
I've been stuck on this for days now, help would be greatly appreciated! Thank You!!Code:Ext.define('demo.view.Mapo', { extend:'Ext.Panel', extend: 'Ext.Map', xtype:'mapo', config: { title:'Incident Location', iconCls:'maps', layout:'fit', draggable: true, useCurrentLocation: true, listeners: { maprender : function(comp, map){ new google.maps.Marker({ position: new google.maps.LatLng(this._geo.getLatitude(), this._geo.getLongitude()), map: map, title:"You Are Here!", animation: google.maps.Animation.BOUNCE }); } }, mapOptions: { zoom: 15, mapTypeId: google.maps.MapTypeId.ROADMAP } } } );
-
Best Answer Posted by jerome76
Sorry about that, I should have been clearer on where to put it. I cleaned up your code:
So when you callCode:Ext.define('demo.view.Mapo', { extend: 'Ext.Map', xtype:'mapo', config: { title:'Incident Location', iconCls:'maps', layout:'fit', draggable: true, useCurrentLocation: true, mapOptions: { zoom: 15, mapTypeId: google.maps.MapTypeId.ROADMAP } }, initialize: function(){ var me = this; me.on('maprender', function(comp, map){ var newModel = Ext.ModelManager.getModel('demo.model.new'); new google.maps.Marker({ position: new google.maps.LatLng( newModel.getString('Latitude', entry), newModel.getString('Longitude', entry) ), map: map, title:"You Are Here!", animation: google.maps.Animation.BOUNCE }); }); me.callParent(arguments); }, getString: function(path, root) { var output = ''; var values = Ext.DomQuery.select(path, root); if (values[0]){ if (values[0].firstChild) { output = values[0].firstChild.nodeValue; } } return output; } });
you'll want to have a listener for the load event to create your map and map marker with the model that is associated with the store.Code:Ext.create('demo.store.news', { ... });
Code:Ext.create('demo.store.news', { listeners: { load: function(store, records, successful, op, eOpts){ //create your map once the store is loaded and //the model is successfully created and filled //with data var map = Ext.create({ xtype: 'mapo'}); //you can also use Ext.create('demo.view.Mapo'), but //since you have defined your own xtype, you can use //that //now you can do what you want with your map, //add it to your panel, or show it fullscreen, //whatever you need to do. } } });
-
30 Jul 2012 12:15 PM #2
Using the ModelManager, you can get the model that you create and get the data like so:
Hope this helps.Code:Ext.define('demo.view.Mapo', { extend:'Ext.Panel', extend: 'Ext.Map', xtype:'mapo', config: { title:'Incident Location', iconCls:'maps', layout:'fit', draggable: true, useCurrentLocation: true, listeners: { maprender : function(comp, map){ var newModel = Ext.ModelManager.getModel('demo.model.new'); new google.maps.Marker({ position: new google.maps.LatLng(newModel.get('Latitude'), newModel.get('Longitude')), map: map, title:"You Are Here!", animation: google.maps.Animation.BOUNCE }); } }, mapOptions: { zoom: 15, mapTypeId: google.maps.MapTypeId.ROADMAP } } });
-
30 Jul 2012 6:33 PM #3
Hi, thanks for your reply! I now understand the logic behind the model manager, thanks for your help! However, my application is running but I am getting this error in the Google map part. Any idea how I can solve this? Thanks!!
This is what it says:
Uncaught TypeError: Object function () { return this.constructor.apply(this, arguments); } has no method 'get
-
30 Jul 2012 10:58 PM #4
Empty Model
Empty Model
You have and empty model instance from the model manager, you need to put some data into it.
then you can use it retrieve the values in the plot point.newModel = Ext.create('demo.model.new' ,{
message :'You Are Here',
latitude : 24.23154564,
longitude : 12.1234524
});
-
31 Jul 2012 12:06 AM #5
Hi, thanks for the reply, but these fields are taken from an XML feed which contains the Latitude and Longitude fields:
Capture.PNG
-
31 Jul 2012 4:33 AM #6
You can use this then to parse out the data from the XML
The path would be 'Latitude' or 'Longitude' and the root would be the response.responseXML from the Ajax request.Code:getString: function(path, root) { var output; var values = Ext.DomQuery.select(path, root); if (values[0]) { if (values[0].firstChild) { output = values[0].firstChild.nodeValue; } else { output = ''; } } else { output = ''; } return output; },
-
31 Jul 2012 7:43 AM #7
Hi Jerome,
I've done the parsing already,
XML - news.xml :
Then from the store, I called out news.xml:Code:<entry> <title type="text">Vehicle Breakdown</title> <summary type="text"></summary> <updated>2011-07-21T12:00:42Z</updated> <author> <name /> </author> <content type="application/xml"> <m:properties> <d:Latitude m:type="Edm.Double">2.353033192633941</d:Latitude> <d:Longitude m:type="Edm.Double">104.72912122842577</d:Longitude> </m:properties> </content> <geo:lat xmlns:geo="http://www.georss.org/georss">1.353033192633941</geo:lat> <geo:long xmlns:geo="http://www.georss.org/georss">103.72912122842577</geo:long> </entry>
Which then leads to the model which gets the fields of the XML:Code:Ext.define('demo.store.news', { extend: 'Ext.data.Store', requires: [ 'demo.model.new', 'Ext.data.reader.Xml' ], config: { autoLoad: true, storeId: 'news', proxy: { type: 'ajax', url: 'news.xml', reader: { type: 'xml', model: 'demo.model.new', record: 'entry', rootProperty: 'feed' } } } });
Code:Ext.define('demo.model.new', { extend: 'Ext.data.Model', config: { fields: [ { name: 'Latitude' }, { name: 'Longitude' } ] } });
-
31 Jul 2012 7:50 AM #8
-
31 Jul 2012 8:36 AM #9
-
31 Jul 2012 9:02 AM #10
It is a JavaScript function. It can be placed in your JS file. You can add it to your Map definition and use it like (map).getString('Longitude', response.responseXML) when you are in the success [response is a param that is passed] of the Ajax request.


Reply With Quote