seanja / stats-can-api
与stats can api交互的客户端
0.6.0
2024-09-24 02:34 UTC
Requires
- php: ^8.3
- guzzlehttp/guzzle: ^7.8
- ramsey/collection: ^2.0
- seanja/cacheable-trait: ^1.0
- symfony/cache: ^7.0
Requires (Dev)
- ext-simplexml: *
- phpunit/phpunit: ^11.1
README
Web数据服务(WDS)api的实现(https://www.statcan.gc.ca/en/developers/wds/user-guide)
使用示例:检索加拿大全国最新的平均油价
use GuzzleHttp\Client as GuzzleClient; use GuzzleHttp\RequestOptions; use SeanJA\StatsCanAPI\Client; use SeanJA\StatsCanAPI\ValueObjects\Coordinate; use SeanJA\StatsCanAPI\ValueObjects\Dimensions\Member; use SeanJA\StatsCanAPI\ValueObjects\Enums\GeographyEnum; use SeanJA\StatsCanAPI\ValueObjects\Enums\ProductIdEnum; use Symfony\Component\Cache\Adapter\FilesystemAdapter; require __DIR__ . '/vendor/autoload.php'; // setup the client $client = new Client( guzzle: new GuzzleClient([ // unclear if this is an issue with windows or the api endpoints RequestOptions::VERIFY => false ]), cache: new FilesystemAdapter('', 0, __DIR__ . '/cache') ); class StatsCanLatestAverageGasPriceService { public function __construct( readonly private Client $client ) { } public function getLatestGasPriceForArea(GeographyEnum $geography): int { $productId = ProductIdEnum::MONTHLY_AVERAGE_RETAIL_PRICES_FOR_GASOLINE_AND_FUEL_OIL_BY_GEOGRAPHY; // get the data for this specific product $data = $this->client->getCubeMetadata($productId->value); // get the area that was specified $areaMemberDimensionPosition = $data->dimension[0]->dimensionPositionId; $areaMember = null; /** @var Member $member */ foreach($data->dimension[0]->member as $member){ if($member->memberId === $geography->value){ $areaMember = $member->memberId; break; } } // get the second coordinate, which is fuel type: $fuelTypeDimensionPosition = $data->dimension[1]->dimensionPositionId; $fuelTypeMember = null; foreach($data->dimension[1]->member as $member){ if($member->memberNameEn === 'Regular unleaded gasoline at self service filling stations'){ $fuelTypeMember = $member->memberId; break; } } //setup the coordinate you want to query for $coordinate = new Coordinate(); // the first dimension is the area $coordinate->setDimension($areaMemberDimensionPosition, $areaMember); $coordinate->setDimension($fuelTypeDimensionPosition, $fuelTypeMember); $data2 = $this->client->getDataFromCubePidCoordinateAndLatestNPeriods( $productId->value, $coordinate, // only get the latest row 1 ); return $data2->vectorDataPoints[0]->value; } } $service = new StatsCanLatestAverageGasPriceService($client); echo $service->getLatestGasPriceForArea(GeographyEnum::CANADA);
待办事项
- 进行更多测试
- 解决枚举中一些模糊的数据(百磅出现很多次,但在法语中不同,产品ID名称重复)