Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie speichere ich eine Google Maps-Overlay-Form in der Datenbank?

Wenn Sie die Formen einfach irgendwie speichern möchten, können Sie einen JSON-String verwenden, ihn z. ein Text -column(char wäre zu klein, um detaillierte Polygone/Polylinien zu speichern )

Hinweis:Wenn Sie den JSON-String erstellen, müssen Sie die Eigenschaften konvertieren (z. B. in native Arrays oder Objekte), Sie können beispielsweise LatLngs nicht direkt speichern, da der Prototyp beim Speichern verloren geht. Pfade von Polylinien/Polygonen können codiert

Ein anderer Ansatz:Verwenden Sie mehrere Spalten, z.

  1. eine Spalte (varchar ), wo Sie den Typ speichern (LatLng, Circle, Polyline usw.)
  2. eine Spalte(geometry ), wo Sie die geometrischen Features speichern (LatLng, Polygon oder Polyline)
  3. eine Spalte (int ), wo Sie einen Radius speichern (wird verwendet, wenn Sie einen Kreis einfügen)
  4. optional column(text ), wo Sie die Stiloptionen speichern (falls erforderlich)

Der erste Vorschlag würde ausreichen, wenn Sie es einfach speichern möchten.

Wenn Sie in der Lage sein müssen, bestimmte Formen auszuwählen, z. B. für einen bestimmten Bereich, verwenden Sie den zweiten Vorschlag. Siehe http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html für Details zu den räumlichen Erweiterungen

2 Funktionen, die entweder die Zirkelbezüge entfernen und speicherbare Objekte erstellen oder die Overlays aus diesen gespeicherten Objekten wiederherstellen.

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];
       }
    }
  }

}

Das von IO.IN zurückgegebene Array kann an ein serverseitiges Skript gesendet werden. Das serverseitige Skript sollte über dieses Array iterieren und einen JSON-String in die Tabelle einfügen:

<?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();
}
?>

Um die Formen wiederherzustellen, holen Sie sie:

<?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);
?>

und übergeben Sie das Ergebnis an IO.OUT() :

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

Demo:http://jsfiddle.net/doktormolle/EdZk4/show/