新しいカヌドに叀いカヌド



箄4か月前に、マップを少し曎新するこずにしたした。 これは、ナヌザヌに倚くの泚意を払うセクションの1぀であるず思われたす。

これは4か月前に起こりたしたが、今日だけ、私たちEugene johnny_palec EmelyanovずAnton kashey Korzunovは、 gdeetotdom.ruポヌタルの「On the Map」サヌビスの䜜成の話をしたいず思いたす。 ある意味で私たちは先駆者であり、ある意味では远い぀きたしたが、いずれにせよ倚くの熊手が集められ、最終的にはその皮のナニヌクなサヌビスを埗たした私たちはそれを誇りに思っおいるこずはあたり目立ちたせんか

調査、間違い、発芋をりェブ開発者のコ​​ミュニティず共有したい しかし、たず最初に。





私たちは私たちのものであり、新しい䞖界を築きたす





長い間、私たちのポヌタルには膚倧な量の芖芚的コンテンツがありたした-家の写真、䞭庭のパノラマ写真、郜垂の球圢撮圱。 さらに、建物、レむアりト、むンフラストラクチャ゚リアに関する詳现情報がありたす。 しかし、このコンテンツはポヌタル党䜓に拡散し、倚くの堎合、䞍動産を芋぀けるための補助ツヌルずしお機胜するのではなく、嚯楜をもたらしたした。 私たちの仕事は、情報ず芖芚コンテンツを組み合わせるだけでなく、新しいサヌビスを䞍動産の怜玢、分析、遞択のための独立したツヌルにするこずでもありたした。



むンタヌフェヌスず䜿いやすさ





地図䞊の富をレむダヌの圢で組み合わせ、圓時のサヌビス「Where Is This House」の受信者を䜜成するこずにしたした。このサヌビスでは、地図に家、むンフラストラクチャ、球圢パノラマの写真が衚瀺されたした。 さらに、ビゞュアルコンテンツが衚瀺されるコンテキストで、デヌタベヌスからの䞍動産広告を远加する必芁がありたした。 むンタヌフェむスの研究は、2぀のプロトタむプのモックアップで簡単に説明できたす。バランを䜿甚した叀兞的なアプロヌチず、オブゞェクトに関する情報が別のブロックに衚瀺されるオプションです。 その結果、叀兞的なアプロヌチに萜ち着きたしたが、小さなバランに倧量の情報を配眮するずいう問題を解決する必芁がありたした-決定したずおり、䜜業バヌゞョンで確認できたす。

これを読んだ埌、あなたがもう䞀床あなたの生息地を売買するためだけに私たちを蚪れる䟡倀があるず思ったら、私たちはあなたを倱望させるこずができたす-マップ䞊の新しいサヌビスはあなたが家の近くに新しいカフェを芋぀けお蚈画するのに圹立ちたすバむカヌの別の集䌚 ナむトオオカミ 。



Google + Yandex =盞互に有益な協力





実際、盞互に有益な操䜜:)オブゞェクトはロシア党土に衚瀺する必芁があり、GoogleずYandexのマップのカバレッゞず品質は異なるため、䞡方のAPIを䜿甚するこずにしたした。デフォルトでは、手動で倉曎できるこの地域により適したマップを衚瀺したす。 たた、䜕らかの理由で、遞択したマップのAPIがナヌザヌに察しおデフォルトでロヌドされない堎合、2番目のオプションが自動的にロヌドされたす。

確かに、なぜこれが必芁なのかは完党には理解されおいたせんが、䞀郚の人々がgoogle.comをブロックしおいる䞀方で、他のYandexは䜕らかの理由で機胜しおいるずいう事実は残っおいたす。

以䞋で説明するAPIの基本原則に埓っお、カヌドの䜜業バヌゞョンぞの切り替えが自動的に行われたす。



䞭倮ロシアの地図䜜成レむダヌの繁殖





最初のタスクは簡単でした-カヌドは機胜し、カヌドは適切に機胜するはずです。 そしおできればどこでも。

Google Dayの数日埌の11月䞭旬に開発が始たりたした。

したがっお、私たちのカヌドは

1. Googleマップv3

2.最新バヌゞョンのYandexマップ

3.最良か぀ほがスマヌト。

カヌドの初期バヌゞョンは2週間で準備が敎いたした。

私たちは実際に圌らに以前知っおいたすべおのこずずその過皋で思い぀いたすべおのこずに投資したした。そしお、私たちが実際に真剣な䞍動産サむトであるこずを忘れたしょう。



どこかの5぀のステップ





目暙を蚭定したす-マップに基づいおツヌルを䜜成し、それを実装しようずしたす。

ステップ1-最初にマップを開始する必芁がありたす

ステップ2-その埌、䜕らかの方法で初期パラメヌタヌを蚭定する必芁がありたす

ステップ3-サヌバヌに䜕らかのデヌタを芁求する必芁がある可胜性がありたす

ステップ4-䜕らかの方法でそれらを衚瀺する

ステップ5-そしお最埌に圌らず䜕かをする



そしお今、もう少し



たた、関数呌び出し、モゞュヌル間メッセヌゞなどの90がsetTimeoutを介しお起動されるこずを事前に瀺す必芁がありたす。 ゚ラヌずポッドシ゜ンから保存したす。 詳现が必芁な堎合は、お問い合わせください。

PSたた、このようなタむムアりト_enterState \ _leaveState \ _callStateの理解での呌び出しのラップにより、䜕がどこで開始されたか、どれくらい時間がかかったか、゚ラヌをキャッチできたすただし、callStackをキャッチできたせん window.onerrorの゚ラヌは、これらのerlogを垞に収集および分析したす。 それはあなたが゚ラヌなしで私たちのサむトで䜜業するのに圹立ちたす




ステップ1-APIのダりンロヌド



たず第䞀に、事実の前にあなたを眮きたす-あなたはIPAず盎接通信するこずはできたせん。 䞀般的に。 決しお。

そしお、正盎に蚀うず䟿利ではありたせん。

それでは、通信するオブゞェクトを䜜成したしょう。

SuperMapsず呌びたしょう。

たず、SetWorker、StartWorker、KillWorkerの3぀のメ゜ッドを定矩したす SetMapProviderたたはコンポヌネントの目的を瀺す他のスマヌトワヌドを呌び出す必芁がある瞬間をスキップしたしょう。実際には1぀のタスク-WORKがありたす 

最初のものは䜿甚するカヌドのバヌゞョンを蚭定し、2番目のものはそれを開始したすが、3番目のものはたさにそのように起こりたす。

確かに、ここでの「カヌドのバヌゞョン」は、盎接䜿甚するのではなく、最終的なAPIのラッパヌを意味するこずを明確にする必芁がありたす個人的には、このようなラッパヌは200行以䞋しか占有したせん

正垞に起動するには、次の䞀連のアクションを䜿甚したす。

1.開始タむマヌの開始

2. APIの接続遅延、ここでのGoogleマップの堎合、2぀のステップがありたす-最初に、google.comからgoogle.ruからapiをダりンロヌドしようずしたすうたくいかない堎合。 これは気たぐれではありたせん 誰もが芋おいる゚ラヌログ。

3. API接続チェック

4. IPAを起動したす

5. IPAロヌンチレポヌト

5+。 他のシステムの起動

6ここのどこかで、タむマヌ1が起動したす。カヌドがない堎合は、別のAPIを詊す必芁がありたす。 奇劙なこずに、これは非垞に頻繁に発生したす-ファむアりォヌル、プラグむン、およびわさびの悪いチャンネルは驚異的に機胜したす。



ステップ2-マップ䞊の目的の堎所で錻を突く



この段階では、ある時点でカヌドを開く必芁がありたす。 ここでは特に目立ったものはありたせん-珟圚のビュヌポヌトのパラメヌタヌはURLに保存され、そこから取埗されたす。 それらが存圚しない堎合、「特色のある」アドレスが開かれるか、すでにサむトにアクセスしおいる堎合-サむトの各ドメむン領域の最埌のセッションのデヌタ、Cookieから個別に。 これがそのような機胜です。 非垞に䟿利:)



ステップ3-サヌバヌからデヌタを取埗する



比范的最近、私はタむルのヒヌプの圢でデヌタをダりンロヌドする秘 aboutに぀いおすでに話したしたが、今幎はタむルが倧量にロヌドされない実装では、1぀のリク゚ストで最倧6個がサヌバヌから転送されたす。 より正確には、システムは垞に4぀のストリヌムにデヌタをロヌドしようずしたすが、1぀のパケットでNタむルを超えないようにしたす。

この堎合のタむルアドレスは、 / maptiles / 7-l032 / 103/031/311/011; 21〜2; 20〜21; 19〜100; 最も倧きな目は、ここで7番目のレむダヌの4぀のタむルが芁求されおいるこずに気付くこずができたす。 クラむアントにずっお、このような最適化は、応答時間が短瞮され、トラフィックが節玄されるこずに盞圓したす。ファむルが倧きくなりすぎるず、gzipがより匷くなりたす。 そしおもちろん、デヌタの「クラむアントキャッシング」が意味をなさないこずを忘れおはなりたせん-1日あたりのデヌタ倉曎の90です。 サヌバヌが既補のファむルを1぀のパックにたずめるのは難しくありたせん。鉄です。

確かに、このアルゎリズムには面癜いケヌスが1぀ありたす。最初は、最適化のために、アドレスの配列を取埗し、natsortを実行しお、矎しいURLに分割したした。

奇劙なこずに、このオプションはすべおのブラりザヌで完党に機胜し、最初の配列に40ブロック以䞊ある堎合、IEをしっかりずハングさせたす1぀のレむダヌのフルスクリヌンは6-8のデヌタブロックのリク゚ストを䜜成し、クラむアントは合蚈で50のデヌタレむダヌをアクティブにできたす 

珟時点では、通垞の䞊べ替えを䜿甚しおいたすが、これは最も理想的なオプションではなく、URLが少し長くなる堎合がありたす。

私たちの堎合、このサブシステムのロヌド、保存、および同時に衚瀺制埡は䞭心的であり、 ZTileず呌ばれたす 。



ステップ4-䜕らかの方法でこのデヌタを衚瀺したす



おそらく、䞻芁な建築䞊の問題のいく぀かはディスプレむに関連しおいたす。

そのため、特定のオブゞェクトセットはサヌバヌから取埗され、各オブゞェクトには独自のベヌスタむプ広告、POI、写真などず独自のレむダヌ実際には、デヌタベヌスからの遞択の定矩枈みwhere-expressionのシリアル番号がありたす。

このデヌタに基づいお情報を衚瀺する方法。

次の蚈画に぀いおのコンベダを入手したした。

zTile-Server-data-zTile-SuperMaps-type factory-type-layer-factory- *゜ヌト、クラスタリング* -SuperMaps-APIworker-API-view-type-render

チェヌンは長いので、説明させおください。

zTileはサヌバヌにデヌタを芁求し、その埌デヌタを受信したす。

次に、圌はメむンコンポヌネント-SuperMaps-にオブゞェクトのモデルを䜜成するように䟝頌したす。

SuperMapsは宣蚀されたハンドラヌを調べ、そのうちの1぀がオブゞェクトの受け入れに同意した堎合、このタむプのオブゞェクトの䜜成を委任したす。

オブゞェクトがロヌドされたレむダヌの識別子は、受信したオブゞェクトに「泚がれ」たす。その埌、ファクトリヌがレむダヌを詊行した埌、オブゞェクトのタむプを倉曎できたすより正確には、動䜜を指定したす。

その埌、オブゞェクトは基本的にそれが䜕であり、どのように衚瀺されたいかを知っおいたす。

*䞊べ替え*はステップ5で説明したすが、本質的には、今のずころ、オブゞェクトを単にシャドりから抜け出し、DOMツリヌに自分自身に぀いおのメモを残したす。

オブゞェクトを衚瀺するず、SuperMapsで再びレンダリングに自分自身を送信したす。これにより、珟圚のワヌカヌぞの呌び出しがドロップされ、メヌカヌのビュヌコントロヌル、バルヌンが䜜成されたす。

その埌、運が良ければ、圌は再びIPAのニヌズに適応するために心を倉えるこずができたす。

これはYandexやGoogleマップでは発生したせんが、同じOvi-HTMLをマヌカヌに描画できないだけ-では、システムはそのように動䜜したす。

このアプロヌチの利点の1぀は、最終的なAPIカヌドが本質的に有限であるこずです。

これを倉曎しお、同じフォヌムで同じオブゞェクトのセットを別のマップに衚瀺できたす。マップを倉曎しお、クラスタヌの曎新を呌び出したす。



ステップ5-通垞、デヌタず他のバンズを衚瀺する



デヌタセット、特に倧芏暡なデヌタセット、特に動的に倉化するデヌタセットを衚瀺する際の最も難しい質問の1぀は、マヌカヌが互いに重なり合っおいるこずです。

私たちのクラスタリングオプションIMHOは、私が知っおいる最高のものであり、機胜ず速床の䞡方の点でgooglemarkermanagerv2 \ v3を超えおいたす。

そしお、それは非垞に簡単に機胜したす。

手順3でデヌタを読み蟌むのず同じ原理に埓っお、マップを個別のセルに分割し、それらに含たれるオブゞェクトをこれらのセルにアタッチしたす。

次に、1぀のセルのオブゞェクトのセット内で、盞互のオヌバヌラップが決定され、平凡な結合が発生したす。

ポゞティブな点は1぀だけです。デヌタセットを倉曎しなくおも、グルヌプを再構築する必芁はありたせん。 あるセル内の別のマヌカヌオヌバヌレむのデヌタは完党に静的であり、セルの倉曎のみがこのセットを倉曎できたす。

぀たり、マップをシフトしおいく぀かの新しいオブゞェクトが衚瀺された堎合、新しいセルグルヌプのみが再構築されたす。 私は繰り返したすが、叀いものは静的です。

完党な再構築は、少なくずも1぀の新しいオブゞェクトがクラスタヌグルヌプ内のオブゞェクトのセットに衚瀺たたは非衚瀺になった堎合に、レむダヌがオンたたはオフになったずきにのみ発生したす。

確かに、次のトピックでこの「正方圢にネストされた」クラスタリング方法の結果ずしお、さたざたなアヌティファクトが衚瀺される可胜性がありたす-結局、グルヌプは自埋的に動䜜し、境界に䞀芋豊富なマヌカヌを残すこずを劚げるものは䜕もありたせん。



解決策は簡単です。わずかに異なるクラスタヌサむズもう1ピクセルはもう十分ですで別のclusterManagerを䜜成し、グリッドをそのサむズの半分だけシフトしたす。

最初のマヌカヌをグルヌプ化した結果はそれに分類され、この結果は再びグルヌプ化されたす。

圌は重耇するバランを1぀に぀ぶしたす。 たた、カヌドの操䜜䞭に完党な再構築を行う必芁はありたせん。

確かに、これらの行を曞いおからほが半幎が経過したこずを認識しおおく䟡倀がありたすが、個人的にはアドバむスをしおいたせん。 シングルカヌドではない....




その結果、システムは䜕䞇ものマヌカヌで非垞に明確に機胜したす。もう少し魔法をかけるず、1.5倍高速化できるず思いたす。

しかし、これは必須ではありたせん。すでに2぀のポむントに盎面しおいたす-1. DOMツリヌの速床を曎新する

2.マップ䞊のマヌカヌの数。

私たちは長い間最初の問題を解決し、さたざたなDOMフラグメントを芋お、キロのドックを読みたしたが、最終的には単玔に決定したした-すべおの出珟ず消倱はグルヌプ操䜜であり、トランザクションにラップするだけです衚瀺なし、もう少し、芁玠の取り付け/取り倖しなど䜕床も䜕床も地図を衚瀺したす、リフロヌず再描画を枛らすこずができたす。 DevConfでこの問題に぀いおどうやら蚀われたこずを知りたいのですが私はそうではなかったのですが、私はそこにいたせんでした。

この操䜜は連続したjsコヌドによっお実行されるため、カヌドの「点滅」は衚瀺されたせん。



第二に、正盎に蚀うず、私たちは決めおいたせん。

衚瀺するオブゞェクトの制限は、鉄の友人の速床に応じお倉化する可胜性がある堎合、マヌカヌを折りたたむこずからマップを驚異的にきれいにするこずができるマヌカヌを折り畳むための半埄がありたす。

しかし、出力でただマヌカヌの数が過負荷になっおいる堎合、そのような数のオブゞェクトで通垞の動䜜IE6を保蚌するこずはできたせん-それらを枛らす必芁がありたす。 1぀の芁因を倉曎し、自分自身をリフレッシュしたす。 結果はオブゞェクトが少なすぎる可胜性がありたす-もう䞀床、芁因の1぀を倉曎しお曎新したす。

その結果、アルゎリズムは時々8ティックに収束したす。 確かに、これは実際にはナヌザヌには目立ちたせん。



これで終わりですか



この物語はおそらくはい、終わりです。 トピックのサむズを倧きくしおも意味がありたせん。 最も興味深い瞬間に぀いおは、別の詳现な資料でもう少し詳しく説明したす。

適切なコヌルバックを適切な堎所にむンストヌルする、スラむダヌでカヌドのサむズを倉曎する、「倖郚バラン」おそらくマヌカヌバランなどの単玔なものの実装を匕き続き怜蚎する、デバッグ、ロギングなど、さたざたな埮劙な点...

より良い、私たちはあなたの質問に答えるだけで、それから衚瀺されたす。



次は





珟時点では、「マップ䞊」のサヌビスの3番目のバヌゞョンを既にリリヌスしおおり、近い将来、衚瀺されるコンテンツずむンタヌフェむスアプロヌチの䞡方を拡匵する予定です。 ニュヌスず分析コンテンツはマップに衚瀺され、球䜓プレヌダヌは独立した怜玢ツヌルのようなものに倉わりたす-家では䞍動産のオファヌ、家自䜓の情報が衚瀺され、庭や建物自䜓の内郚などを芋るこずができたす。 しかし、それはたったく異なる話になりたす。 ご枅聎ありがずうございたした。 コメントで質問に答える準備ができたした。



それで、䜕が面癜いのか、なぜ䞊蚘の数キロのテキストを読んでサむト e自䜓を芋る必芁があるか、たたは必芁だったのか

1. 2぀のAPI実際には4+ ovi、+ bing、切り替えの問題なし

2.サヌバヌからデヌタをダりンロヌドし、再読み蟌み

3.マップ䞊の倖郚バラン-ただし、バランを開いおマップを移動する方が良い

4.バルヌン内のマヌカヌずデヌタのクラスタヌ  www.gdeetotdom.ru/map/#lat=55.72867&lng=37.81804&m=google&z=15&l=7-14 、正確にマップの䞋郚および䞭倮にある

5. Yandexマップ䞊にGoogleタむルが衚瀺されたす「ロシア360」ロヌドトラック




All Articles