Maps > Rogue Wave Views リーダー・フレームワーク > レンダラー > 色付き線のレンダラーを作成する
 
色付き線のレンダラーを作成する
このセクションでは、既知名のあるアトリビュートの数値から色付きのポリラインを表示する新しいレンダラーの書き方について説明します。
このレンダラーのサンプル・ソース・コード一式は、以下のファイルにあります。
<installdir>/samples/maps/userman/src/colorLineRenderer.cpp
標高線を色別表示すると仮定します。簡単な方法は、ColorModel で標高値を使って、色を索引付けする方法です。クラスである ColorModel によって、整数値から RGB カラーへの表示に依存しないマッピングができます。より一般的には、地図機能に関連付けられたいずれかのアトリビュートを使用して、線、多角形またはテキストなどのグラフィック・オブジェクトに色を適用するレンダラー・クラスがあると役に立ちます。
ColorLineRenderer クラスの makeGraphic メソッドは、IlvMapGeneralPath グラフィック・オブジェクトを作成します。
IlvGraphic*
ColorLineRenderer::makeGraphic(const IlvMapFeature& feature,
const IlvMapInfo& targetMapInfo,
IlvMapsError& status) const {
const IlvMapGeometry* geometry = feature.getGeometry();
if (!geometry) {
status = IlvMaps::IllegalArgument();
return 0;
}
if (geometry->getClassInfo() != IlvMapLineString::ClassInfo()) {
status = IlvMaps::ClassError();
return 0;
}
const IlvMapLineString* lineStr = (const IlvMapLineString*) geometry;
int segCount = lineStr->getSegmentCount();
if (segCount == 0)
return 0;
IlvMapGeneralPath* genPath = new IlvMapGeneralPath(getDisplay());
const IlvMapSegment *segment;
IlvCoordinate c;
IlvPoint p;
segment = lineStr->getSegment(0);
c = segment -> getStartPoint();
status = targetMapInfo.toViews(c, feature.getProjection(), p);
genPath->moveTo(p);
for (int i = 0; i < segCount ; i++) {
c = segment -> getEndPoint();
status = targetMapInfo.toViews(c, feature.getProjection(), p);
genPath->lineTo(p);
}
 
地図機能の座標は、マネージャーの座標系に変換する必要があります。この変換により、マネージャー座標系では下向きになるのに対し、地図データ座標系には上向きの y 軸の正数部分があるため、y 軸の方向が変更されます。これはまた、投影図法の変更も意味します。この例では、toViews メソッドは、投影図法に従って両方の座標を変換し、必要に応じて y 軸の方向を変更します。特に、ソース・データが地理参照されていない場合 (すなわち、投影図法が不明な場合)、または再投影の必要がない場合は、ソース (feature::getProjection) とターゲットの投影図法を 0 に設定できることに留意してください。投影図法の詳細については、ターゲット投影図法を選択する および地図投影図法 を参照してください。
グラフィック・オブジェクトを作成すると、下記のように、色モデルを使って線を着色するためのアトリビュート値を取得します。
IlvInt colorIndex = 0;
 
const IlvFeatureAttributeProperty* attributeList =
feature.getAttributes();
const IlvFeatureAttribute* fa =
attributeList->getAttribute(_attributeName);
const IlvMapClassInfo* clsinfo =
fa->getClassInfo();
if(clsinfo->isSubtypeOf(IlvIntegerAttribute::ClassInfo()))
colorIndex = ((IlvIntegerAttribute*)fa)->getValue();
else if(clsinfo->isSubtypeOf(IlvDoubleAttribute::ClassInfo()))
colorIndex = (IlvInt)((IlvDoubleAttribute*)fa)->getValue();
IlvColor* color = getDisplay()->
getColor((IlvUShort)_colorModel->getRed(colorIndex),
(IlvUShort)_colorModel->getGreen(colorIndex),
(IlvUShort)_colorModel->getBlue(colorIndex));
 
genPath->setForeground(color);
 
return genPath;
}
 

Version 6.0
Copyright © 2015, Rogue Wave Software, Inc. All Rights Reserved.