この例は、「アクティブな選択情報を使用する」を基にしています。選択した区域をリストする代わりに、選択の周囲に一連の同心バッファを作成し、距離の増加を示します。以下のコード セクションでは、多くのコードが追加されています。完全なソース コードについては、『開発者用ガイド』のサンプルを参照してください。

この例では、マップを変更するため、マップのロード時に JavaScript 関数を使用して、マップを更新する必要があります。関数をページに追加します。

<script language="javascript">
  function OnPageLoad()
  {
    parent.parent.Refresh();
  }
</script>

OnLoad コマンドを <body> 要素に追加します。

<body onLoad="OnPageLoad()">

この例では、Buffer というテンポラリ マップ画層を使用して、バッファ フィーチャを保存します。フィーチャ ソースと画層が存在しない場合は、作成します。存在する場合は、既存のすべてのフィーチャを削除してから、新しいバッファを作成します。CreateBufferFeatureSource() 関数と CreateBufferLayer() 関数は、次に示す bufferfunctions.php に含まれています。

include 'bufferfunctions.php';
$bufferRingSize = 100; // measured in metres
$bufferRingCount = 5;
 
// Set up some objects for coordinate conversion
 
$mapWktSrs = $map->GetMapSRS();
$agfReaderWriter = new MgAgfReaderWriter();
$wktReaderWriter = new MgWktReaderWriter();
$coordinateSystemFactory = new MgCoordinateSystemFactory();
$srs = $coordinateSystemFactory->Create($mapWktSrs);
$srsMeasure = $srs->GetMeasure();
 
// Check for a buffer layer. If it exists, delete 
// the current features.
// If it does not exist, create a feature source and 
// a layer to hold the buffer.
 
try
{
  $bufferLayer = $map->GetLayers()->GetItem('Buffer');
  $bufferFeatureResId = new MgResourceIdentifier(
    $bufferLayer->GetFeatureSourceId());
 
  $commands = new MgFeatureCommandCollection();
  $commands->Add(new MgDeleteFeatures('BufferClass', 
    "ID >= 0"));
 
  $featureService->UpdateFeatures($bufferFeatureResId, 
    $commands, false);
}
catch (MgObjectNotFoundException $e)
{
  // When an MgObjectNotFoundException is thrown, the layer 
  // does not exist and must be created.
 
  $bufferFeatureResId = new MgResourceIdentifier("Session:" . 
    $mgSessionId . "//Buffer.FeatureSource");
  CreateBufferFeatureSource($featureService, $mapWktSrs, 
    $bufferFeatureResId);
  $bufferLayer = CreateBufferLayer($resourceService, 
    $bufferFeatureResId, $mgSessionId);
  $map->GetLayers()->Insert(0, $bufferLayer);
}

選択したフィーチャのジオメトリが 1 つのマルチジオメトリに結合されます。次に、一連の同心バッファが作成され、フィーチャ ソースに追加されます。関数 CreateBufferLayer() bufferlayerdefinition.xml を処理し、部分的に透明なバッファ フィーチャを定義する必要があります。それらをマップに描画すると、輪がバッファ領域の中心に向かって、だんだん黒くなります。

// Process each item in the MgFeatureReader. 
// Merge them into a single feature.
 
$inputGeometries = new MgGeometryCollection();
while ($featureReader->ReadNext())
{
  $featureGeometryData = $featureReader->GetGeometry('SHPGEOM');
  $featureGeometry = $agfReaderWriter->Read($featureGeometryData);
 
  $inputGeometries->Add($featureGeometry);
}
 
$geometryFactory = new MgGeometryFactory();
$mergedFeatures = $geometryFactory->
  CreateMultiGeometry($inputGeometries);
 
// Add buffer features to the temporary feature source.
// Create multiple concentric buffers to show area.
 
$commands = new MgFeatureCommandCollection();
for ($bufferRing = 0; $bufferRing < $bufferRingCount; 
    $bufferRing++)
{
  $bufferDist = $srs->
    ConvertMetersToCoordinateSystemUnits($bufferRingSize * 
    ($bufferRing + 1));
  $bufferGeometry = $mergedFeatures->Buffer($bufferDist, 
    $srsMeasure);
 
  $properties = new MgPropertyCollection();
  $properties->Add(new MgGeometryProperty('BufferGeometry', 
    $agfReaderWriter->Write($bufferGeometry)));
 
  $commands->Add(new MgInsertFeatures('BufferClass', 
    $properties));
}
 
$results = $featureService->UpdateFeatures($bufferFeatureResId, 
    $commands, false);
 
$bufferLayer->SetVisible(true);
$bufferLayer->ForceRefresh();
$bufferLayer->SetDisplayInLegend(true);
$map->Save($resourceService);

関数 CreateBufferFeatureSource() および CreateBufferLayer() は、bufferfunctions.php にあります。CreateBufferFeatureSource() は、1 つのフィーチャ クラス BufferClass を使用してテンポラリ フィーチャ ソースを作成します。フィーチャ クラスには、ID および BufferGeometry の 2 つのプロパティがあります。ID は自動生成されるため、新しいフィーチャに追加する必要はありません。CreateBufferLayer() は外部ファイルから画層定義を変更し、それをリポジトリに保存します。詳細は、「マップと画層を修正する」を参照してください。

function CreateBufferFeatureSource($featureService, $wkt, 
  $bufferFeatureResId)
{
   $bufferClass = new MgClassDefinition();
   $bufferClass->SetName('BufferClass');
   $properties = $bufferClass->GetProperties();
   $idProperty = new MgDataPropertyDefinition('ID');
   $idProperty->SetDataType(MgPropertyType::Int32);
   $idProperty->SetReadOnly(true);
   $idProperty->SetNullable(false);
   $idProperty->SetAutoGeneration(true);
   $properties->Add($idProperty);
   $polygonProperty = new 
     MgGeometricPropertyDefinition('BufferGeometry');
   $polygonProperty->
     SetGeometryTypes(MgFeatureGeometricType::Surface);
   $polygonProperty->SetHasElevation(false);
   $polygonProperty->SetHasMeasure(false);
   $polygonProperty->SetReadOnly(false);
   $polygonProperty->SetSpatialContextAssociation('defaultSrs');
   $properties->Add($polygonProperty);
   $idProperties = $bufferClass->GetIdentityProperties();
   $idProperties->Add($idProperty);
   $bufferClass->
     SetDefaultGeometryPropertyName('BufferGeometry');
   $bufferSchema = new MgFeatureSchema('BufferLayerSchema', 
     'temporary schema to hold a buffer');
   $bufferSchema->GetClasses()->Add($bufferClass);
   $sdfParams = new MgCreateSdfParams('defaultSrs', $wkt, 
     $bufferSchema);
   $featureService->CreateFeatureSource($bufferFeatureResId,       $sdfParams);
}
 
function CreateBufferLayer($resourceService, 
  $bufferFeatureResId, $sessionId)
{
   // Load the layer definition template into
   // a PHP DOM object, find the "ResourceId" element, and
   // modify its content to reference the temporary
   // feature source.
   $doc = DOMDocument::load('bufferlayerdefinition.xml');
   $featureSourceNode = $doc->getElementsByTagName(
     'ResourceId')->item(0);
   $featureSourceNode->nodeValue = 
     $bufferFeatureResId->ToString();
   // Get the updated layer definition from the DOM object
   // and save it to the session repository using the
   // ResourceService object.
   $layerDefinition = $doc->saveXML();
   $byteSource = new MgByteSource($layerDefinition, 
     strlen($layerDefinition));
   $byteSource->SetMimeType(MgMimeType::Xml);
   $tempLayerResId = new MgResourceIdentifier("Session:" . 
     $sessionId . "//Buffer.LayerDefinition");
   $resourceService->SetResource($tempLayerResId, 
     $byteSource->GetReader(), null);
   // Create an MgLayer object based on the new layer definition
   // and return it to the caller.
   $bufferLayer = new MgLayer($tempLayerResId, $resourceService);
   $bufferLayer->SetName("Buffer");
   $bufferLayer->SetLegendLabel("Buffer");
   $bufferLayer->SetDisplayInLegend(true);
   $bufferLayer->SetSelectable(false);
   return $bufferLayer;
}

『開発者用ガイド』のサンプルに、その他の例があります。その他の例では、バッファ領域内の区域に対してクエリーを実行し、特定の条件に一致する区域を選択します。この選択は、基本フィルタと空間フィルタを組み合わせたクエリーを使用して行われます。

$bufferDist = $srs->
   ConvertMetersToCoordinateSystemUnits($bufferRingSize);
$bufferGeometry = $mergedGeometries->Buffer($bufferDist, 
   $srsMeasure);
 
// Create a filter to select parcels within the buffer. Combine
// a basic filter and a spatial filter to select all parcels
// within the buffer that are of type "MFG".
 
$queryOptions = new MgFeatureQueryOptions();
$queryOptions->SetFilter("RTYPE = 'MFG'");
$queryOptions->SetSpatialFilter('SHPGEOM', $bufferGeometry, 
   MgFeatureSpatialOperations::Inside);

選択したポイントのマーカーを含むフィーチャ ソースを作成して追加します。

// Get the features from the feature source,
// determine the centroid of each selected feature, and
// add a point to the ParcelMarker layer to mark the
// centroid.
// Collect all the points into an MgFeatureCommandCollection,
// so they can all be added in one operation.
 
$featureResId = new MgResourceIdentifier(
   "Library://Samples/Sheboygan/Data/Parcels.FeatureSource");
$featureReader = $featureService->SelectFeatures($featureResId, 
   "Parcels", $queryOptions);
 
$parcelMarkerCommands = new MgFeatureCommandCollection();
while ($featureReader->ReadNext())
{
  $byteReader = $featureReader->GetGeometry('SHPGEOM');
  $geometry = $agfReaderWriter->Read($byteReader);
  $point = $geometry->GetCentroid();
 
  // Create an insert command for this parcel.
  $properties = new MgPropertyCollection();
  $properties->Add(new MgGeometryProperty('ParcelLocation', 
     $agfReaderWriter->Write($point)));
  $parcelMarkerCommands->Add(
     new MgInsertFeatures('ParcelMarkerClass', $properties));
}
$featureReader->Close();
 
if ($parcelMarkerCommands->GetCount() > 0)
{
  $featureService->UpdateFeatures($parcelFeatureResId, 
     $parcelMarkerCommands, false);
}
else
{
  echo '</p><p>No parcels within the buffer area match.';
}