場所 (C++)
概要
Places API を使用すると、ユーザーは場所や注目スポットを検索し、住所や連絡先情報などの詳細を確認できます。場所によっては、画像やレビューなどの豊富なコンテンツが用意されている場合もあります。また、Places API では場所やカテゴリの管理も容易になり、ユーザーはそれらを保存したり削除したりすることができます。
場所の定義
「場所」とは、関心のあるスポットのことであり、お気に入りのレストラン、公園、あるいは誰かの自宅などが該当します。「QPlace 」オブジェクトは、その場所に関するさまざまな情報を格納するコンテナとして機能し、場所を表します。
この情報は、大きく2つの分類に分けられます
- 詳細
- リッチコンテンツ
場所の詳細には、名称、所在地、連絡先情報など、その場所に関する属性が含まれます。検索の結果として場所が返されると、これらの詳細情報が入力されます。帯域幅を節約するため、ユーザーが関心を持っている場合に限り、場所ごとに個別に取得可能な詳細情報がある場合もあります。QPlace::detailsFetched() 関数を呼び出すことで、利用可能な詳細情報がすべて取得されているかどうかを確認でき、取得されていない場合はQPlaceManager::getPlaceDetails() を使用して取得することができます。検索時にどの詳細情報が表示され、どの情報を個別に取得する必要があるかは、プロバイダによって異なる場合があります。詳細については、プラグインのドキュメントを参照してください。
場所のリッチコンテンツは、画像、レビュー、記事などの項目で構成されています。リッチコンテンツの項目数は多くなる可能性があるため、場所の詳細とは別個に扱われます。これらはQPlaceManager::getPlaceContent() を通じてページ単位で取得できます。必要に応じて、コンテンツを場所に割り当てて、便利なコンテナとして機能させることも可能です。
一般的な操作
マネージャーの初期化
「All places」の機能はすべて、QPlaceManager インスタンスによって実現されています。 を作成するには、QGeoServiceProvider を指定する必要があります。QPlaceManager
//The "provider name" is used to select a particular provider
QGeoServiceProvider *provider = new QGeoServiceProvider("provider name");
QPlaceManager *manager = provider->placeManager();ディスカバリー/検索
検索操作を実行するには、QPlaceSearchRequest を作成し、検索語や検索センターなどの必要な検索パラメータを設定するだけです。
//instantiate request and set parameters
QPlaceSearchRequest searchRequest;
searchRequest.setSearchTerm("ice cream");
searchRequest.setSearchArea(QGeoCircle(QGeoCoordinate(12.34, 56.78)));
//send off a search request
/*QPlaceSearchReply * */ searchReply = manager->search(searchRequest);
//connect a slot to handle the reply
connect(searchReply, &QPlaceSearchReply::finished, this, &RequestHandler::handleSearchReply);このリクエストは非同期操作であるため、リクエストの完了を処理するためのスロットが必要です。ハンドラー内では、エラーがないこと、および検索結果のタイプが「場所」であることを確認します。条件が満たされていれば、その場所の主要な詳細情報を取得できます。スロットの終了時には、返信は1回限りの使用のみを目的としているため、削除します。
voidhandleSearchReply() {
if(searchReply->error()==QPlaceReply::NoError) {
for(constQPlaceSearchResult&result: searchReply->results()) {
if(result.type()==QPlaceSearchResult::PlaceResult) {
QPlaceResult placeResult=result;
qDebug() << "Name: " << placeResult.place().name();
qDebug() << "Coordinate " << placeResult.place().location().coordinate().toString();
qDebug() << "Street: " << placeResult.place().location().address().street();
qDebug() << "Distance: " << placeResult.distance();
}
}
}
searchReply->deleteLater(); // 返信を破棄
searchReply=nullptr;
}注:選択したプラグインのバックエンドによっては、検索結果に、場所ごとに取得可能な詳細情報を含む場所が含まれる場合があります。これらの詳細情報を取得するには、「場所の詳細情報の取得」を参照してください。
推奨事項
おすすめ情報は、QPlaceSearchRequest::setRecommendationId() に場所 ID を指定することで取得できます。指定された場所と類似した場所がすべて取得されます。
ページング
プラグインがページングに対応している場合、検索リクエストに limit パラメータを指定することができます。
QPlaceSearchRequest searchRequest;
searchRequest.setLimit(15); //specify how many results are to be retrieved.場所の詳細情報の取得
検索リクエストから返された場所には、さらに取得可能な詳細情報がある場合があります。以下では、詳細情報がさらに存在するかどうかを確認し、存在する場合はその情報をリクエストする方法を示します。
if (!place.detailsFetched()) {
/*QPlaceDetailsReply * */ detailsReply = manager->getPlaceDetails(place.placeId());
connect(detailsReply, &QPlaceDetailsReply::finished, this, &RequestHandler::handleDetailsReply);
}
...
...
void handleDetailsReply() {
QPlace place;
if (detailsReply->error() == QPlaceReply::NoError)
place = detailsReply->place();
detailsReply->deleteLater(); //discard reply
detailsReply = nullptr;
}リッチコンテンツの取得
画像やレビューなどのリッチコンテンツは、マネージャーを通じて取得され、必要に応じて場所に割り当てられます。
QPlaceContentRequest request;
request.setContentType(QPlaceContent::ImageType);
request.setPlaceId(place.placeId());
request.setLimit(5);
/*QPlaceContentReply * */ contentReply = manager->getPlaceContent(request);
connect(contentReply, &QPlaceContentReply::finished, this, &RequestHandler::handleImagesReply);コンテンツの要求は、以下に示すように処理することができます。
voidhandleImagesReply() {
if(contentReply->error()==QPlaceReply::NoError) {
const autocontent= contentReply->content();
for(autoiter=content.cbegin(),end=content.cend(); iter!=end;++iter) {
qDebug() << "Index: " << iter.key();
QPlaceImageimage=iter.value();
qDebug() << image.url();
qDebug() << image.mimeType();
}
// あるいは、インデックスが関係のない場合
for(const QPlaceImage &image: contentReply->content()) {
qDebug() << image.url();
qDebug() << image.mimeType();
}
//コンテンツを、それに対応する「place」に割り当てることができます。
//「place」オブジェクトは、すでに取得済みの
//コンテンツ を取り出すためのコンテナとして機能します
place.insertContent(contentReply->request().contentType(), contentReply->content());
place.setTotalContentCount(contentReply->request().contentType(), contentReply->totalCount());
}
contentReply->deleteLater();
contentReply=nullptr;
}QPlaceContentReply 内の結果は、QPlaceContent::Collection であり、これは本質的にQMap<int,QPlaceContent>であることに注意してください。この場合のキーint はコンテンツのインデックスであり、値はコンテンツそのものです。Contentの実装方法により、コンテンツタイプを次のように変換することが可能です
QPlaceImage image = content; //provided that 'content' has a type QPlace::ImageTypeQPlaceContent::Collection の使用や、コンテンツとそのサブタイプ間の変換により、レビュー、画像、社説のページング処理に関するコードを容易に共有できるようになります。
検索候補
検索用語の候補の取得は、場所の検索を実行する場合と非常によく似ています。QPlaceSearchRequest は場所の検索と同様に使用されますが、唯一の違いは、検索用語が部分的に入力された文字列に設定される点です。
QPlaceSearchRequest request;
request.setSearchTerm("piz");
request.setSearchArea(QGeoCircle(QGeoCoordinate(12.34, 56.78)));
/* QPlaceSearchSuggestion * */suggestionReply = manager->searchSuggestions(request);
connect(suggestionReply, &QPlaceSearchSuggestion::finished, this, &RequestHandler::handleSuggestionReply);そして、リクエストが完了したら、その応答を利用して候補を表示することができます。
voidhandleSuggestionReply() {
if(suggestionReply->error()==QPlaceReply::NoError) {
for(constQString&suggestion: suggestionReply->suggestions())
qDebug() << suggestion;
}
suggestionReply->deleteLater();// 返信を破棄
suggestionReply=nullptr;
}場所の保存
新しい場所の保存は次のように行われます。まず、QPlace のインスタンスを作成し、名前、住所、座標などの情報を設定します。設定が完了したら、QPlaceManager::savePlace()を呼び出して保存操作を開始します。
QPlace place;
place.setName( "Fred's Ice Cream Parlor" );
QGeoLocation location;
location.setCoordinate(QGeoCoordinate(12.34, 56.78));
QGeoAddress address;
address.setStreet("111 Nother Street");
...
location.setAddress(address);
place.setLocation(location);
/* QPlaceIdReply * */savePlaceReply = manager->savePlace(place);
connect(savePlaceReply, &QPlaceIdReply::finished, this, &RequestHandler::handleSavePlaceReply);場所が保存されると、応答にはその場所の新しい識別子が含まれます。
voidhandleSavePlaceReply() {
if(savePlaceReply->error()==QPlaceReply::NoError)
qDebug() << savePlaceReply->id();
savePlaceReply->deleteLater();//返信を破棄
savePlaceReply=nullptr;
}なお、既存の場所を保存するには、QPlace::placeId() に正しい識別子を指定する必要があります。空のままである場合、新しい場所が作成され、識別子が間違っている場合は、既存の場所が上書きされてしまいます。
場所が保存されると、QPlaceManager はQPlaceManager::placedAdded()またはQPlaceManager::placeUpdated()シグナルを発行する場合があります。ただし、マネージャーがこれらを発行するかどうかはプロバイダーによって異なります。Webサービスから場所にアクセスするマネージャーは通常これらのシグナルを発行しませんが、ローカルに保存された場所にアクセスするマネージャーは一般的に発行します。
注意点
Places APIは現在、core の詳細情報の保存のみを目的として設計されています。画像やレビューなどのリッチコンテンツ、あるいは提供者や評価などの詳細情報の保存は、サポートされていないユースケースです。通常、マネージャーは保存時にこれらのフィールドを無視し、値が入力されている場合は警告メッセージを表示する場合があります。
Places API では、以下の主要な詳細情報の保存のみをサポートしています:
- name
- 場所 ID
- 所在地
- 連絡先情報
- アイコン
- カテゴリ(場所を説明するタグのような名称)
- 公開範囲
プロバイダーによっては、これらのうち一部のみをサポートしている場合があります。詳細については、プラグインのドキュメントをご参照ください。
評価、拡張属性、画像、レビュー、編集記事、サプライヤーなどのプロパティの保存は、Places API では明示的にサポートされていません。
マネージャー間の保存
マネージャー間でプレイスを保存する際には、いくつか注意すべき点があります。プレイスの ID、カテゴリ、アイコンなどの一部のフィールドは、マネージャー固有のエンティティであるため、あるマネージャーのカテゴリが別のマネージャーでは認識されない場合があります。そのため、あるマネージャーから別のマネージャーへプレイスを直接保存することはできません。
一般的な方法は、QPlaceManager::compatiblePlace() 関数を使用することです。この関数は場所のコピーを作成しますが、そのマネージャーがサポートするデータのみをコピーします。場所の識別子などのマネージャー固有のデータはコピーされません。 こうして作成された新しいコピーは、そのマネージャーに保存できるようになります。マネージャーが代替識別子による照合をサポートしている場合、コピーには代替識別子属性が割り当てられます(「マネージャー間の場所の照合」を参照)。
//result retrieved from a different manager)
QPlace place = manager->compatiblePlace(result.place());
saveReply = manager->savePlace(place);場所の削除
場所の削除は、次のように行います:
/* QPlaceIdReply * */removePlaceReply = manager->removePlace(place.placeId());
connect(removePlaceReply, &QPlaceIdReply::finished, this, &RequestHandler::handleRemovePlaceReply);
...
...
voidhandleRemovePlaceReply() {
if(removePlaceReply->error()==QPlaceReply::NoError)
qDebug() << "Removal of place identified by"
<< removePlaceReply->id()<< "が正常に完了しました";
removePlaceReply->deleteLater();// 返信を破棄
removePlaceReply=nullptr;
}プレイスが削除されると、QPlaceManager はQPlaceManager::placeRemoved()シグナルを発行する場合があります。マネージャーがこれを行うかどうかはプロバイダーによって異なります。Webサービスからプレイスにアクセスするマネージャーは通常、これらのシグナルを発行しませんが、ローカルに保存されたプレイスにアクセスするマネージャーは一般的に発行します。
カテゴリの使用
カテゴリとは、場所を記述するためのキーワードのことです。例えば、「公園」、「劇場」、「レストラン」などです。1つの場所は複数のカテゴリで記述されることがあり、公園であり、音楽会場であり、フェリーやバスの停留所でもあるといった具合です。
カテゴリを使用するには、まず初期化する必要があります。
/* QPlaceReply * */initCatReply = manager->initializeCategories();
connect(initCatReply, &QPlaceReply::finished, this, &RequestHandler::handleInitCatReply);
...
...
voidhandleInitCatReply() {
if(initCatReply->error()==QPlaceReply::NoError)
qDebug() << "Categories initialized";
else
qDebug() << "Failed to initialize categories";
initCatReply->deleteLater();
initCatReply=nullptr;
}カテゴリの初期化が完了したら、これらのカテゴリ関数を使用できるようになります。
- QPlaceManager::childCategories()
- QPlaceManager::category()
- QPlaceManager::parentCategoryId()
- QPlaceManager::childCategoryIds();
最上位のカテゴリを取得するには、QPlaceManager::childCategories() 関数を使用しますが、カテゴリ識別子は指定しません。
constQList<QPlaceCategory>topLevelCategories= manager->childCategories();
for(constQPlaceCategory&category: topLevelCategories)
qDebug() << category.name();識別子を指定すれば、そのカテゴリの子カテゴリを取得することができます。
QList<QPlaceCategory> childCategories = manager->childCategories(pizza.categoryId());カテゴリの保存
以下に、カテゴリを保存する方法を示します
QPlaceCategory fastFood;
QPlaceCategory category;
category.setName("pizza");
/*QPlaceIdReply */saveCategoryReply= manager->saveCategory(category);
connect(saveCategoryReply, &QPlaceIdReply::finished, this, &RequestHandler::handleSaveCategoryReply);
// 親の識別子を指定することで、カテゴリを子として保存することも可能です。
saveCategoryReply= manager->saveCategory(category,fastFood.categoryId());
...
...
voidhandleSaveCategoryReply() {
if(saveCategoryReply->error()==QPlaceReply::NoError) {
qDebug() << "Saved category id =" << saveCategoryReply->id();
}
saveCategoryReply->deleteLater();
saveCategoryReply=nullptr;
}カテゴリが保存されると、QPlaceManager はQPlaceManager::categoryAdded()またはQPlaceManager::categoryUpdated()シグナルを発信する場合があります。ただし、マネージャーがこれらを発信するかどうかはプロバイダーによって異なります。Webサービスから場所にアクセスするマネージャーは通常これらのシグナルを発信しませんが、ローカルに保存された場所にアクセスするマネージャーは一般的に発信します。
カテゴリの削除
カテゴリの削除は、プレイスの削除と非常によく似ています
/* QPlaceIdReply * */removeCategoryReply = manager->removeCategory(place.placeId());
connect(removeCategoryReply, &QPlaceIdReply::finished, this, &RequestHandler::handleRemoveCategoryReply);
...
...
voidhandleRemoveCategoryReply() {
if(removeCategoryReply->error()==QPlaceReply::NoError)
qDebug() << "Removal of category identified by"
<< removeCategoryReply->id()<< "が正常に完了しました";
removeCategoryReply->deleteLater();// 返信を破棄
removeCategoryReply=nullptr;
}カテゴリが削除されると、QPlaceManager はQPlaceManager::categoryRemoved()シグナルを発する可能性があります。マネージャーが実際にシグナルを発するかどうかは、プロバイダによって異なります。Webサービスから場所にアクセスするマネージャーは通常、これらのシグナルを発しませんが、ローカルに保存された場所にアクセスするマネージャーは一般的にシグナルを発します。
マネージャー間の場所の照合
あるマネージャーのプレイスが別のマネージャーのプレイスと一致するかどうかを照合したい場合があるかもしれません。このような状況は、あるマネージャーがプレイスへの読み取り専用アクセスを提供している(送信元マネージャー)一方で、別の読み書き可能なマネージャー(宛先マネージャー)が、前者から選択されたお気に入りを保存するために使用される場合などに発生し得ます。 オリジン・マネージャーを検索する際、どの場所がデスティネーション・マネージャーに「お気に入り」として登録されているかを知りたくなったり、元の名前ではなくカスタマイズされたお気に入り名を表示したりしたい場合があります。
照合の仕組みはマネージャーによって異なりますが、通常は代替識別子を通じて行われます。保存プロセスの一環として、元マネージャーの場所識別子が、宛先マネージャー(独自の場所識別子スキームを持つ場合があります)の代替識別子属性として保存されます。 以下の例では、送信元マネージャーは「here」というQGeoServiceProviderに属しているため、保存処理の一環として、宛先マネージャーに保存される場所に対して代替識別子属性 x_id_here が設定されます(QPlaceManager::compatiblePlace() が呼び出された際)。
origin R/O manager(here) destination R/W manager (places_jsondb)
Save
Place id: ae246 ---> Place id: 0001
Attribute type: x_provider Attribute type: x_id_here
Attribute value: here Attribute text value: ae246マッチングを実行するために、`QPlaceMatchRequest ` を作成し、そこにオリジンマネージャーからの検索結果を割り当てます。この `QPlaceMatchRequest ` は、デスティネーションマネージャー上で対応する場所を返すために使用されます。 また、キーと値のペアであるマッチングパラメータも指定します。前述の通り、これはマネージャーによって異なる場合がありますが、通常、キーは「QPlaceMatchRequest::AlternativeId 」となり、これは代替IDによるマッチングを行うことを示します。この場合の値は「x_id_here」となり、マッチングに使用する代替識別子属性を指定します。
QPlaceMatchRequest request;
request.setResults(results);
QVariantMap parameters;
parameters.insert(QPlaceMatchRequest::AlternativeId, "x_id_here");
request.setParameters(parameters);
matchReply= manager->matchingPlaces(request);
...
...
voidmatchHandler() {
if(matchReply->error()==QPlaceReply::NoError) {
const autoplaces= matchReply->places();
for(constQPlace&place: places) {
if(place!=QPlace())
qDebug() << "Place is a favorite with name" << place.name();
else
qDebug() << "Place is not a favorite";
}
}
matchReply->deleteLater();
matchReply=nullptr;
}「Places」のクラス
データクラス
QGeoLocationの住所を表します | |
場所に関する基本情報を表します | |
場所に関するデータの集合を表します | |
場所に関する一般的な属性情報を表す | |
QPlaceが関連付けられるカテゴリを表します | |
電話番号やウェブサイトのURLなどの連絡先情報を表す | |
場所に関するコンテンツを保持します | |
アイコンを表します | |
提案された検索を含む検索結果を表す | |
場所に関する評価情報を保持する | |
場所を含む検索結果を表します | |
検索結果の基底クラス | |
個々のユーザーを表します |
リクエストクラス
コンテンツリクエストのパラメータを表す | |
あるマネージャーの条件と、別のマネージャーの条件が一致する場所を検索するために使用されます。これは、リクエストパラメータのセットを表します | |
検索リクエストのパラメータのセットを表します |
応答クラス
QPlaceManagerのインスタンスによって開始されたコンテンツ取得操作を管理します | |
QPlaceManagerのインスタンスによって開始された場所の詳細取得操作を管理します | |
場所やカテゴリの保存や削除などの操作など、識別子を返す操作を管理します | |
QPlaceManagerのインスタンスによって開始された場所のマッチング操作を管理する | |
QPlaceManagerのインスタンスによって開始された操作を管理し、より特殊な応答のための基底クラスとして機能する | |
QPlaceManager のインスタンスによって開始された場所の検索操作を管理する | |
QPlaceManagerのインスタンスによって開始された検索候補の操作を管理する |
マネージャークラス
クライアントが特定のバックエンドに保存された場所にアクセスできるようにするインターフェース | |
場所機能へのアクセスを提供したいQGeoServiceProviderプラグインの実装者向けのインターフェース |
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.