Esempio n. 1
0
function greatCircle (point, bearing) {
  var φ = geotools.numberToRadius(point[1]);
  var λ = geotools.numberToRadius(point[0]);
  var θ = geotools.numberToRadius(Number(bearing));

  var x =  Math.sin(λ) * Math.cos(θ) - Math.sin(φ) * Math.cos(λ) * Math.sin(θ);
  var y = -Math.cos(λ) * Math.cos(θ) - Math.sin(φ) * Math.sin(λ) * Math.sin(θ);
  var z =  Math.cos(φ) * Math.sin(θ);

  return [x, y, z];
}
Esempio n. 2
0
function toVector (point) {
  var φ = geotools.numberToRadius(point[1]);
  var λ = geotools.numberToRadius(point[0]);

  // right-handed vector: x -> 0°E,0°N; y -> 90°E,0°N, z -> 90°N
  var x = Math.cos(φ) * Math.cos(λ);
  var y = Math.cos(φ) * Math.sin(λ);
  var z = Math.sin(φ);

  return [x, y, z];
}
Esempio n. 3
0
 gju.pointDistance = function (pt1, pt2) {
   var lon1 = pt1.coordinates[0],
     lat1 = pt1.coordinates[1],
     lon2 = pt2.coordinates[0],
     lat2 = pt2.coordinates[1],
     dLat = gju.numberToRadius(lat2 - lat1),
     dLon = gju.numberToRadius(lon2 - lon1),
     a = Math.pow(Math.sin(dLat / 2), 2) + Math.cos(gju.numberToRadius(lat1))
       * Math.cos(gju.numberToRadius(lat2)) * Math.pow(Math.sin(dLon / 2), 2),
     c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
   return (6371 * c) * 1000; // returns meters
 },
Esempio n. 4
0
function bearingTo (start, end, precision) {
  var phiStart = geotools.numberToRadius(start[1]),
      phiEnd = geotools.numberToRadius(end[1]);
  var deltaLambda = geotools.numberToRadius((end[0]-start[0]));

  // see http://mathforum.org/library/drmath/view/55417.html
  var y = Math.sin(deltaLambda) * Math.cos(phiEnd);
  var x = Math.cos(phiStart)*Math.sin(phiEnd) -
    Math.sin(phiStart)*Math.cos(phiEnd)*Math.cos(deltaLambda);
  var theta = Math.atan2(y, x);

  return floatPrecision(((geotools.numberToDegree(theta) + 360) % 360), precision);
}
Esempio n. 5
0
function rhumbBearingTo (origin, target, precision) {
  var φ1 = geotools.numberToRadius(origin[1]),
      φ2 = geotools.numberToRadius(target[1]),
      Δλ = geotools.numberToRadius(target[0] - origin[0]);

  // if dLon over 180° take shorter rhumb line across the anti-meridian:
  if (Math.abs(Δλ) > Math.PI) Δλ = Δλ>0 ? -(2*Math.PI-Δλ) : (2*Math.PI+Δλ);

  var Δψ = Math.log(Math.tan(φ2/2+Math.PI/4)/Math.tan(φ1/2+Math.PI/4));

  var θ = Math.atan2(Δλ, Δψ);

  return floatPrecision(((geotools.numberToDegree(θ) + 360) % 360), precision);
}
Esempio n. 6
0
  gju.destinationPoint = function (pt, brng, dist) {
    dist = dist/6371;  // convert dist to angular distance in radians
    brng = gju.numberToRadius(brng);

    var lon1 = gju.numberToRadius(pt.coordinates[0]);
    var lat1 = gju.numberToRadius(pt.coordinates[1]);

    var lat2 = Math.asin( Math.sin(lat1)*Math.cos(dist) +
                          Math.cos(lat1)*Math.sin(dist)*Math.cos(brng) );
    var lon2 = lon1 + Math.atan2(Math.sin(brng)*Math.sin(dist)*Math.cos(lat1),
                                 Math.cos(dist)-Math.sin(lat1)*Math.sin(lat2));
    lon2 = (lon2+3*Math.PI) % (2*Math.PI) - Math.PI;  // normalise to -180..+180º

    return {
      'type': 'Point',
      'coordinates': [gju.numberToDegree(lon2), gju.numberToDegree(lat2)]
    };
  };
Esempio n. 7
0
 gju.drawCircle = function (radiusInMeters, centerPoint, steps) {
   var center = [centerPoint.coordinates[1], centerPoint.coordinates[0]],
     dist = (radiusInMeters / 1000) / 6371,
     // convert meters to radiant
     radCenter = [gju.numberToRadius(center[0]), gju.numberToRadius(center[1])],
     steps = steps || 15,
     // 15 sided circle
     poly = [[center[0], center[1]]];
   for (var i = 0; i < steps; i++) {
     var brng = 2 * Math.PI * i / steps;
     var lat = Math.asin(Math.sin(radCenter[0]) * Math.cos(dist)
             + Math.cos(radCenter[0]) * Math.sin(dist) * Math.cos(brng));
     var lng = radCenter[1] + Math.atan2(Math.sin(brng) * Math.sin(dist) * Math.cos(radCenter[0]),
                                         Math.cos(dist) - Math.sin(radCenter[0]) * Math.sin(lat));
     poly[i] = [];
     poly[i][1] = gju.numberToDegree(lat);
     poly[i][0] = gju.numberToDegree(lng);
   }
   return {
     "type": "Polygon",
     "coordinates": [poly]
   };
 }
Esempio n. 8
0
!function(f){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=f();else if("function"==typeof define&&define.amd)define([],f);else{var g;g="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,g.leafletPip=f()}}(function(){return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a="function"==typeof require&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module){"use strict";function isPoly(l){return L.MultiPolygon?l instanceof L.MultiPolygon||l instanceof L.Polygon:l.feature&&l.feature.geometry&&l.feature.geometry.type&&-1!==["Polygon","MultiPolygon"].indexOf(l.feature.geometry.type)}var gju=require("geojson-utils"),leafletPip={bassackwards:!1,pointInLayer:function(p,layer,first){p instanceof L.LatLng?p=[p.lng,p.lat]:leafletPip.bassackwards&&(p=p.concat().reverse());var results=[];return layer.eachLayer(function(l){first&&results.length||isPoly(l)&&gju.pointInPolygon({type:"Point",coordinates:p},l.toGeoJSON().geometry)&&results.push(l)}),results}};module.exports=leafletPip},{"geojson-utils":2}],2:[function(require,module){!function(){function boundingBoxAroundPolyCoords(coords){for(var xAll=[],yAll=[],i=0;i<coords[0].length;i++)xAll.push(coords[0][i][1]),yAll.push(coords[0][i][0]);return xAll=xAll.sort(function(a,b){return a-b}),yAll=yAll.sort(function(a,b){return a-b}),[[xAll[0],yAll[0]],[xAll[xAll.length-1],yAll[yAll.length-1]]]}function pnpoly(x,y,coords){for(var vert=[[0,0]],i=0;i<coords.length;i++){for(var j=0;j<coords[i].length;j++)vert.push(coords[i][j]);vert.push(coords[i][0]),vert.push([0,0])}for(var inside=!1,i=0,j=vert.length-1;i<vert.length;j=i++)vert[i][0]>y!=vert[j][0]>y&&x<(vert[j][1]-vert[i][1])*(y-vert[i][0])/(vert[j][0]-vert[i][0])+vert[i][1]&&(inside=!inside);return inside}var gju=this.gju={};"undefined"!=typeof module&&module.exports&&(module.exports=gju),gju.lineStringsIntersect=function(l1,l2){for(var intersects=[],i=0;i<=l1.coordinates.length-2;++i)for(var j=0;j<=l2.coordinates.length-2;++j){var a1={x:l1.coordinates[i][1],y:l1.coordinates[i][0]},a2={x:l1.coordinates[i+1][1],y:l1.coordinates[i+1][0]},b1={x:l2.coordinates[j][1],y:l2.coordinates[j][0]},b2={x:l2.coordinates[j+1][1],y:l2.coordinates[j+1][0]},ua_t=(b2.x-b1.x)*(a1.y-b1.y)-(b2.y-b1.y)*(a1.x-b1.x),ub_t=(a2.x-a1.x)*(a1.y-b1.y)-(a2.y-a1.y)*(a1.x-b1.x),u_b=(b2.y-b1.y)*(a2.x-a1.x)-(b2.x-b1.x)*(a2.y-a1.y);if(0!=u_b){var ua=ua_t/u_b,ub=ub_t/u_b;ua>=0&&1>=ua&&ub>=0&&1>=ub&&intersects.push({type:"Point",coordinates:[a1.x+ua*(a2.x-a1.x),a1.y+ua*(a2.y-a1.y)]})}}return 0==intersects.length&&(intersects=!1),intersects},gju.pointInBoundingBox=function(point,bounds){return!(point.coordinates[1]<bounds[0][0]||point.coordinates[1]>bounds[1][0]||point.coordinates[0]<bounds[0][1]||point.coordinates[0]>bounds[1][1])},gju.pointInPolygon=function(p,poly){for(var coords="Polygon"==poly.type?[poly.coordinates]:poly.coordinates,insideBox=!1,i=0;i<coords.length;i++)gju.pointInBoundingBox(p,boundingBoxAroundPolyCoords(coords[i]))&&(insideBox=!0);if(!insideBox)return!1;for(var insidePoly=!1,i=0;i<coords.length;i++)pnpoly(p.coordinates[1],p.coordinates[0],coords[i])&&(insidePoly=!0);return insidePoly},gju.pointInMultiPolygon=function(p,poly){for(var coords_array="MultiPolygon"==poly.type?[poly.coordinates]:poly.coordinates,insideBox=!1,insidePoly=!1,i=0;i<coords_array.length;i++){for(var coords=coords_array[i],j=0;j<coords.length;j++)insideBox||gju.pointInBoundingBox(p,boundingBoxAroundPolyCoords(coords[j]))&&(insideBox=!0);if(!insideBox)return!1;for(var j=0;j<coords.length;j++)insidePoly||pnpoly(p.coordinates[1],p.coordinates[0],coords[j])&&(insidePoly=!0)}return insidePoly},gju.numberToRadius=function(number){return number*Math.PI/180},gju.numberToDegree=function(number){return 180*number/Math.PI},gju.drawCircle=function(radiusInMeters,centerPoint,steps){for(var center=[centerPoint.coordinates[1],centerPoint.coordinates[0]],dist=radiusInMeters/1e3/6371,radCenter=[gju.numberToRadius(center[0]),gju.numberToRadius(center[1])],steps=steps||15,poly=[[center[0],center[1]]],i=0;steps>i;i++){var brng=2*Math.PI*i/steps,lat=Math.asin(Math.sin(radCenter[0])*Math.cos(dist)+Math.cos(radCenter[0])*Math.sin(dist)*Math.cos(brng)),lng=radCenter[1]+Math.atan2(Math.sin(brng)*Math.sin(dist)*Math.cos(radCenter[0]),Math.cos(dist)-Math.sin(radCenter[0])*Math.sin(lat));poly[i]=[],poly[i][1]=gju.numberToDegree(lat),poly[i][0]=gju.numberToDegree(lng)}return{type:"Polygon",coordinates:[poly]}},gju.rectangleCentroid=function(rectangle){var bbox=rectangle.coordinates[0],xmin=bbox[0][0],ymin=bbox[0][1],xmax=bbox[2][0],ymax=bbox[2][1],xwidth=xmax-xmin,ywidth=ymax-ymin;return{type:"Point",coordinates:[xmin+xwidth/2,ymin+ywidth/2]}},gju.pointDistance=function(pt1,pt2){var lon1=pt1.coordinates[0],lat1=pt1.coordinates[1],lon2=pt2.coordinates[0],lat2=pt2.coordinates[1],dLat=gju.numberToRadius(lat2-lat1),dLon=gju.numberToRadius(lon2-lon1),a=Math.pow(Math.sin(dLat/2),2)+Math.cos(gju.numberToRadius(lat1))*Math.cos(gju.numberToRadius(lat2))*Math.pow(Math.sin(dLon/2),2),c=2*Math.atan2(Math.sqrt(a),Math.sqrt(1-a));return 6371*c*1e3},gju.geometryWithinRadius=function(geometry,center,radius){if("Point"==geometry.type)return gju.pointDistance(geometry,center)<=radius;if("LineString"==geometry.type||"Polygon"==geometry.type){var coordinates,point={};coordinates="Polygon"==geometry.type?geometry.coordinates[0]:geometry.coordinates;for(var i in coordinates)if(point.coordinates=coordinates[i],gju.pointDistance(point,center)>radius)return!1}return!0},gju.area=function(polygon){for(var p1,p2,area=0,points=polygon.coordinates[0],j=points.length-1,i=0;i<points.length;j=i++){var p1={x:points[i][1],y:points[i][0]},p2={x:points[j][1],y:points[j][0]};area+=p1.x*p2.y,area-=p1.y*p2.x}return area/=2},gju.centroid=function(polygon){for(var f,p1,p2,x=0,y=0,points=polygon.coordinates[0],j=points.length-1,i=0;i<points.length;j=i++){var p1={x:points[i][1],y:points[i][0]},p2={x:points[j][1],y:points[j][0]};f=p1.x*p2.y-p2.x*p1.y,x+=(p1.x+p2.x)*f,y+=(p1.y+p2.y)*f}return f=6*gju.area(polygon),{type:"Point",coordinates:[y/f,x/f]}},gju.simplify=function(source,kink){kink=kink||20,source=source.map(function(o){return{lng:o.coordinates[0],lat:o.coordinates[1]}});var n_source,n_stack,n_dest,start,end,i,sig,dev_sqr,max_dev_sqr,band_sqr,x12,y12,d12,x13,y13,d13,x23,y23,d23,F=Math.PI/180*.5,index=new Array,sig_start=new Array,sig_end=new Array;if(source.length<3)return source;for(n_source=source.length,band_sqr=360*kink/(2*Math.PI*6378137),band_sqr*=band_sqr,n_dest=0,sig_start[0]=0,sig_end[0]=n_source-1,n_stack=1;n_stack>0;)if(start=sig_start[n_stack-1],end=sig_end[n_stack-1],n_stack--,end-start>1){for(x12=source[end].lng()-source[start].lng(),y12=source[end].lat()-source[start].lat(),Math.abs(x12)>180&&(x12=360-Math.abs(x12)),x12*=Math.cos(F*(source[end].lat()+source[start].lat())),d12=x12*x12+y12*y12,i=start+1,sig=start,max_dev_sqr=-1;end>i;i++)x13=source[i].lng()-source[start].lng(),y13=source[i].lat()-source[start].lat(),Math.abs(x13)>180&&(x13=360-Math.abs(x13)),x13*=Math.cos(F*(source[i].lat()+source[start].lat())),d13=x13*x13+y13*y13,x23=source[i].lng()-source[end].lng(),y23=source[i].lat()-source[end].lat(),Math.abs(x23)>180&&(x23=360-Math.abs(x23)),x23*=Math.cos(F*(source[i].lat()+source[end].lat())),d23=x23*x23+y23*y23,dev_sqr=d13>=d12+d23?d23:d23>=d12+d13?d13:(x13*y12-y13*x12)*(x13*y12-y13*x12)/d12,dev_sqr>max_dev_sqr&&(sig=i,max_dev_sqr=dev_sqr);band_sqr>max_dev_sqr?(index[n_dest]=start,n_dest++):(n_stack++,sig_start[n_stack-1]=sig,sig_end[n_stack-1]=end,n_stack++,sig_start[n_stack-1]=start,sig_end[n_stack-1]=sig)}else index[n_dest]=start,n_dest++;index[n_dest]=n_source-1,n_dest++;for(var r=new Array,i=0;n_dest>i;i++)r.push(source[index[i]]);return r.map(function(o){return{type:"Point",coordinates:[o.lng,o.lat]}})},gju.destinationPoint=function(pt,brng,dist){dist/=6371,brng=gju.numberToRadius(brng);var lon1=gju.numberToRadius(pt.coordinates[0]),lat1=gju.numberToRadius(pt.coordinates[1]),lat2=Math.asin(Math.sin(lat1)*Math.cos(dist)+Math.cos(lat1)*Math.sin(dist)*Math.cos(brng)),lon2=lon1+Math.atan2(Math.sin(brng)*Math.sin(dist)*Math.cos(lat1),Math.cos(dist)-Math.sin(lat1)*Math.sin(lat2));return lon2=(lon2+3*Math.PI)%(2*Math.PI)-Math.PI,{type:"Point",coordinates:[gju.numberToDegree(lon2),gju.numberToDegree(lat2)]}}}()},{}]},{},[1])(1)});