Advertisement
Guest User

Untitled

a guest
Dec 20th, 2014
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var GeoInfo = function() {
  2.     if (!GeoInfo.prototype.instance) {
  3.         GeoInfo.prototype.instance = this;
  4.     } else return GeoInfo.prototype.instance;
  5.     GeoInfo.prototype.getInfo = function(name, type) {
  6.         GeoInfo.prototype.name = name;
  7.         GeoInfo.prototype.type = type;
  8.         var query;
  9.         if (type == "fedDistrict") {
  10.             query = "http://nominatim.openstreetmap.org/search?q=" + name + "&country=russia&format=json&polygon_geojson=1";
  11.         } else if (type == "region") {
  12.             query = "http://nominatim.openstreetmap.org/search?state=" + name + "&country=russia&format=json&polygon_geojson=1";
  13.         } else {
  14.             console.warn("Unexpected type '" + type + "', expecting 'fedDistrict' or 'region'");
  15.             return false;
  16.         }
  17.         if (typeof localStorage == "undefined") {
  18.             console.warn("Your browser not support local storage");
  19.         } else {
  20.             var polygons = localStorage.polygons;
  21.             if (typeof polygons !== "undefined") {
  22.                 polygons = JSON.parse(polygons);
  23.                 if (polygons.constructor === Array) {
  24.                     var i;
  25.                     for (i = 0; i < polygons.length; i++) {
  26.                         if (polygons[i].name == name && polygons[i].type == type) {
  27.                             console.log("Cache was used");
  28.                             return {coordinates: polygons[i].coordinates, center: polygons[i].center};
  29.                         }
  30.                     }
  31.                 }
  32.             }
  33.         }
  34.         $.ajax({
  35.             async: false,
  36.             url: query,
  37.             type: "GET",
  38.             dataType: "json",
  39.             success: function(json) {
  40.                 var coordinates;
  41.                 if (json[0].geojson.type.toLowerCase() == "multipolygon") {
  42.                     coordinates = json[0].geojson.coordinates;
  43.                 } else coordinates = [json[0].geojson.coordinates];
  44.                 var polygon = getLargestPolygon(coordinates);
  45.                 var centroid = getCentroid(polygon.area, polygon.coordinates[0]);
  46.                 if (typeof localStorage.polygons != "undefined") {
  47.                     var polygons = JSON.parse(localStorage.polygons);
  48.                 } else var polygons = [];
  49.                 polygons.push({name: GeoInfo.prototype.name, type: GeoInfo.prototype.type, coordinates: polygon.coordinates[0], center: centroid});
  50.                 localStorage.polygons = JSON.stringify(polygons);
  51.                 response = {coordinates: polygon.coordinates[0], center: centroid};
  52.                 console.log(response);
  53.                 return response;
  54.             },
  55.             error: function(xhr, status, error) {
  56.                 console.warn("Connection error:" + error);
  57.                 return false;
  58.             }
  59.         })
  60.     }
  61.     function getCentroid(area, coordinates) {
  62.         var i, sumX = 0, sumY = 0, p1, p2;
  63.         for (i = 0; i < coordinates.length - 1; i++) {
  64.             p1 = coordinates[i];
  65.             p2 = coordinates[i+1];
  66.             sumX += (p1[0] + p2[0]) * (p1[0]*p2[1] - p2[0]*p1[1]);
  67.             sumY += (p1[1] + p2[1]) * (p1[0]*p2[1] - p2[0]*p1[1]);
  68.         }
  69.         return [1/(6*area)*sumX, 1/(6*area)*sumY];
  70.     }
  71.     function getLargestPolygon(coordinates) {
  72.         var polygon;
  73.         var areas = [];
  74.         var largestPolygon;
  75.         for (polygon = 0; polygon < coordinates.length; polygon++) {
  76.             var coords = coordinates[polygon][0];
  77.             var area = 0;
  78.             var i;
  79.             for (i = 0; i < coords.length - 1; i++) {
  80.                 area += coords[i][0]*coords[i+1][1]-coords[i][1]*coords[i+1][0];
  81.             }
  82.             area /= 2;
  83.             if (!(typeof largestPolygon === "undefined")) {
  84.                 if (Math.abs(areas[largestPolygon]) < Math.abs(area)) largestPolygon = polygon;
  85.             } else largestPolygon = polygon;
  86.             areas.push(area);
  87.         }
  88.         return {area: areas[largestPolygon], coordinates: coordinates[largestPolygon]};
  89.     }
  90. }
  91. var foo = new GeoInfo;
  92. bar = foo.getInfo("Самарская область", "region");
  93. console.log(bar);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement