どこにいるのか教えおください

モスクワ近郊のポドリスク、シリカトナダ2地区では、ラむフハックが1぀ありたす-すでに庭で午埌9時であり、ビヌルが店頭で販売されなくなっおいる堎合-道路を枡っお賌入するだけです。 道路を枡っお、モスクワ-その䞭に11たで垌望を芋぀けるこずができたす。



ただ䞀぀の問題を解決するために残っおいたす-暗い倜に、なじみのない地域で、同じ高局ビルの䞭で...あなたがどちら偎にいるかを芋぀けるために。



歎史的に、「逆ゞオコヌダヌ」はこの質問に答えたす。 Google 、 Yandex 、 OSMなど、ほがすべおのマッピングAPIの重芁な郚分です。 しかし、ほずんどの堎合、圌の答えは人を察象ずしおおり、堎所の説明だけが含たれおいたす。



これは非技術的です そしお確かに非珟実的です。 Esosediは 、このサボテンを数幎間食べおから、リバヌスゞオコヌダヌを䜜成したした。 䞻なものは、どのように、なぜですか。



ごく最近、 圌らはハブでカシチェ゚フの死を怜玢し ネストされたセットず管理芋出しのネスト、 地区を歩き回り地図䞊に地域のデヌタを衚瀺、そしおではない Yandexカりンタヌ ダむレクトゞオコヌダヌに到達したした。 次に、リバヌスゞオコヌダヌずは䜕か、なぜ必芁なのかを芋おみたしょう。 そしお、圌の䜜品の仕組みを分析したす。



パヌト1


゚゜セディは「䞖界地図䞊の堎所」であるこずが歎史的に発展したした。 叀い孊校の広堎ず地理参照。 ただ残念なのは、普通の人の地理座暙は単なる数字のセットであるずいうこずです。 普通の人には䜏所が必芁です。



座暙を䜏所に倉換するために、「逆ゞオコヌダヌ」が䜿甚されたす。 あなたは圌に座暙を䞎え、圌はあなたに特定のアドレスを䞎えたす。 このテキストは、人が特定のオブゞェクトの堎所を理解するのに十分です。 そしお、人間的には、暙準的な実装に぀いお䞍満はありたせん。 しかし、これは「システム」には適しおいたせん。ここでは、テキストの「マッチング」自䜓が安定しおいないため速床が䜎䞋したす、耇数の゜ヌスから、たたは少なくずもさたざたな「プロバむダヌ」による「通垞の」ゞオコヌダヌも同時に怜玢したす。 地理的に近い䜏所の2぀のク゚リは異なるデヌタベヌスにあり、回答は互いに「テキスト」ではありたせん。



ゞオコヌダヌの回答では、音蚳、スペルミス、さらには管理郚門を組み立おるためのさたざたなシステムを芋぀けるこずができたす。

そのため、たずえば、モスクワ垂、぀たりモスクワ垂、たたはモスクワ垂自䜓が入っおいるモスクワ垂に出䌚うこずがありたす。 玔粋に技術的ではありたすが-これは正しいです。 他の郜垂のむメヌゞず肖像で正芏化されたした。 問題は、モスクワがモスクワだけであるこずがあり、実際、応答のフラグによっお、それが郜垂ではないこずです。 「グレヌタヌモスクワ」はただ発明されおいたせん。


もう1぀の暙準的なGoogleゞオコヌダヌ゚ラヌは、通りの座暙の「匕き」、郜垂地区ずの䞍正確な䜜業、略語アルタむ共和囜、およびさたざたな地圢名の䜿甚です。 ロシアはロシアずロシア連邊、そしお通垞のロシア連邊の䞡方になりたす。



私はチェケニア共和囜のAutonomusesが来るのを埅たずに5぀だけのスペルオプション、2幎前に地域のモゞュヌルに基づいおゞオコヌダヌを䜜成したした。



私たちのものでした-あなたのものになりたした。 dadataトピックでのランダムなコメントの埌、 ゞオコヌダヌが公開されたした。



すべおが単玔に機胜したす-あなたは圌に座暙を䞎え、その芋返りに、あなたはこのポむントが入るすべおのosmRelationIdを取埗したす。 管理レベルごずに分解されたす。 どこでもtsiferki、どこでも他の゜ヌスずの通信、どこでも「怜蚌可胜性」。



䜜業を芖芚化するために、 jsfiddle.net / azvjukh8 ずいう䟋がありたす 。その䜜業がずおも奜きだったので、同じこずがメむンのesosediで誇瀺されおいたす。

この䟋のアルゎリズムは次のずおりです。





osmeのリリヌス以来、倚くの人々が私に垌望する地域の怜玢を促進するように頌んでいたす-最埌に、行政区分のハむラむトモゞュヌルの問題の1぀は解決されおいたす-必芁な地域番号を芋぀けるこずの難しさ。 以前は、 data.esosedi.orgにアクセスしお、行政区画の深郚に再垰的に突入する堎所を探すこずが提案されおいたした。



すべおがシンプルになりたした-jsonp pendata.esosedi.org/geocode/v1?[lng=(en|en)†&point=x,y[&seq=?†[&callback=]-24時間、7日週、nginxを䜿甚しお1秒あたり6 *芁求の制限で...



たた、平均しお、IPA Mapsゞオコヌダヌの3倍のリク゚ストを行うこずができたす。 DNSを䜿甚しお前面に沿っお負荷を分散できるナヌザヌの堎合、玄20 RPS+バヌストx4が解攟されたす。



そしお最も重芁なこずは、ポむントが違法に描かれる可胜性のある家屋や通りがないこずです。 たた、完党に異なる囜では、通垞の道路が目的の地点から数癟キロメヌトル離れおいるこずもありたす。 囜、近所、地域のみ...



パヌト2


ゞオコヌダヌは、領域のハンドルで指定されたゞオメトリに基づいお機胜したす。 圌はポむントが入る最小のポリゎンを芋぀ける必芁があり、すべおのポリゎンは「より高い」。 しかし、「より高い」を怜玢する必芁はありたせん-この情報はすでに存圚したす。 しかし、それを収集したのはゞオコヌダヌでした。 すでに述べたように、この党䜓はOSMゞオメトリに基づいおいたす。 OSMからゞオメトリを匕き出すのは簡単ですが、消化するのははるかに困難です。 特に、行政区分の明確な階局構造に固執したす。



原則ずしお、私にずっおも最初の段階はうたくいきたせんでした。珟圚のデヌタベヌスには倚くのゞオメトリがありたせん。特に、䜕らかの理由で今たで誰かが関係を䜜成しおいない倚くの郜垂がありたす。



2番目の「狭い」点は、倚くのリレヌションが間違ったadmin_levelを持っおいるか、たったく持っおいないこずです。 さお、is_inフラグ埓属を持぀人は䞀般的に珍しい獣です。 その結果、最も信頌できるオプションは、ゞオメトリの幟䜕孊的な「パンチ」を䜜成するこずです。



埋め立お地が入っおきたす。 次に、その䞭の特定のポむントを芋぀け、このポむントが含たれる他のすべおのポリゎンを芋぀ける必芁がありたす。 それらをサむズで゜ヌトし、最終的な管理ネストに゜ヌトしたす-小さいオブゞェクトは垞に倧きいオブゞェクトに含たれたす。 これですべおが明確になりたした。











合蚈タスクは2぀に分割されたす。



1.ポむントが入るオブゞェクトをすばやく芋぀けたす。

2.より正確なPointInPolygon怜蚌を迅速に䜜成したす。



原則ずしお、これはリバヌスゞオコヌダヌの本質であり、最も単玔な実装です。 しかし、実際には、最初の埅ち䌏せは次のようになりたす-このたさにポむントを芋぀けるために、すべおのポリゎンでそれを眮き換えたす。



幟䜕孊的䞭心、重心、察数、積分-埓来の方法では、倚角圢の内偎にあるこずが保蚌されおいる点を芋぀けるこずは䞍可胜です。 埋め立お地はどのような圢状でもかたいたせんが、少なくずもその䞭心に穎がありたす。



個人的には、単玔に問題を解決したした-幟䜕孊的䞭心など、ポリゎンに入るこずができる任意の点を取り、「暙準」アルゎリズムでチェックしたす。



暙準のアルゎリズムレむキャスティング、Onは単玔に機胜したす。レむは、巊偎の無限倧からポむントたで発射され、その埌ポリゎンの面ずの亀差が考慮されたす。



奇数回亀差した堎合-私たちは䞭にいたす。 そしお、ポむントは私たちに合っおいたす。



さえあれば-倖。



そしお、終点の䞋では、最初の亀差点から2番目の亀差点たでのセグメントの䞭倮を䜿甚したす。これは正確にポリゎン内にありたす。



党䜓ずしお、ポむントがポリゎンに属しおいるかどうかを刀断するためのアルゎリズムは倚くあり、耇雑さはたったく異なりたす。 前凊理が必芁なものずそうでないものがありたす。 自明でないオプションは、ポリゎンをより「数孊的な」圢匏に倉換しおアルゎリズムの耇雑さを軜枛するか、単にN頂点の数を枛らしたす。 たずえば、最も耇雑なポリゎンは、単玔に分割できたす。 これには、 geoison-vtが適しおいたす。



2番目の興味深いポむントは、ポむントを暪断できる最小オブゞェクトの怜玢です。 オブゞェクトが小さいほど、チェックは高速になりたす。 より正確に。 クワッドたたはRツリヌは、この目的に適しおいたす。 しかし、これはあたりランプではないので、Zコヌドを䜿っおやっおみたしょう。



ZコヌドN、Morton、Peanoは、2D座暙X、Yから取埗される数倀であり、そのため、䞊たたは巊のオブゞェクトは垞にそれを少なく、右ず䞋のオブゞェクトはより倚くを持぀こずができたす。 ネストされたセット。



実際、犯眪者の1人が探しおいるものよりもZ座暙を知っおいるすべおのオブゞェクトを簡単に芋぀けお、Zで䞊べ替えるこずができたすmapboxには、この効果を䜿甚する優れたラむブラリ-earcutがありたす 。



ただし、これが機胜する堎合-これらのコヌドの名前は異なりたす-Zコヌドはゞグザグになりたす。 「右䞋」を怜玢しようずするず、圌は巊に移動したす。 ここでは、マスクの䞋でZorroがビットむンタヌリヌブを隠したす。 Zコヌドからマスキングを介しお、垞にXたたはY座暙を取埗し、それらによる怜玢をさらに制限するこずができたす。 ずころで、これは耳の切り口では十分ではありたせん。











原則ずしお、「空間充填曲線」の䜿甚は、数字のある通垞のベヌスがある堎合、2D怜玢に最も効果的な方法の1぀です。 たずえば、MySQL。 しかし、私はただPostGIS ...



デヌタベヌスから実際のゞオメトリをダりンロヌドし、より正確な蚈算を行うためだけに残りたす。 ここではさたざたな最適化が可胜です。その䞻なものはOSMデヌタの基瀎です。ポリゎンをポリゎンずしおチェックする必芁はありたせん。 ポリゎンはリレヌションです-個々のセグメントのセット。 OSMは、ほが通垞の「トポロゞ」デヌタベヌスです。 2぀の可胜性のある回答に共通するこずが倚い小さなセグメントのみをチェックできたす。



どのくらい速く動䜜したすか -同時実行> 10の動䜜䞭のラップトップでは、玄600RPSが埗られたす。 バトルサヌバヌでは、䞀方では高速で、他方ではドむツにpingを送信したす-60ミリ秒。



䞖界のTotalは、さらに別のリバヌスゞオコヌダヌになりたした。 他の人ずは異なりたす-「怜蚌可胜」Wikipediaの甚語、堎所の「テキスト」の説明だけでなく、信頌できるさたざたなベヌスからのIDも提䟛したす。 圌は家を探しおいるのではなく、通りを探しおいるのではなく、管理の営巣だけを探しおいたす。 そしお、珟圚の基地に入ったものだけです。䟋えば、゚カテリンブルクはそうではなく、郜垂郚のみです。

「通垞の」16進数゚ンコヌダヌが本圓に必芁な堎合は、OSMの䞊で実行されるNominatim 、たたは通垞のAPIマップの通垞のゞオコヌダヌを䜿甚しおください。



...しかし、「狩りの粟神」は消えたす....



圌があなたに䜏んでいる堎合、username、あなたの犠牲者はフィヌドの䟋です-jsfiddle.net/azvjukh8



そのようなゞオコヌダヌの誰かdadataは、通りの゚リアを決定するのに圹立぀かもしれたせん。 ロックをフィルタリングする誰か配信蚈算機。



誰か私が楜しい倜を過ごせるようにするだけです。



応答圢匏のドキュメントはhttps://github.com/esosedi/regionsで入手できたす 。



あなたはただ少し理論を読むこずができたすが、緎習





たたは、ヘキ゜ダヌを自分で収集したす。







PSアルコヌルの販売制限は2014幎12月18日2015幎1月5日に解陀されたした。 珟圚、連邊芏制が州で斜行されおいたす。 しかし、私のようなポドルスクの店には、このニュヌスは届きたせんでした。



All Articles