sql >> Database >  >> RDS >> Mysql

Hoe kan ik een Google Maps-overlayvorm in de database opslaan?

Als je de vormen gewoon op de een of andere manier wilt opslaan, kun je een JSON-string gebruiken, deze opslaan in b.v. een Text -column(char zou te klein zijn om gedetailleerde polygonen/polylijnen op te slaan )

Opmerking:wanneer u de JSON-string maakt, moet u de eigenschappen converteren (bijvoorbeeld naar native arrays of objecten), u kunt bijvoorbeeld LatLng's niet rechtstreeks opslaan, omdat het prototype verloren gaat bij het opslaan. Paden van polylijnen/polygonen kunnen gecodeerd worden opgeslagen een>

Een andere benadering:gebruik meerdere kolommen, b.v.

  1. een kolom(varchar ) waar u het type opslaat (LatLng, Circle, Polyline, etc.)
  2. een kolom(geometry ) waar u de geometrische kenmerken opslaat (LatLng, Polygon of Polyline)
  3. een kolom(int ) waar u een straal opslaat (gebruikt wanneer u een cirkel invoegt)
  4. optioneel kolom(text ) waar u de stijlopties opslaat (indien nodig)

De eerste suggestie zou voldoende zijn als u het gewoon wilt opslaan.

Als je bepaalde vormen moet kunnen selecteren, bijvoorbeeld voor een bepaald gebied, gebruik dan de tweede suggestie. Zie http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html voor details van de ruimtelijke uitbreidingen

2 functies die ofwel de kringverwijzingen verwijderen en objecten maken die kunnen worden opgeslagen, of de overlays van deze opgeslagen objecten herstellen.

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

}

De array geretourneerd door IO.IN kan naar een serverside-script worden verzonden. Het serverside-script moet deze array herhalen en een JSON-string in de tabel INSERT:

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

om de vormen te herstellen, haal ze op:

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

en geef het resultaat door aan IO.OUT() :

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

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



  1. Databasetips voor beginners

  2. Hoe weet ik of mijn PostgreSQL-back-up goed is?

  3. Hoe het gemiddelde van een numerieke kolom in SQL te vinden

  4. De beste manier om met spelfouten om te gaan in een MySQL fulltext-zoekopdracht