本文介绍了如何在数据库中保存谷歌
地图叠加形状?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想在数据库中保存一个谷歌地图覆盖形状.这是我的代码.它工作得很好,但我只需要在数据库中保存 all_shapes
数组.
I want to save a Google maps overlay shape in the database. This is my code. It works perfectly but I just need to save all_shapes
array in the database.
在哪里以及如何将创建的叠加形状保存在数据库中.所有形状都保存在 var all_shapes = [];
数组中.我必须为数据库中的字段选择什么样的类型?我的意思是例如 int、char 等.我将使用 MySQL 和 PHP.
Where and how can I save the created overlay shapes in the database. All shapes are saved in the var all_shapes = [];
array. What kind of type I have to choose for the field in database? I mean for example int, char, etc.
I'm going to use MySQL and PHP.
推荐答案
当您只是想以某种方式存储形状时,您可以使用 JSON 字符串,将其存储在例如一个 Text
-column(char
会小到存储详细的多边形/折线)
When you simply want to store the shapes somehow, you may use a JSON-string, store it in e.g. a Text
-column(char
would be to small to store detailed polygons/polylines )
注意:创建 JSON 字符串时,必须转换属性(例如转换为原生数组或对象),不能直接存储例如 LatLng,因为保存时原型会丢失.折线/多边形的路径可以存储编码
Note: when you create the JSON-string, you must convert the properties(e.g. to native arrays or objects), you cannot store for example LatLng's directly, because the prototype will be lost when saving it. Pathes of polylines/polygons may be stored encoded
另一种方法:使用多列,例如
Another approach:
use multiple columns, e.g.
- 用于存储类型(LatLng、Circle、Polyline 等)的列(
varchar
) - 一列(
geometry
),用于存储几何特征(LatLng、Polygon 或 Polyline) - 存储半径的列(
int
)(插入圆时使用) - 可选的 column(
text
) 用于存储样式选项(需要时)
- a column(
varchar
) where you store the type(LatLng, Circle,Polyline,etc.)
- a column(
geometry
) where you store the geometric features(LatLng,Polygon or Polyline)
- a column(
int
) where you store a radius(used when you insert a circle)
- optionally column(
text
) where you store the style-options(when needed)
当您只想存储它时,第一个建议就足够了.
The first suggestion would be sufficient when you simply want to store it.
当您必须能够选择特定形状时,例如对于给定区域,请使用第二个建议.见 http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html 有关空间扩展的详细信息
When you must be able to select particular shapes, e.g for a given area, use the 2nd suggestion.
See http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html for details of the spatial extensions
2 个函数,可以删除循环引用并创建可存储对象,或者从这些存储对象中恢复覆盖.
2 functions that either remove the circular references and create storable objects, or restore the overlays from these stored objects.
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 字符串插入到表中:
The array returned by IO.IN
may be sended to a serverside script. The serverside script should iterate over this array and INSERT a JSON-string into the table:
恢复形状获取它们:
并将结果传递给IO.OUT()
:
演示:http://jsfiddle.net/doktormolle/EdZk4/show/
这篇关于如何在数据库中保存谷歌地图叠加形状?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!