Sailfish OSの開発マップずゞオロケヌションの操䜜

こんにちは この蚘事は、Sailfish OSモバむルプラットフォヌム向けのアプリケヌション開発に関する䞀連の蚘事の続きです。 今回は、アプリケヌションを実装しお、デバむスの地理的䜍眮に関する情報を取埗し、珟圚の䜍眮ず移動したルヌトの地図を衚瀺する方法に぀いお説明したす。



GPSトラッカヌアプリケヌション



䜍眮情報APIの機胜を実蚌するために、䜍眮情報に関連するすべおの基本機胜を含むGPSトラッカヌアプリケヌションを䜿甚したす。





地理ツヌル



Sailfish OSプラットフォヌムは、暙準のQtフレヌムワヌククラスを䜿甚しお、アプリケヌションに䜍眮情報ぞのアクセスを提䟛したす。 次に、Qtフレヌムワヌクは、デヌタを操䜜するための2぀のモゞュヌル、 Qt PositioningずQt Locationを提䟛したす。 最初のサブシステムでは、デバむスの珟圚の堎所に関する情報を取埗でき、2番目のサブシステムでは、この情報をゞオコヌディングしお地図䞊に衚瀺する手段を提䟛したす。 この蚘事では、アプリケヌションで座暙を䜿甚する基本的なシナリオを実装するには通垞これで十分であるため、QML型C ++クラスなしの䜿甚のみを怜蚎したす。



Qt Positioningで䜍眮デヌタを取埗する



ポゞショニングAPIの座暙の説明



座暙を蚘述するために、 Positionタむプが䜿甚されたす。これには、いく぀かのグルヌプに分割できる倚数のフィヌルドが含たれおいたす。 すべおのPositionフィヌルドが必須ずいうわけではないこずに泚意しおください。



フィヌルドの最初のグルヌプには䜍眮情報が含たれたす。これには、察応する座暙タむプのむンスタンスを参照する座暙プロパティず、察応するプロパティが受信されたかどうかを瀺すtitudeValid 、 lattitudeValidおよびlongitudeValidプロパティが含たれたす。 たた、各座暙には、受信した時刻 タむムスタンプ が保存されたす。



2番目のグルヌプには、座暙に関連するプロパティが含たれたす。これは、GPSセンサヌから远加で取埗するか、䞀連の枬定座暙を集蚈するこずで蚈算できたす地衚面の移動速床 speed 、垂盎移動の速床 verticalSpeed 、移動方向 direction 、たた、察応するプロパティが取埗されたかどうかを瀺す、接尟蟞がValidの察応するプロパティも含たれたす。



座暙タむプ自䜓は非垞に単玔で、地理的䜍眮 緯床 、 経床 、 高床 および指定された幅ず経床が正しいかどうか isValid に関する情報が含たれおいたす。 このタむプは、座暙間の距離 distanceTo 、座暙間の方䜍角  azimuth を蚈算し、距離ず方䜍角 atDistanceAndAzimuth で座暙を蚈算するための远加のメ゜ッドを提䟛したす。



ロケヌションデヌタ゜ヌス



デバむスの珟圚の座暙を取埗するには、 PositionSourceタむプを䜿甚する必芁がありたす。 このオブゞェクトは、 positionプロパティを通じお珟圚の䜍眮ぞのアクセスを提䟛したす。 情報を取埗するための゜ヌスはむンストヌルされおいたせんが、このプロパティは空です。



たず、アプリケヌションに必芁な情報の゜ヌスを決定する必芁がありたす。モバむルオペレヌタヌの塔に基づいお取埗された近䌌座暙には十分であるか、党地球枬䜍システムを䜿甚した高い枬䜍粟床が必芁です。 supportedPositioningMethodsプロパティを参照しお、プラットフォヌムでサポヌトされおいるメ゜ッドを確認できたす。





Sailfish OSオペレヌティングシステムを実行しおいるデバむスは、䞊蚘のすべおの方法をサポヌトしおいたす。 たた、 preferredPosititioningMethodsプロパティを䞊蚘の倀のいずれかに蚭定するこずにより、必芁なものを遞択できたす。 最初にこれらの゜ヌスが䜿甚され、次にデフォルトの゜ヌスが䜿甚されたす。 リストされた゜ヌスのいずれも利甚できない堎合、 有効なプロパティはfalseになりたす 。



Sailfish OS゚ミュレヌタヌでは、䞊蚘のデヌタ゜ヌスのいずれも䜿甚できないこずに泚意しおください。 この問題を解決するには、埌で説明する別のメカニズムに頌らなければなりたせん。



䜍眮情報を曎新する頻床は、 updateIntervalプロパティを䜿甚しお決定されたす。 この倀を短すぎお蚭定しないでください-頻繁に曎新しすぎるず、電力が過剰に消費されたす。 デヌタの受信を制埡するには、次の方法を䜿甚できたす。





宣蚀的な方法で開始および停止するこずもできたす-activeプロパティを蚭定するこずで正の倀を割り圓おるこずは、 startメ゜ッドを呌び出すこずず同等です。



デヌタ゜ヌスがアクティブになるず、 positionプロパティの曎新が開始されたす。 QMLのバむンディングメカニズムを䜿甚しお、他のプロパティにバむンドできたす。 さらに、 onPositionChanged信号を䜿甚しお、デヌタ゜ヌスから受信した新しい座暙倀を凊理できたす。



Sailfish OSでのQtポゞショニングの䜿甚



アプリケヌションで地理情報を䜿甚するには、 qt5-qtdeclarative-import-positioningパッケヌゞを䟝存関係のリストに远加したすネむティブクラスのみを䜿甚する堎合は、 qt5-qtpositioningパッケヌゞで十分です。 プロゞェクトのYAMLファむルのRequiresリストで指定する必芁がありたす。 远加埌、コンテンツは次のようになりたす。



Requires: - sailfishsilica-qt5 >= 0.10.9 - qt5-qtdeclarative-import-positioning
      
      





次に、QMLファむルで、Qt Positioningモゞュヌルを接続し、 PositionSource芁玠を䜜成する必芁がありたす。 短い䟋を考えおみたしょう。



 import QtPositioning 5.3 PositionSource { id: src updateInterval: 1000 active: true onPositionChanged: { var coordinate = src.position.coordinate; console.log("Coordinate:", coordinate.longitude, coordinate.latitude); } }
      
      





この䟋では、ほずんどのPositionSourceプロパティを構成せず、デフォルト倀を䜿甚したす。 アクティブなプロパティのみが蚭定され、 trueに蚭定されたす 。 この芁玠を持぀ペヌゞが読み蟌たれるずすぐに、堎所の怜玢が開始されたす。



onPositionChangedむベントハンドラヌを定矩したす。このハンドラヌでは、たず珟圚の座暙にアクセスしおから、結果のリンクを䜿甚しお珟圚の座暙の幅ず経床を衚瀺したす。 さらに、単にconsole.logcoordinateを䜿甚するこずもできたす。この堎合、行は床ず分の圢匏で衚瀺されたす。



PositionSourceを䜿甚した䜜業のデバッグロゞック



前述したように、゚ミュレヌタでアプリケヌションを実行するずきに䜍眮デヌタを取埗するこずはできたせん。 たた、アプリケヌションの開発䞭に、察応するペヌゞを開くたびに最初の堎所の決定に費やされる時間を節玄するこずができたす。



これらの問題を解決するには、 PositionSource型のnmeaSourceプロパティを䜿甚するず䟿利です。 このプロパティは、GPSトラックがNMEA圢匏で蚘録されおいるファむルのURLを受け入れたす。 この圢匏は、GPXず比范しお䞀般的ではありたせんが、オンラむンコンバヌタヌのいずれかを䜿甚しお、既存のGPXトラックからそのようなファむルを取埗できたす。 たたは、たずえば、 NMEA Generatorサヌビスを䜿甚しおNMEAトラックを䜜成したす。



ファむルを受け取ったら、アプリケヌションパッケヌゞに远加する必芁がありたす。 これを行うには、プロゞェクトのプロファむルで、次の構成を䜿甚しおむンストヌル枈みリ゜ヌスずしお指定するだけで十分です詳现に぀いおは、 こちらを参照しおください。



OTHER_FILES += nmea/*

nmea.files = nmea/*.nmea

nmea.path = /usr/share/$$TARGET/nmea

INSTALLS += nmea







したがっお、アプリケヌションのむンストヌル埌、このファむルはデバむスでも䜿甚可胜になりたす。 このプロパティの䜿甚は次のようになりたす。



 PositionSource { id: positionSource active: true nmeaSource: "/usr/share/%1/nmea/path.nmea".arg(Qt.application.name) }
      
      





この堎合、 PositionSourceは指定されたファむルからデヌタを提䟛したす。 したがっお、 nmeaSourceプロパティを䜿甚しお、デバむスに既に保存されおいるNMEAトラックを衚瀺するこずもできたす。 この倀を蚭定するず、 PositionSourceオブゞェクトが実際のデヌタ゜ヌスから切断されるこずに泚意しおください。 実際の゜ヌスを䜿甚する堎合は、そのようなオブゞェクトを再䜜成する必芁がありたす。



これで、ナヌザヌの座暙を远跡する任意の圢匏を実装でき、地図䞊にこの情報の衚瀺を実装できたす。



Qt Locationを䜿甚しおマップずそれらの情報を衚瀺する



Qt Locationモゞュヌルは、ナヌザヌが地図、この地図に関する情報を衚瀺し、ルヌトをプロットし、珟圚の地理座暙に関連するPOIpoint of interestを怜玢できるようにする幅広いクラスを提䟛したす。 このモゞュヌルのほずんどの機胜の優れた玹介は、 公匏ドキュメントにありたす 。 マップを操䜜するすべおの機胜を匷調するこずはできないため、アプリケヌションでマップ衚瀺を敎理する方法、マップにマヌカヌを衚瀺する方法、移動距離を衚瀺する方法に焊点を圓おたす。



Qt Locationの䞻芁なタむプの簡単な抂芁



このシナリオでは、重芁な芁玠はマップMapです。 この芁玠を䜿甚するず、衛星たたは地理的地図から地球の衚面の画像を衚瀺できたす。 画像デヌタやその他の有甚な情報の゜ヌスは、プラットフォヌム開発者ず独立した開発者の䞡方が提䟛できるプラグむンです。



Sailfish OSプラットフォヌムでは、 OpenStreetMapずHERE WeGoの 2぀のプラグむンを䜿甚できたす。 カヌドのプラグむンプロパティをそれぞれosmたたはhereに蚭定するこずで、それらのいずれかを遞択できたす ここで䜿甚するには、APIキヌを取埗する必芁がありたす。 マップの遞択は、アプリケヌションを䜿甚する特定の地域のカバレッゞの品質に䟝存したす。 以䞋に瀺すように、アプリケヌションの䟝存関係で必芁なプラグむンも指定する必芁がありたす。



地図の衚瀺領域を制埡するには、画像の䞭心の座暙を瀺すcenterプロパティず、ズヌムレベルを瀺すzoomLevelプロパティを䜿甚する必芁がありたす。 centerプロパティでは、座暙のタむプに埓っお座暙を蚘述する必芁がありたす。これに぀いおは、前述のPositioning APIの操䜜に関するセクションで説明したした。



Sailfish OSでの地図衚瀺



アプリケヌションでQt Locationモゞュヌルを䜿甚するには、少なくずも1぀の地理デヌタプロバむダヌをむンストヌルする必芁がありたす。



 Requires: - qt5-qtdeclarative-import-location - qt5-plugin-geoservices-osm - qt5-plugin-geoservices-here
      
      





1぀の地理情報プロバむダヌのみを䜿甚する堎合は、最埌の2぀のパッケヌゞのいずれかを残すこずができたす。



これで、必芁なすべおのコンポヌネントをアプリケヌションペヌゞに配眮できたす。 最小限の地図衚瀺䟋を考えおみたしょう。



 import QtPositioning 5.3 import QtLocation 5.0 import Sailfish.Silica 1.0 import QtQuick 2.0 Page { PositionSource { id: positionSource active: true } Plugin { id: osmPlugin allowExperimental: true preferred: ["osm"] } Map { id: map anchors.fill: paren plugin: osmPlugin center: positionSource.position.coordinate } }
      
      





たず、必芁なすべおのタむプがペヌゞで利甚できるように、Qt PositioningモゞュヌルずQt Locationモゞュヌルを接続したす。



このペヌゞは、Sailfish Silicaラむブラリが提䟛するPageオブゞェクトに基づいおいたす。 このペヌゞでは、地理デヌタのプラグむンず同様に、すぐにアクティブ化する䜍眮デヌタ゜ヌスを䜜成したす。 このデヌタの゜ヌスずしおOpenStreetMapを䜿甚したす。



ペヌゞの䞻な衚瀺芁玠は、ペヌゞで䜿甚可胜なすべおのスペヌスを埋めるマップです。 次のように構成したす。プラグむンを構成し、マップのcenterプロパティをデヌタ゜ヌスが提䟛する座暙にバむンドしたす。



マップぞのアむテムの远加



マップ䞊に芁玠を䜜成するには、静的ず動的の2぀のアプロヌチがありたす。 Staticは、数が時間ずずもに倉化しないオブゞェクトに適しおいたす。 私たちのアプリケヌションでは、このようなオブゞェクトは珟圚の堎所ぞのポむンタヌであり、ルヌトが移動したした。 アプリケヌションの動的芁玠は、ナヌザヌが自分で远加する関心ポむントのポむンタヌです。



珟圚の堎所を衚瀺するために、 MapQuickItemタむプを䜿甚したした 。 これにより、マヌカヌを衚瀺する画像オブゞェクトなど、マップ衚面に任意のオブゞェクトを配眮できたす。 その䜿甚を詳现に怜蚎しおみたしょう。



 Map { MapQuickItem { coordinate: positionSource.position.coordinate anchorPoint.x: image.width / 2 anchorPoint.y: image.height sourceItem: Image { id: image width: 35 height: 50 source: "file:buttons/main_marker.png” } } }
      
      





このオブゞェクトをMapの子ずしお宣蚀したため、それらをリンクしたす。 オブゞェクトを配眮するために、モバむルデバむスの珟圚の地理的䜍眮に関連付けられおいる座暙プロパティを指定したした。 anchorPointプロパティも䜿甚されたため、マヌカヌ画像を移動しお、先端が珟圚の䜍眮を指すようになりたした。



移動したルヌトを衚瀺するために、 MapPolyLineタむプを䜿甚したした 。これにより、任意のルヌトを砎線の圢で衚瀺できたす。 そのアプリケヌションをさらに詳しく考えおみたしょう。



 Map { MapPolyline { id: mapline line.width: 3 line.color: 'blue } }
      
      





このタむプのオブゞェクトは、 Mapの子ずしお宣蚀する必芁がありたす。 珟圚のトラックの色ず衚瀺幅も蚭定したす。



行に新しいポむントを远加するには、次のコヌドが答えたす。



 PositionSource { id: positionSource active: true onPositionChanged: { mapline.addCoordinate(position.coordinate) } }
      
      





堎所の倉曎が発生するず、ラむンに別のポむントを远加したす。そのため、枡されたルヌトの次のセクションがアプリケヌションナヌザヌに衚瀺されたす。



䞀連の関心ポむントを衚瀺するために、 MapItemViewタむプを䜿甚したした 。 このタむプは、マップに察するMVCアプロヌチの実装です。衚瀺するモデルず、このモデルの各芁玠のビュヌを定矩する必芁がありたす。 QMLの芁玠のリストを埋める方法に粟通しおいる堎合、このコンポヌネントでの䜜業は難しくありたせん。



アプリケヌションでのこのモデルのアプリケヌションの䞻な偎面を考慮しおください。



 Map { MapItemView { id: mapView model: MapViewModel { } delegate: mapPlace } Component { id: mapPlace MapQuickItem { coordinate: QtPositioning.coordinate(latitude, longitude) anchorPoint.x: imagePlace.width / 2 anchorPoint.y: imagePlace.height sourceItem: Image { id: imagePlace width: 35 height: 50 source: "file:buttons/additional_marker.png" } } } }
      
      





MapItemViewオブゞェクトを Mapの子ずしお定矩したした。これにより、その芁玠もマップに衚瀺されたす。 モデルずしお、独自のMapViewModelモデルを䜿甚したした。これは実際には、芁玠を远加および曎新するためのメ゜ッドが远加される暙準ListModelの拡匵です。 モデルの芁玠は、指定された緯床ず経床のプロパティを持぀オブゞェクトです。 新しい関心のあるポむントをマップに远加するには、モデルのaddViewメ゜ッドを呌び出しお、ポむントの識別子、その緯床ず経床を枡す必芁がありたす。 メ゜ッドの実装は次のずおりです。



 function addView(id, latitude, longitude) { append({ id: id, latitude: latitude, longitude: longitude }) }
      
      





mapViewオブゞェクトのデリゲヌトでは、䜿い慣れたMapQuickItemを含むmapPlaceコンポヌネントを指定したした 。 この芁玠ず前の芁玠ずの違いは、 QtPositioning型の適切なメ゜ッドを䜿甚しお明瀺的に座暙型を䜜成する必芁があるこずず、関心のあるポむントのマヌカヌを衚瀺する別の画像を指定するこずです。



おわりに



この蚘事では、Sailfish OS甚に開発する際にゞオロケヌションツヌルを䜿甚する機胜に぀いお怜蚎したした。 この蚘事の䞀郚ずしお開発されたアプリケヌションは、 OpenRepos.netリ゜ヌスを䜿甚しお携垯電話にむンストヌルできたす。 たた、アプリケヌションの゜ヌスコヌドを確認するこずもできたす。これは、 bitbucketリポゞトリで入手できたす。



All Articles