2012-04-20 4 views
0

Google Mapの中心点をクッキーに保存し、次回のページのロード時に地図を最後の位置に復元しようとしています。GoogleMapsLatLngをシリアライズしてクッキーに保存する

確かに、緯度と経度を文字列またはシリアル化された配列などのクッキーに保存できますが、JSONを使ってGoogle Maps LatLngオブジェクトをクッキーにシリアル化してから、後の時間。

私はjQueryと、このライブラリを使用しています:

$.cookies.set('map_center', map.getCenter()); 

、その後、私は意志シリアライズ/デシリアライゼーションのを期待し、それを読み出すしよう:私はマップから緯度経度でクッキーを設定し

http://code.google.com/p/cookies/オブジェクトを復元してください...

var centerpointFromCookie = $.cookies.get('map_center); 
map.setCenter(centerpointFromCookie); 

しかし、オブジェクトの種類が保持されていないようです。スクリプトコンソールでは、これはそれがシリアル化され、クッキーに保存される前のLatLngオブジェクトは、次のようになります。

map.getCenter() 
O 
$a: 151.21950000000004 
Za: -33.8688 
__proto__: O 
constructor: function O(a, b, c) {a-=0;b-=0;c||(a=Bd(a,-90,90),b=Cd(b,-180,180));this.Za=a;this.$a=b;} 
equals: function (a) {return!a?k:Dd(this.lat(),a.lat())&&Dd(this.lng(),a.lng());} 
lat: function() {return this[a];} 
lng: function() {return this[a];} 
toString: function() {return"("+this.lat()+", "+this.lng()+")";} 
toUrlValue: function (a) {a=Hd(a)?a:6;return ae(this.lat(),a)+","+ae(this.lng(),a);} 
__proto__: Object 

そして、これは、それがその後どのように見えるかです:

centerpointFromCookie 
Object 
$a: 151.21950000000004 
Za: -33.8688 
__proto__: Object 
__defineGetter__: function __defineGetter__() { 
__defineSetter__: function __defineSetter__() { 
__lookupGetter__: function __lookupGetter__() { 
__lookupSetter__: function __lookupSetter__() { 
constructor: function Object() { 
hasOwnProperty: function hasOwnProperty() { 
isPrototypeOf: function isPrototypeOf() { 
propertyIsEnumerable: function propertyIsEnumerable() { 
toLocaleString: function toLocaleString() { 
toString: function toString() { 
valueOf: function valueOf() { 

私はキャストする必要がありますかデシリアライズ時にオブジェクトをGoogleMapsLatLng型に変換しますか?私はちょうど値を格納することができますが、私は正しくこのような小さなオブジェクトをクッキーにシリアル化する方法を理解したいと思います。

+0

実装可能な場合でも、実装の詳細に依存します。あなたはしないでください。これは、アプリケーションが将来中断する可能性があることを意味します。 私はクッキーに緯度と経度を格納することに固執しています(実際には全く同じものを持っています)。もちろん、あなたの質問を動かすのは単なる好奇心であれば、それには何もありません。 – Jasper

答えて

2

lat/lngをシリアル化するだけです。

オブジェクトのプロトタイプまたは関数のプロパティをシリアル化することは、文字列化する必要があり、文字列を関数に戻そうとすると正しく機能しません。元の範囲ですが、現在は表示されません。 プロトタイプはいつでも変更できるので、後で正しいプロトタイプを手動で復元する方法を簡単に推測することはできません。 そしてあなたは、APIが更新されたときに面白くないLatLngプロトタイプのその特定のバージョンにあなたのオブジェクトを結び付けます。

多くのデータをシリアライズすることは言うまでもありませんが、クッキー内のスペースは通常のlat/lngよりも多くなります。

1

getCenter()は、既に値を与えています。だから、あなたはそれをJSON文字列に変換し、それを再び使用したいときに解析することができます。

var center = JSON.stringify(map.getCenter()); 
$.cookies.set('map_center', center); 

そして、あなたがクッキーから読んでみたいとき。

var centerpointFromCookie = $.cookies.get('map_center); 
map.setCenter(JSON.parse(centerpointFromCookie)); 
+0

私はLatLngクラスtoStringを使用してシリアライゼーションを忘れてしまいますが、これは他の状況でのアプローチとして理にかなっています。 – Nick

関連する問題