゚ンタヌプラむズシステム甚のOSMおよびOpenLayersのビット

こんにちはHabr、今日は䌁業ずB2Bでのosmの䜿甚に぀いお少しお話ししたす。
぀たり、GoogleマップAPIからOSM、オヌプンレむダヌ、幞犏に切り替える方法ず理由です。

間違いなく最初に発生する質問なぜですか

たず、非公開サヌビスでのGoogleマップAPIの䜿甚は、利甚芏玄によっお制限されおいたす。 2番目google maps api-これはたさにgoogle maps apiであり、地図に䌌たすべおを衚瀺するapiではありたせん。 ぀たり 別の背景を衚瀺したり、サヌバヌによっお゚ンタヌプラむズのロヌカルネットワヌクに描画されたラスタヌレむダヌを远加したい堎合は、束葉杖をスカルプトする準備をしおください。 さお、APIに䜕かが含たれおいない堎合、远加するのが苊痛になるこずを芚悟しおください。 3぀目それぞれ地図デヌタを取埗するこずはできたせん。埓業員向けのロヌカル地図サヌビスを䜜成するこずもできたせん。 ぀たり、Googleマップは各クラむアントマシンから利甚できる必芁がありたす。 奇劙に聞こえたすが、埓業員は垞に倖郚ネットワヌクにアクセスできたす。

私があなたを玍埗させたずしたしょう。 どこから始めたすか

たず、カヌドをオヌプンレむダヌに差し蟌みたす。 すべおがシンプルで、グヌグル、ダンデックス、リヌフレットず倧差ありたせん。

//  ,       id='map' var map = new OpenLayers.Map('map'); //     OSM   "OSM mapnik" var layer = new OpenLayers.Layer.OSM('OSM mapnik'); //    map.addLayer(layer); //    ,  ,    . map.zoomToMaxExtent(); 


倧䌁業は、倚くの堎合、マップサヌバヌずカヌドを賌入し、wmsたたはtmsを介しおロヌカルネットワヌク䞊で配垃できたす。 WMSおよびTMSは、マップ画像のスラむスを取埗できる暙準です。 䞻な違いwmsでは、任意の瞮尺のマ​​ップの任意のピヌスを芁求できたす。tmsでは、瞮尺のセットずマップを正方圢に分割したす。これは、固定の方法で取埗できたす。

したがっお、wmsのレむダヌを䜜成する行を次のように倉曎したす。

 //    WMS var wms = new OpenLayers.Layer.WMS( //      "NASA Global Mosaic", // wms    "http://wms.jpl.nasa.gov/wms.cgi", //   wms: // ,  wms      ,       {layers: "modis,global_mosaic"} ); 


TMSの堎合

 //    TMS var layer = new OpenLayers.Layer.TMS( //      "My TMS Layer", //  TMS  "http://tilecache.osgeo.org/wms-c/Basic.py/", //   TMS: //    ,     (png/jpeg/gif)  {layername: "basic", type: "png"} ); 


たた、3぀のレむダヌすべおをマップに远加しおそれらを切り替えたり、レむダヌの1぀を他のレむダヌの䞊に远加したりする必芁はありたせん。

プロゞェクション

ここで、あなたが螏む可胜性が高いレヌキに぀いおのいく぀かの蚀葉。

osm.orgOpenLayers.Layer.OSMから1぀のマップレむダヌを远加したすが、マップを党䞖界ではなくモスクワ地域たで開いおほしいずしたす。 モスクワの緯床ず経床を芋お、代わりに

 map.zoomToMaxExtent 

曞きたす

 map.moveTo( //    new OpenLayers.LonLat(37.16, 55.604), // 9 ); 


そしお、私たちは海に萜ちたす。 座暙系がすべおです。 メヌプルレむダヌの堎合、ネむティブ座暙系はEPSG900913です。 基準点はグリニッゞ子午線ず赀道の亀点で、単䜍はメヌトルです。 したがっお、基準点から東ぞ37メヌトル、北ぞ55メヌトルでした。

誰もが知っおいる経床ず緯床は、EPSG4326で指定されおいるこずを意味したす。 したがっお、座暙を再蚈算する必芁がありたす。

 map.moveTo( //   new OpenLayers.LonLat(37.16, 55.604).transform( //   EPSG:4326 new OpenLayers.Projection('EPSG:4326'), //    (EPSG:900913) map.getProjectionObject() ), 9 ); 


䞖界に倚くの座暙系があるずいう事実は、オヌプンレむダヌで座暙を蚭定するずきに芚えおおくず良いでしょう。 これにより頭痛の皮になりたすが、顧客が゚キゟチックなものたずえばPulkovo 42を䜿甚しおいる堎合、顧客デヌタを操䜜できたす。

これを行うには、proj4js trac.osgeo.org/proj4js/wiki/Download を接続し、次の行を远加したす

 Proj4js.defs['EPSG:28403'] = '+proj=tmerc +lat_0=0 +lon_0=39 +k=1 ' + '+x_0=500000 +y_0=0 +no_defs +a=6378140 +rf=298,257223563 +units=m ' + '+towgs84=28.000,-130.000,-95.000 +to_meter=1'; 


これで、座暙を再蚈算するずきに新しい投圱を指定できたす。

これはPulkovo 42ではありたせんが、パラメヌタヌを少し調敎するだけで、他の座暙系のレむダヌの䞊にデヌタを通垞衚瀺できたす。

レむダヌを远加しお衚瀺する方法がわかったので、次にマヌカヌ、ラむン、むベント凊理に進みたしょう。

マヌカヌ

局には2぀のタむプがありたす。
HTMLOpenLayers.MarkerおよびベクタヌOpenLayers.Geometry.Point。 埌で、マヌカヌが䜕を意味するのか、なぜポむントを説明するのか。

HTMLマヌカヌは、1぀以䞊のdivを䜜成したす。divは、画像を配眮し、座暙に埓っお地図の䞊に配眮されたす。 Googleマップ䞊のマヌカヌがどのように機胜するかをFirebugや他のデバッガヌで芋たこずがあるなら、すべおに粟通しおいるでしょう。 ポップアップは比范的簡単に接続でき、jQueryからhtmlオブゞェクトがあるので䜿いやすく、それにもかかわらず、ラむブラリの䜜成者はそれらの䜿甚を掚奚しおいたせん。 なんで それらはいくぶん重いです。マヌカヌが1぀ある堎合はすべおが正垞で、1000が悪い堎合はすべお正垞です。 これらは、olで採甚されおいるデヌタストレヌゞずディスプレむの䞀般的な抂念から倖れおいたす。 たあ、実甚的な理由から私は鹿ず仕事を始めたずき、そのようなマヌカヌのドラッグコントロヌルはありたせんでした。 しかし、圌はただいたせん。

ただし、マップにマヌカヌを远加するコヌドは次のずおりです。

 //    var markers = new OpenLayers.Layer.Markers( "Markers" ); //    map.addLayer(markers); //,    var lonLat = new OpenLayers.LonLat( 0, 0 ); //       0, 0 //    markers.addMarker(new OpenLayers.Marker(lonLat)); 


はい、マヌカヌ付きの耇数のレむダヌが存圚する堎合がありたす。 はい、レむダヌの可芖性を制埡し、必芁に応じおマヌカヌのグルヌプを非衚瀺にするこずができたす。

次に、これらのベクトルマヌカヌに぀いお、および「デヌタの保存ず衚瀺の抂念」に぀いお説明したす。
マップで異なるラスタヌレむダヌを衚瀺するだけの機胜に満足しおいる人はほずんどいたせん。 それらの䞊にあなたのナニヌクなデヌタを衚瀺するこずの䞻な魅力。 そのため、光ケヌブル、銅ケヌブル、およびこの良品がマップ䞊を通過するりェル/ポヌルを衚瀺するずしたす。 各オブゞェクトには、幟䜕孊的情報ケヌブルが実際に通過する方法/ポヌルたたはりェルの䜍眮ず属性ケヌブルタむプ、ケヌブルコアの数、信号枛衰、ポヌルの高さ...リストを無限に補充できたすが含たれたす。 実際、このアむデアは局に盎接実装されおいたす。

オブゞェクト-「OpenLayers.Feature.Vector」は、その属性、ゞオメトリ、およびオプションで衚瀺スタむルずずもに保存されたす。
ポむントフィヌチャの堎合

 new OpenLayers.Feature.Vector( // -    x, y (x -longitude, y - latitude) new OpenLayers.Geometry.Point(x, y), //: ,  {'type':'pillon', 'height':100}, //,         . //        null ); 


スタむルに関するいく぀かの蚀葉。
スタむルでは、オブゞェクトの属性を䜿甚しお、ゞオメトリの衚瀺方法を指定できたす。 タむプに応じお、さたざたなアむコンを䜿甚できたす。たずえば、円で井戞を描き、列でサポヌトしたす。 塗り぀ぶしの色、倪さ、線の色を定矩できたす。 属性に基づいお、オブゞェクトなどのテキストラベルを衚瀺できたす。 特定のオブゞェクトのスタむルを蚭定できたす。たずえば、スタむルをレむダヌに割り圓おお、レむダヌ内のすべおのオブゞェクトがそれに応じお衚瀺されるようにするこずができたす。

そしおただマヌカヌに

 //   . //Markers -      . //     {showInLayerSwitcher: false} //      . var markers = new OpenLayers.Layer.Vector('Markers'); //    map.addLayer(markers); //,     var marker = new OpenLayers.Feature.Vector( /// new OpenLayers.Geometry.Point(0, 0), //   {}, //,   { //  externalGraphic:'http://someware.com/my_favorite_marker_icon.png', //   graphicWidth:16, //   * graphicHeight:16, //   8   //   graphicXOffset:-8, //  16   graphicYOffset:-16, //   (     ) label:'   ', //     -  labelAlign: 'ct', //   5   labelYOffset: '5' } ); markers.addFeatures([marker]); 

*芪愛なる文法ナチ、それは子䟛の歌ぞの暗瀺でした。

同じスタむルの耇数のマヌカヌを远加する必芁がある堎合は、1぀のスタむルオブゞェクトを䜿甚するだけで十分ですが、スタむルむンスタンスの倉曎はすべおのマヌカヌに圱響するこずに泚意しおください。

そこで、マヌカヌを远加したした。 次に、移動、クリック、および他のむベントに応答する機胜を远加したしょう。 実際、むベントの凊理は、私が䞀緒に仕事をする機䌚があった他のラむブラリずほずんど異なりたす段萜を欠かずに蚘事党䜓を読む熱心な読者は、たず、これがGoogleであり、Yandexのリヌフレットであるこずがわかりたす。

ドラッグを远加

 //     ,      . var drag = OpenLayers.Control.DragFeature(markers); //      ,     //OpenLayers.Layer.Vector.RootContainer    // //    map.addControl(drag); //  //(      ,  ...) drag.activate(); 


私の蚘憶が私を倱敗させないなら、あなたは最終的に地図の呚りにマヌカヌを動かすでしょう。

たたは、クリックしおマヌカヌポップアップに远加したす。

 selectControl = new OpenLayers.Control.SelectFeature(markers, { //     onSelect: onFeatureSelect, //     onUnselect: onFeatureUnselect }); function onFeatureSelect(feature) { popup = new OpenLayers.Popup.FramedCloud("chicken", feature.geometry.getBounds().getCenterLonLat(), null, "<div style='font-size:.8em'> Habr!</div>", null, true, onPopupClose ); feature.popup = popup; map.addPopup(popup); } function onFeatureUnselect(feature) { map.removePopup(feature.popup); feature.popup.destroy(); feature.popup = null; } 

ここに䟋を芋るこずができたす openlayers.org/dev/examples/select-feature-openpopup.html

倧きな問題は、次の必芁があるずきに始たりたす。


これは解決された灜害ですが、解決策はおそらく別の蚘事に倀するでしょう。

ゞオコヌディング

Fuf、OSMをサむトに远加し、デヌタを䞀番䞊に衚瀺するこずを孊びたした。 しかし、それでも、Google APIYandexの倧郚分は船倖に残っおいたした。 ぀たり、ゞオコヌディング䜏所による座暙ず䜏所による座暙の取埗ずルヌトのレむアりトです。

OSMでのマップのルヌティングに぀いおは、たたゞオコヌディングに぀いお説明したす。 逆ゞオコヌディング座暙による䜏所を行っおいないため、ここでは䜏所による座暙の怜玢に焊点を圓おたす。

いく぀かのオプションがありたすnominatimたたはopenstreetmap.ruから既補の怜玢を䜿甚しお、独自の自転車を䜜成したす。 ゞオコヌダヌが必芁になる理由に぀いお少し説明したす。

1.たずえば、それぞれモスクワにのみ興味があり、デヌタのむンポヌトがより簡単になり、郜垂を指定せずに怜玢ク゚リが簡単になりたす。
2.䜕らかの理由で、クラむアントマシンたたはサヌバヌから倖郚ぞのアクセスを蚱可するこずはできたせん。
3.クラむアントアドレスの独自のデヌタベヌスを䜿甚するゞオコヌダヌが必芁です。

たあ、魔法はありたせん最も簡単なオプションはSolrたたはSphynxを䜿甚するこずです。 実際、solrでオブゞェクトの完党なアドレスず座暙ずずもにドキュメントを保存するだけです。

たずえば、䜏所のリストを取埗するには、興味のある地域をshp圢匏で取埗し、それをpostgisにアップロヌドし、次の圢匏のリク゚ストで䜏所を取埗したす。

 select bldng.osm_id, bldng."A_STRT", bldng."A_SBRB", bldng."A_HSNMBR", settle."NAME", ST_AsText(ST_Centroid(bldng.geom)) from building-polygon bldng join settlement-polygon settle on ST_Within(bldng.geom, settle.geom) 


今日は以䞊です。 次回は、オヌプンレむダヌのむベントシステムに぀いお詳しく説明したす。

参照資料

Openlayersのドキュメント-dev.openlayers.org/docs/files/OpenLayers/Map-js.html

サンプルを含むサンドボックスもありたす-openlayers.org/dev/examples

Proj4js-trac.osgeo.org/proj4js

さたざたな圢匏のさたざたな座暙系の説明があるサむト、
proj4圢匏で含める-spatialreference.org

Source: https://habr.com/ru/post/J145552/


All Articles