ISO 3779 автомобильный VIN декодер на PHP? - PullRequest
4 голосов
/ 02 июня 2011

Кто-нибудь знает о библиотеке VIN-декодера транспортного средства ISO 3779 на PHP, Perl или Python (или любом другом языке, который я могу легко преобразовать), доступном как открытый исходный код / ​​бесплатная программа?

Даже что-то для декодирования части WMI (первые 3 позиции) сэкономило бы мне много времени.Заранее спасибо.

http://en.wikipedia.org/wiki/Vehicle_identification_number

Ответы [ 2 ]

5 голосов
/ 02 июня 2011

Я позволю вам собрать данные из Википедии, но ниже приведен быстрый (модульный) пример, который вы можете расширить (завершите метод WMI->Init()). Я также, вероятно, сделал бы класс VINLookup синглтоном или разорвал бы WMI в базе данных (где-то нормализуйте данные и обработайте их как число base-33, как у меня [возможно]).

// http://en.wikipedia.org/wiki/Vehicle_identification_number#World_Manufacturer_Identifier

define('VIN_CHARACTERS', 'ABCDEFGHJKLMNPRSTUVWXYZ1234567890'); // no I, O or Q & 0 is last.

class WMI
{
  public $country;
  public $region;
  public $low;
  public $high;

  public function __construct($country,$region,$low,$high)
  {
    $this->country = $country;
    $this->region = $region;
    $this->low = $low;
    $this->high = $high;
  }

  private static function CodeToDec($code)
  {
    if (strlen($code) != 2)
      return false;

    return (strpos(VIN_CHARACTERS, $code{0}) * strlen(VIN_CHARACTERS)) + strpos(VIN_CHARACTERS, $code{1});
  }

  public function IsMatch($vin)
  {
    // first, grab the first 2 characters
    $code = substr($vin,0,2);

    // next, see if it's in range
    // we do this by converting it to a numeric
    $_low = WMI::CodeToDec($this->low);
    $_high = WMI::CodeToDec($this->high);
    $_code = WMI::CodeToDec($code);

    return (($_code >= $_low) && ($_code <= $_high));
  }

  public function __toString()
  {
    return sprintf("%s, %s (%s, %s)", $this->country, $this->region, $this->low, $this->high);
  }
}

class VINLookup
{
  private $vin;
  private $wmis = array();

  public function __construct($vin)
  {
    if (!VINLookup::IsValid($vin))
      throw new Exception('Invalid VIN specified');

    $this->vin = $vin;

    $this->Init();
  }

  private function Init()
  {
    $this->wmis = array(
      new WMI('South Africa',     'Africa',         'AA', 'AH'),
      new WMI('Ivory Coast',      'Africa',         'AJ', 'AN'),
      new WMI('(not assigned)',   'Africa',         'AP', 'A0'),
      new WMI('Angola',           'Africa',         'BA', 'BE'),
      new WMI('Kenya',            'Africa',         'BF', 'BK'),

      new WMI('United States',    'North America',  '1A', '10'),
      new WMI('Canada',           'North America',  '2A', '20'),
      new WMI('Mexico',           'North America',  '3A', '3W'),
      new WMI('Costa Rica',       'North America',  '3X', '37'),
    );
  }

  public function GetCountry()
  {
    foreach ($this->wmis as $wmi)
    {
      if ($wmi->IsMatch($this->vin))
        return $wmi;
    }
    return false;
  }

  public static function IsValid($vin)
  {
    return preg_match('/^[A-HJ-NPR-Z0-9]{17}$/',$vin);
  }
}

Использование:

// check for a valid VIN number supplied
VINLookup::IsValid(<vin>);


// create a new VINLookup with the specified VIN
$lookup = new VINLookup(<vin>);

// retrieve the _Country_ object (above), or FALSE if no country match was found.
$lookup->GetCountry();
1 голос
/ 12 января 2015

Национальная администрация безопасности дорожного движения располагает базой данных всех номеров WMI. Вот ссылка на соответствующую веб-страницу: Данные WMI NHTSA

Они ссылаются на FTP-сайт, который содержит данные: Источник данных WMI

Вы можете скачать файл 565.txt или базу данных mdb, которая содержит данные. Кажется, это очень полная база данных.

...