NZ Street Address module for SilverStripe
Address lookup using LINZ Address Data., (*1)
Use the 0.0.x tags for SilverStripe 3 installations. SilverStripe 4 support will be handled from versions 0.1.x., (*2)
Installation
Add the repository to your composer.json file, (*3)
"repositories": [
{
"type": "vcs",
"url": "git@github.com:elliot-sawyer/silverstripe-nzstreets.git"
}
]
Add the project to the require section of composer.json, (*4)
"require": {
...
"elliot-sawyer/nzstreets": "^0.1"
...
Setup
Composer should place the repository in your webroot., (*5)
Create a new route in routes.yml. You can change address
to any url_segment that meets your needs, (*6)
SilverStripe\Control\Director:
rules:
'address//$Action/$ID/$Name': 'ElliotSawyer\NZStreets\NZStreetAddressController'
Download the CSV data source from https://data.linz.govt.nz/layer/3353-nz-street-address/data/, (*7)
This is a massive file (500+ MB once extracted) and contains over 1.9 million records. The supplied importer will work but it's very slow: you should only use it for a smaller subset of files, or as a last resort for the entire set. For the fastest results, sideload it using mysqladmin or a similar database tool., (*8)
Usage
This module was created to feed into an autosuggest address lookup and is suitable for that purpose., (*9)
You can now search for addresses that start with your query. For example:
* https://yoursite/address/search?q=101-103
* https://yoursite/address/search?q=2/133
* https://yoursite/address/search?q=14+L, (*10)
The default limit is 10 results. You can override this in your config.yml:, (*11)
ElliotSawyer\NZStreets\NZStreetAddressController:
search_limit: 5
Each search result contains an AddressID. For more details about an address, you can query by that ID:
* http://yoursite/address/details?AddressID=1579100, (*12)
Sideloading
Build the table using the dev/build command. You can sideload the CSV file into MySQL with the following query:, (*13)
LOAD DATA LOCAL INFILE '/path/to/your/nz-street-address.csv'
INTO TABLE NZStreetAddress
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(WKT,AddressID,ChangeID,AddressType,UnitValue,AddressNumber,AddressNumberSuffix,AddressNumberHigh,WaterRouteName,WaterName,SuburbLocality,TownCity,FullAddressNumber,FullRoadName,FullAddress,RoadSectionID,Longitude,Latitude,@dummy,@dummy,@dummy,@dummy,@dummy,@dummy,ShapeX,ShapeY)
SET ClassName="ElliotSawyer\\NZStreets\\NZStreetAddress", LastEdited=NOW(), Created=NOW();
Newer versions of MySQL treat this process as a security risk, so you might need to enable a few things on the server and the client to make it happen. Consider reverting these changes after the sideloading process is completed;, (*14)
Within MySQL at the database level (must be root)
SET GLOBAL local_infile=1;
, (*15)
Exit out of MySQL and reconnect with a flag on your client:
mysql -u root -p --local-infile=1
, (*16)
Contributing
Contributions are more than welcome! Please raise some issues or create pull requests on the Github repo., (*17)
Support
Need some extra help or just love my work? Consider shouting me a coffee or a small donation if this module helped you solve a problem. I accept cryptocurrency at the following addresses:
* Bitcoin: 12gSxkqVNr9QMLQMMJdWemBaRRNPghmS3p
* Bitcoin Cash: 1QETPtssFRM981TGjVg74uUX8kShcA44ni
* Litecoin: LbyhaTESx3uQvwwd9So4sGSpi4tTJLKBdz
* Ethereum: 0x0694E0704c70D8d178dd2e9522FC59EBBEe86748, (*18)