Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да запишете фигура на наслагване на карти на Google в базата данни?

Когато просто искате да съхраните фигурите по някакъв начин, можете да използвате JSON-низ, да го съхраните в напр. a Text -колона (char би било твърде малко, за да съхранява подробни многоъгълници/полилинии )

Забележка:когато създавате JSON-низ, трябва да преобразувате свойствата (например в естествени масиви или обекти), не можете да съхранявате например LatLng директно, защото прототипът ще бъде загубен при записването му. Пътищата на полилинии/многоъгълници могат да се съхраняват кодирани

Друг подход:използвайте няколко колони, напр.

  1. колона (varchar ), където съхранявате типа (LatLng, Circle, Polyline и т.н.)
  2. колона (geometry ), където съхранявате геометричните елементи (LatLng, Многоъгълник или Полилиния)
  3. колона (int ), където съхранявате радиус (използван, когато вмъквате кръг)
  4. по избор колона (text ), където съхранявате опциите за стил (когато е необходимо)

Първото предложение би било достатъчно, когато просто искате да го съхраните.

Когато трябва да можете да избирате конкретни форми, например за дадена област, използвайте 2-ро предложение. Вижте http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html за подробности относно пространствените разширения

2 функции, които или премахват кръговите препратки и създават обекти за съхранение, или възстановяват наслагванията от тези съхранени обекти.

var IO={
  //returns array with storable google.maps.Overlay-definitions
  IN:function(arr,//array with google.maps.Overlays
              encoded//boolean indicating if pathes should be stored encoded
              ){
      var shapes     = [],
          goo=google.maps,
          shape,tmp;

      for(var i = 0; i < arr.length; i++)
      {   
        shape=arr[i];
        tmp={type:this.t_(shape.type),id:shape.id||null};


        switch(tmp.type){
           case 'CIRCLE':
              tmp.radius=shape.getRadius();
              tmp.geometry=this.p_(shape.getCenter());
            break;
           case 'MARKER': 
              tmp.geometry=this.p_(shape.getPosition());   
            break;  
           case 'RECTANGLE': 
              tmp.geometry=this.b_(shape.getBounds()); 
             break;   
           case 'POLYLINE': 
              tmp.geometry=this.l_(shape.getPath(),encoded);
             break;   
           case 'POLYGON': 
              tmp.geometry=this.m_(shape.getPaths(),encoded);

             break;   
       }
       shapes.push(tmp);
    }

    return shapes;
  },
  //returns array with google.maps.Overlays
  OUT:function(arr,//array containg the stored shape-definitions
               map//map where to draw the shapes
               ){
      var shapes     = [],
          goo=google.maps,
          map=map||null,
          shape,tmp;

      for(var i = 0; i < arr.length; i++)
      {   
        shape=arr[i];       

        switch(shape.type){
           case 'CIRCLE':
             tmp=new goo.Circle({radius:Number(shape.radius),
                                  center:this.pp_.apply(this,shape.geometry)});
            break;
           case 'MARKER': 
             tmp=new goo.Marker({position:this.pp_.apply(this,shape.geometry)});
            break;  
           case 'RECTANGLE': 
             tmp=new goo.Rectangle({bounds:this.bb_.apply(this,shape.geometry)});
             break;   
           case 'POLYLINE': 
             tmp=new goo.Polyline({path:this.ll_(shape.geometry)});
             break;   
           case 'POLYGON': 
             tmp=new goo.Polygon({paths:this.mm_(shape.geometry)});

             break;   
       }
       tmp.setValues({map:map,id:shape.id})
       shapes.push(tmp);
    }
    return shapes;
  },
  l_:function(path,e){
    path=(path.getArray)?path.getArray():path;
    if(e){
      return google.maps.geometry.encoding.encodePath(path);
    }else{
      var r=[];
      for(var i=0;i<path.length;++i){
        r.push(this.p_(path[i]));
      }
      return r;
    }
  },
  ll_:function(path){
    if(typeof path==='string'){
      return google.maps.geometry.encoding.decodePath(path);
    }
    else{
      var r=[];
      for(var i=0;i<path.length;++i){
        r.push(this.pp_.apply(this,path[i]));
      }
      return r;
    }
  },

  m_:function(paths,e){
    var r=[];
    paths=(paths.getArray)?paths.getArray():paths;
    for(var i=0;i<paths.length;++i){
        r.push(this.l_(paths[i],e));
      }
     return r;
  },
  mm_:function(paths){
    var r=[];
    for(var i=0;i<paths.length;++i){
        r.push(this.ll_.call(this,paths[i]));

      }
     return r;
  },
  p_:function(latLng){
    return([latLng.lat(),latLng.lng()]);
  },
  pp_:function(lat,lng){
    return new google.maps.LatLng(lat,lng);
  },
  b_:function(bounds){
    return([this.p_(bounds.getSouthWest()),
            this.p_(bounds.getNorthEast())]);
  },
  bb_:function(sw,ne){
    return new google.maps.LatLngBounds(this.pp_.apply(this,sw),
                                        this.pp_.apply(this,ne));
  },
  t_:function(s){
    var t=['CIRCLE','MARKER','RECTANGLE','POLYLINE','POLYGON'];
    for(var i=0;i<t.length;++i){
       if(s===google.maps.drawing.OverlayType[t[i]]){
         return t[i];
       }
    }
  }

}

Масивът, върнат от IO.IN може да бъде изпратен до сървърен скрипт. Скриптът от страна на сървъра трябва да повтори този масив и да ВМЕСТЕ JSON-низ в таблицата:

<?php
$mysqli = new mysqli(/*args*/);
$stmt = $mysqli->prepare('INSERT INTO `tableName`(`columnName`) VALUES (?)');
$stmt->bind_param('s', $json);

foreach($_POST['shapes'] as $value){
  $json = json_encode($value);
  $stmt->execute();
}
?>

за да възстановите фигурите, извлечете ги:

<?php
$json=array();
$res=$mysqli->query('SELECT `columnName` from `tableName`');
while ($row = $res->fetch_assoc()) {
        $json[]=json_decode($row['columnName']);
    }
$res->close();
$json=json_encode($json);
?>

и предайте резултата на IO.OUT() :

IO.OUT(<?php echo $json;?>, someGoogleMapsInstance);

Демо:http://jsfiddle.net/doktormolle/EdZk4/show/



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql_insert_id с актуализация

  2. Някаква Javascript/Jquery библиотека за валидиране на SQL оператор?

  3. проблеми с инсталирането на perl DBI-mysql в windows

  4. Rails:Принудително принуди празен низ към NULL в базата данни

  5. Печат на йерахични данни в родителски дъщерен формуляр неподреден списък php?