sql >> Database teknologi >  >> RDS >> Mysql

Hvordan gemmer man en Google Maps-overlejringsform i databasen?

Når du blot vil gemme formerne på en eller anden måde, kan du bruge en JSON-streng, gemme den i f.eks. en Text -column(char ville være for lille til at gemme detaljerede polygoner/polylinjer )

Bemærk:Når du opretter JSON-strengen, skal du konvertere egenskaberne (f.eks. til native arrays eller objekter), du kan ikke gemme for eksempel LatLng'er direkte, fordi prototypen vil gå tabt, når du gemmer den. Stier af polylinjer/polygoner kan gemmes kodet

En anden tilgang:brug flere kolonner, f.eks.

  1. en kolonne(varchar ), hvor du gemmer typen (LatLng, Circle, Polyline, osv.)
  2. en kolonne(geometry ), hvor du gemmer de geometriske funktioner (LatLng, Polygon eller Polyline)
  3. en kolonne(int ) hvor du gemmer en radius (bruges når du indsætter en cirkel)
  4. valgfrit kolonne(text ), hvor du gemmer stilindstillingerne (når det er nødvendigt)

Det første forslag ville være tilstrækkeligt, når du blot ønsker at gemme det.

Når du skal kunne vælge bestemte former, f.eks. for et givet område, skal du bruge det 2. forslag. Se http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html for detaljer om de rumlige udvidelser

2 funktioner, der enten fjerner de cirkulære referencer og skaber objekter, der kan gemmes, eller gendanner overlejringen fra disse gemte objekter.

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

}

Arrayet returneret af IO.IN kan sendes til et serverside-script. Serverside-scriptet skal iterere over dette array og INDSÆTTE en JSON-streng i tabellen:

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

for at gendanne formerne skal du hente dem:

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

og send resultatet til IO.OUT() :

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

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



  1. Hvordan kan jeg lave et gennemsnit af datoer i MySQL?

  2. Sådan skriver du en .Net-applikation, der fungerer med både SqlServer og Oracle (nu hvor System.Data.OracleClient er forældet)

  3. MySQL - Vælg den sidste indsatte række nemmeste måde

  4. MySQL-værktøj, der søger efter en streng i alle felter, tabeller og databaser