Topo2 Fixed device positions

Change-Id: I2a285710fb7bce23734ac4afb1a3ac66f6179f11
diff --git a/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2Jsonifier.java b/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2Jsonifier.java
index 11aef1d..e895214 100644
--- a/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2Jsonifier.java
+++ b/web/gui/src/main/java/org/onosproject/ui/impl/topo/Topo2Jsonifier.java
@@ -383,12 +383,15 @@
 
 
     private ObjectNode jsonClosedRegion(UiRegion region) {
-        return objectNode()
+        ObjectNode node = objectNode()
                 .put("id", region.idAsString())
                 .put("name", region.name())
                 .put("nodeType", REGION)
                 .put("nDevs", region.deviceCount());
         // TODO: complete closed-region details
+
+        addMetaUi(node, region.idAsString());
+        return node;
     }
 
     /**
diff --git a/web/gui/src/main/webapp/app/view/topo2/topo2NodeModel.js b/web/gui/src/main/webapp/app/view/topo2/topo2NodeModel.js
index d4917a3..09e6ef0 100644
--- a/web/gui/src/main/webapp/app/view/topo2/topo2NodeModel.js
+++ b/web/gui/src/main/webapp/app/view/topo2/topo2NodeModel.js
@@ -63,6 +63,7 @@
 
         // If the device contains explicit LONG/LAT data, use that to position
         if (setLongLat(node)) {
+            // Indicate we want to update cached meta data...
             return true;
         }
 
@@ -114,29 +115,37 @@
         angular.extend(node, xy);
     }
 
-    function setLongLat(node) {
-        var loc = node.location,
+    function setLongLat(el) {
+        var loc = el.get('location'),
             coord;
 
         if (loc && loc.type === 'lnglat') {
+
+            if (loc.lat === 0 && loc.lng === 0) {
+                return false;
+            }
+
             coord = coordFromLngLat(loc);
-            node.fixed = true;
-            node.px = node.x = coord[0];
-            node.py = node.y = coord[1];
+            el.fixed = true;
+            el.x = el.px = coord[0];
+            el.y = el.py = coord[1];
+
             return true;
         }
     }
 
     function coordFromLngLat(loc) {
         var p = t2mcs.projection();
-        return p ? p.invert([loc.lng, loc.lat]) : [0, 0];
+        return p ? p([loc.lng, loc.lat]) : [0, 0];
     }
 
     angular.module('ovTopo2')
     .factory('Topo2NodeModel',
         ['Topo2Model', 'FnService', 'RandomService', 'Topo2PrefsService',
-        'SvgUtilService', 'IconService', 'ThemeService', 'Topo2MapConfigService',
-        function (Model, _fn_, _RandomService_, _ps_, _sus_, _is_, _ts_, _t2mcs_) {
+        'SvgUtilService', 'IconService', 'ThemeService',
+        'Topo2MapConfigService',
+        function (Model, _fn_, _RandomService_, _ps_, _sus_, _is_, _ts_,
+            _t2mcs_) {
 
             randomService = _RandomService_;
             ts = _ts_;
@@ -148,6 +157,8 @@
 
             return Model.extend({
                 initialize: function () {
+                    this.set('class', this.nodeType);
+                    this.set('svgClass', this.svgClassName());
                     this.node = this.createNode();
                 },
                 createNode: function () {