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