proj4dart 1.0.1 proj4dart: ^1.0.1 copied to clipboard
Proj4dart is a Dart library to transform point coordinates from one coordinate system to another, including datum transformations (Dart version of proj4js/proj4js).
PROJ4DART #
Proj4dart is a Dart library to transform point coordinates from one coordinate system to another, including datum transformations (Dart version of proj4js/proj4js).
Installing #
Add proj4dart to pubspec.yml
(dependencies section), then run pub get
to download the new dependencies.
dependencies:
proj4dart: any # or the latest version on Pub
Using #
Predefined Projection #
There are 3 predefined Projections and 5 aliases by default:
- EPSG:4326, which has the following alias:
- WGS84
- EPSG:4269
- EPSG:3857, which has the following aliases:
- EPSG:3785
- EPSG:900913
- EPSG:102113
If you wish to use one of the predefined ones the signature is:
var projection = Projection('EPSG:4326');
User-defined Projection #
Proj4dart supports Proj4 definition strings
, OGC WKT definitions
and ESRI WKT definitions
. They can be obtained from epsg.io.
With Proj4 string definition
If you wish to define your own projection you can create it with a valid Proj4 string (here for EPSG:23700):
+proj=somerc +lat_0=47.14439372222222 +lon_0=19.04857177777778 +k_0=0.99993 +x_0=650000 +y_0=200000 +ellps=GRS67 +towgs84=52.17,-71.82,-14.9,0,0,0,0 +units=m +no_defs
The signature is:
var projection = Projection.add('EPSG:23700',
'+proj=somerc +lat_0=47.14439372222222 +lon_0=19.04857177777778 +k_0=0.99993 +x_0=650000 +y_0=200000 +ellps=GRS67 +towgs84=52.17,-71.82,-14.9,0,0,0,0 +units=m +no_defs');
For full example visit example/proj4dart_example.dart
With OGC WKT definition
If you wish to define your own projection you can create it with a valid OGC WKT string (here for EPSG:23700):
PROJCS["HD72 / EOV",GEOGCS["HD72",DATUM["Hungarian_Datum_1972",SPHEROID["GRS 1967",6378160,298.247167427,AUTHORITY["EPSG","7036"]],TOWGS84[52.17,-71.82,-14.9,0,0,0,0],AUTHORITY["EPSG","6237"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4237"]],PROJECTION["Hotine_Oblique_Mercator_Azimuth_Center"],PARAMETER["latitude_of_center",47.14439372222222],PARAMETER["longitude_of_center",19.04857177777778],PARAMETER["azimuth",90],PARAMETER["rectified_grid_angle",90],PARAMETER["scale_factor",0.99993],PARAMETER["false_easting",650000],PARAMETER["false_northing",200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Y",EAST],AXIS["X",NORTH],AUTHORITY["EPSG","23700"]]
The signature is:
var projection = Projection.add('EPSG:23700',
'PROJCS["HD72 / EOV",GEOGCS["HD72",DATUM["Hungarian_Datum_1972",SPHEROID["GRS 1967",6378160,298.247167427,AUTHORITY["EPSG","7036"]],TOWGS84[52.17,-71.82,-14.9,0,0,0,0],AUTHORITY["EPSG","6237"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4237"]],PROJECTION["Hotine_Oblique_Mercator_Azimuth_Center"],PARAMETER["latitude_of_center",47.14439372222222],PARAMETER["longitude_of_center",19.04857177777778],PARAMETER["azimuth",90],PARAMETER["rectified_grid_angle",90],PARAMETER["scale_factor",0.99993],PARAMETER["false_easting",650000],PARAMETER["false_northing",200000],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Y",EAST],AXIS["X",NORTH],AUTHORITY["EPSG","23700"]]');
For full example visit example/proj4dart_ogc_wkt_example.dart
With ESRI WKT definition
If you wish to define your own projection you can create it with a valid ESRI WKT string (here for EPSG:23700):
PROJCS["HD72_EOV",GEOGCS["GCS_HD72",DATUM["D_Hungarian_1972",SPHEROID["GRS_1967",6378160,298.247167427]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Hotine_Oblique_Mercator_Azimuth_Center"],PARAMETER["latitude_of_center",47.14439372222222],PARAMETER["longitude_of_center",19.04857177777778],PARAMETER["azimuth",90],PARAMETER["scale_factor",0.99993],PARAMETER["false_easting",650000],PARAMETER["false_northing",200000],UNIT["Meter",1]]
The signature is:
var projection = Projection.add('EPSG:23700',
'PROJCS["HD72_EOV",GEOGCS["GCS_HD72",DATUM["D_Hungarian_1972",SPHEROID["GRS_1967",6378160,298.247167427]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Hotine_Oblique_Mercator_Azimuth_Center"],PARAMETER["latitude_of_center",47.14439372222222],PARAMETER["longitude_of_center",19.04857177777778],PARAMETER["azimuth",90],PARAMETER["scale_factor",0.99993],PARAMETER["false_easting",650000],PARAMETER["false_northing",200000],UNIT["Meter",1]]');
For full example visit example/proj4dart_esri_wkt_example.dart
Transform between Projections #
import 'package:proj4dart/proj4dart.dart';
void main() {
// Define Point
var pointSrc = Point(x: 17.888058560281515, y: 46.89226406700879);
// Use built-in projection
var epsgSrc = 'EPSG:4326';
var projSrc = Projection(epsgSrc);
// Define custom projection
var epsgDst = 'EPSG:23700';
var projDst = Projection.add(epsgDst,
'+proj=somerc +lat_0=47.14439372222222 +lon_0=19.04857177777778 +k_0=0.99993 +x_0=650000 +y_0=200000 +ellps=GRS67 +towgs84=52.17,-71.82,-14.9,0,0,0,0 +units=m +no_defs');
// Forward transform (lonlat -> projected crs)
var pointForward = projSrc.transform(projDst, pointSrc);
print(
'FORWARD: Transform point [${pointSrc.x}, ${pointSrc.y}] from $epsgSrc to $epsgDst: [${pointForward.x}, ${pointForward.y}]');
// FORWARD: Transform point [17.888058560281515, 46.89226406700879] from EPSG:4326 to EPSG:23700: [561651.8408065987, 172658.61998377228]
// Inverse transform (projected crs -> lonlat)
var pointInverse = projDst.transform(projSrc, pointForward);
print(
'INVERSE: Transform point [${pointForward.x}, ${pointForward.y}] from $epsgDst to $epsgSrc: [${pointInverse.x}, ${pointInverse.y}]');
// INVERSE: Transform point [561651.8408065987, 172658.61998377228] from EPSG:23700 to EPSG:4326: [17.888058565574845, 46.89226406698969]
}
Accuracy #
Proj4dart was tested with
- 3910 Proj4 definitions (test/data/all_proj4_defs.dart)
- 3805 OGC WKT definitions (test/data/all_proj4_ogc_wkt_defs.dart)
- 3872 ESRI WKT definitions (test/data/all_proj4_esri_wkt_defs.dart)
Forward and inverse transformations were both performed and checked in each case. The expected forward and inverse results were pre-calculated using proj4js (test/results/all_proj4_results.dart, test/results/all_proj4_ogc_wkt_results.dart, test/results/all_proj4_esri_wkt_results.dart).
Acceptance criteria was:
- precision delta of 0.000001 in case of LonLat
- precision delta of 0.00001 in case of projected CRS.
Example (using EPSG:4326 point of [17.888058560281515, 46.89226406700879]
and transformed to EPSG:23700 defined with Proj4 definition string):
LIBRARY | forward_x | forward_y | inverse_x | inverse_y |
---|---|---|---|---|
proj4dart | 561651.8408065987 | 172658.61998377228 | 17.888058565574845 | 46.89226406698969 |
proj4js | 561651.8408065989 | 172658.61998377228 | 17.888058565574852 | 46.89226406698969 |
delta | 0.0000000002 | 0.0 | 0.000000000000007 | 0.0 |
In some cases also manual PostGIS testing (PostgreSQL 12.1, PostGIS 3.0.0 r17983) was performed such as the following (using EPSG:4326 point of [17.888058560281515, 46.89226406700879]
and transformed to EPSG:23700 defined with Proj4 definition string):
LIBRARY | forward_x | forward_y | inverse_x | inverse_y |
---|---|---|---|---|
proj4dart | 561651.8408065987 | 172658.61998377228 | 17.888058565574845 | 46.89226406698969 |
PostGIS | 561651.8408065987 | 172658.6199837724 | 17.88805856557482 | 46.8922640683514 |
delta | 0.0 | 0.00000000012 | 0.000000000000025 | 0.00000000136171 |
Authors #
Proj4dart was ported from proj4js by @maRci002 and Gergely Padányi-Gulyás (@fegyi001) at Ulyssys Ltd, Budapest, Hungary.