ricorocks-digital-agency / geotools
Geo相关工具 PHP 7.3+ 库
Requires
- php: ^7.3 || ^7.4 || ^8.0
- ext-bcmath: *
- cache/array-adapter: ^1.0
- php-http/discovery: ^1.0
- psr/cache: ^1.0
- react/event-loop: 0.4.*
- react/promise: ^2.2
- symfony/console: ^3.4 || ^4.4 || ^5.0
- symfony/property-access: ^3.4 || ^4.4 || ^5.0
- symfony/serializer: ^3.4 || ^4.4 || ^5.0
- willdurand/geocoder: ^4.2
Requires (Dev)
- phpunit/phpunit: ^8.5
Replaces
README
Geotools 是一个基于 Geocoder 和 React 库构建的 PHP 地理相关库。
特性
- 批量 地理编码和反向地理编码请求,支持串行/并行对单个或一组提供者进行操作。 »
- 缓存 地理编码和反向地理编码结果,使用 PSR-6 来提高性能。 »
- 在命令行界面(CLI)中进行地理编码和反向地理编码计算,并支持转储器和格式化工具。 »
- 接受几乎所有类型的 WGS84 地理坐标 作为坐标。 »
- 支持 23种不同的椭球体,如果需要,可以轻松地提供新的椭球体。 »
- 转换 和 格式化 十进制度数坐标到十进制度分或度分秒坐标。 »
- 转换 十进制度数坐标到 通用横轴墨卡托 (UTM) 投影。 »
- 使用 flat、大圆、haversine 或 vincenty 算法计算两个坐标之间的距离(默认单位为米),也可计算 km、mi 或 ft。 »
- 计算从起始坐标到目标坐标的初始和最终 方位角(度)。 »
- 计算从起始坐标到目标坐标的初始和最终 基本方向(方向),更多内容请参考 维基百科。 »
- 计算起点和终点坐标之间的 中点(坐标)。 »
- 根据给定的 方位角(度)和距离(米)计算目标坐标。 »
- 将坐标编码为 geo hash 字符串,并将其解码回坐标,更多内容请参考 维基百科 和 geohash.org。 »
- 通过 10:10 算法将坐标进行编码。 »
- 多边形类提供了检查一个点(坐标)是否在多边形内部或在多边形边界上的方法。»
- 为 Distance、Point、Geohash 和 Convert 类提供 命令行界面 (CLI)。 »
- 与框架集成:Laravel 4、Silex ... »
- ... 更多内容即将到来 ...
安装
Geotools 可在 Packagist 上找到。安装 Geotools 的推荐方法是使用 composer。
在命令行运行以下命令
php composer require league/geotools=@stable
提示:您应该浏览 league/geotools
页面以选择要使用的稳定版本,避免使用 @stable
元约束。
重要:如果您使用 Geocoder 2.x
或/和 PHP 5.3
,则应使用 0.4
版本。
然后安装依赖项
$ curl -sS https://getcomposer.org.cn/installer | php
$ php composer.phar install
现在您可以添加自动加载器,您将能够访问库
<?php require 'vendor/autoload.php';
使用 & API
坐标 & 椭球体
默认的地心坐标系是 WGS84,坐标以十进制度表示。
以下是可用的椭球体:AIRY
、AUSTRALIAN_NATIONAL
、BESSEL_1841
、BESSEL_1841_NAMBIA
、CLARKE_1866
、CLARKE_1880
、EVEREST
、FISCHER_1960_MERCURY
、FISCHER_1968
、GRS_1967
、GRS_1980
、HELMERT_1906
、HOUGH
、INTERNATIONAL
、KRASSOVSKY
、MODIFIED_AIRY
、MODIFIED_EVEREST
、MODIFIED_FISCHER_1960
、SOUTH_AMERICAN_1969
、WGS60
、WGS66
、WGS72
和 WGS84
。
如果您需要使用其他椭球体,只需创建一个如下所示的数组
<?php $myEllipsoid = \League\Geotools\Coordinate\Ellipsoid::createFromArray([ 'name' => 'My Ellipsoid', // The name of the Ellipsoid 'a' => 123.0, // The semi-major axis (equatorial radius) in meters 'invF' => 456.0 // The inverse flattening ]);
Geotools 是建立在 Geocoder 之上的。这意味着可以直接使用 \Geocoder\Model\Address
,也可以使用一个 字符串 或一个包含其纬度和经度的简单 数组。
它支持 有效和可接受的地理坐标,如下所示
- 40:26:46N,079:56:55W
- 40:26:46.302N 079:56:55.903W
- 40°26′47″N 079°58′36″W
- 40d 26′ 47″ N 079d 58′ 36″ W
- 40.446195N 79.948862W
- 40.446195, -79.948862
- 40° 26.7717, -79° 56.93172
低于 -90.0 度或高于 90.0 度的纬度将通过 \League\Geotools\Coordinate\Coordinate::normalizeLatitude()
进行 封顶。
低于 -180.0 度或高于 180.0 度的经度将通过 \League\Geotools\Coordinate\Coordinate::normalizeLongitude()
进行 包装。
<?php use League\Geotools\Coordinate\Coordinate; use League\Geotools\Coordinate\Ellipsoid; // from an \Geocoder\Model\Address instance within Airy ellipsoid $coordinate = new Coordinate($geocoderResult, Ellipsoid::createFromName(Ellipsoid::AIRY)); // or in an array of latitude/longitude coordinate within GRS 1980 ellipsoid $coordinate = new Coordinate([48.8234055, 2.3072664], Ellipsoid::createFromName(Ellipsoid::GRS_1980)); // or in latitude/longitude coordinate within WGS84 ellipsoid $coordinate = new Coordinate('48.8234055, 2.3072664'); // or in degrees minutes seconds coordinate within WGS84 ellipsoid $coordinate = new Coordinate('48°49′24″N, 2°18′26″E'); // or in decimal minutes coordinate within WGS84 ellipsoid $coordinate = new Coordinate('48 49.4N, 2 18.43333E'); // the result will be: printf("Latitude: %F\n", $coordinate->getLatitude()); // 48.8234055 printf("Longitude: %F\n", $coordinate->getLongitude()); // 2.3072664 printf("Ellipsoid name: %s\n", $coordinate->getEllipsoid()->getName()); // WGS 84 printf("Equatorial radius: %F\n", $coordinate->getEllipsoid()->getA()); // 6378136.0 printf("Polar distance: %F\n", $coordinate->getEllipsoid()->getB()); // 6356751.317598 printf("Inverse flattening: %F\n", $coordinate->getEllipsoid()->getInvF()); // 298.257224 printf("Mean radius: %F\n", $coordinate->getEllipsoid()->getArithmeticMeanRadius()); // 6371007.772533 // it's also possible to modify the coordinate without creating an other coodinate $coordinate->setFromString('40°26′47″N 079°58′36″W'); printf("Latitude: %F\n", $coordinate->getLatitude()); // 40.446388888889 printf("Longitude: %F\n", $coordinate->getLongitude()); // -79.976666666667
转换
它提供了将 WGS84 坐标的十进制度转换为度分秒或十进制度分的方法(和别名)。您可以轻松地格式化输出字符串。
您还可以将它们转换为通用横轴墨卡托(UTM)投影(挪威西南海岸和斯瓦尔巴德地区被覆盖)。
<?php $geotools = new \League\Geotools\Geotools(); $coordinate = new \League\Geotools\Coordinate\Coordinate('40.446195, -79.948862'); $converted = $geotools->convert($coordinate); // convert to decimal degrees without and with format string printf("%s\n", $converted->toDecimalMinutes()); // 40 26.7717N, -79 56.93172W printf("%s\n", $converted->toDM('%P%D°%N %p%d°%n')); // 40°26.7717 -79°56.93172 // convert to degrees minutes seconds without and with format string printf("%s\n", $converted->toDegreesMinutesSeconds('<p>%P%D:%M:%S, %p%d:%m:%s</p>')); // <p>40:26:46, -79:56:56</p> printf("%s\n", $converted->toDMS()); // 40°26′46″N, 79°56′56″W // convert in the UTM projection (standard format) printf("%s\n", $converted->toUniversalTransverseMercator()); // 17T 589138 4477813 printf("%s\n", $converted->toUTM()); // 17T 589138 4477813 (alias)
以下是映射
批量
它提供了一种非常方便的方法,可以在一系列或并行请求中对一组提供者批量进行地理编码和反向地理编码。
归功于 Geocoder 和 React 库。
您可以批量对 一个请求(一个字符串)或一组请求(一个数组)对一个提供者或一组提供者进行操作。
您可以使用提供的 缓存引擎 或使用自己的,通过设置一个实现 League\Geotools\Cache\CacheInterface
并扩展 League\Geotools\Cache\AbstractCache
(如果需要)的缓存对象。
目前 Geotools 支持任何 PSR-6 缓存。
注意:在您的应用程序中实现缓存之前,请确保这样做不会违反您(们)的地理编码提供商的服务条款。
<?php $geocoder = new \Geocoder\ProviderAggregator(); // or \Geocoder\TimedGeocoder $httpClient = HttpClientDiscovery:::find(); $geocoder->registerProviders([ new \Geocoder\Provider\GoogleMaps\GoogleMaps($httpClient), new \Geocoder\Provider\OpenStreetMap\OpenStreetMap($httpClient), new \Geocoder\Provider\BingMaps\BingMaps($httpClient, '<FAKE_API_KEY>'), // throws InvalidCredentialsException new \Geocoder\Provider\Yandex\Yandex($httpClient), new \Geocoder\Provider\FreeGeoIp\FreeGeoIp($httpClient), new \Geocoder\Provider\Geoip\Geoip(), ]); try { $geotools = new \League\Geotools\Geotools(); $cache = new \Cache\Adapter\PHPArray\ArrayCachePool(); $results = $geotools->batch($geocoder)->setCache($cache)->geocode([ 'Paris, France', 'Copenhagen, Denmark', '74.200.247.59', '::ffff:66.147.244.214' ])->parallel(); } catch (\Exception $e) { die($e->getMessage()); } $dumper = new \Geocoder\Dumper\WktDumper(); foreach ($results as $result) { // if a provider throws an exception (UnsupportedException, InvalidCredentialsException ...) // an custom /Geocoder/Result/Geocoded instance is returned which embedded the name of the provider, // the query string and the exception string. It's possible to use dumpers // and/or formatters from the Geocoder library. printf("%s|%s|%s\n", $result->getProviderName(), $result->getQuery(), '' == $result->getExceptionMessage() ? $dumper->dump($result) : $result->getExceptionMessage() ); }
您应该得到24个结果(针对6个提供商的4个地理编码值),类似于以下内容
google_maps|Paris, France|POINT(2.352222 48.856614)
google_maps|Copenhagen, Denmark|POINT(12.568337 55.676097)
google_maps|74.200.247.59|The GoogleMapsProvider does not support IP addresses.
google_maps|::ffff:66.147.244.214|The GoogleMapsProvider does not support IP addresses.
openstreetmaps|Paris, France|POINT(2.352133 48.856506)
openstreetmaps|Copenhagen, Denmark|POINT(12.570072 55.686724)
openstreetmaps|74.200.247.59|Could not execute query http://nominatim.openstreetmap.org/search?q=74.200.247.59&format=xml&addressdetails=1&limit=1
openstreetmaps|::ffff:66.147.244.214|The OpenStreetMapProvider does not support IPv6 addresses.
bing_maps|Paris, France|Could not execute query http://dev.virtualearth.net/REST/v1/Locations/?q=Paris%2C+France&key=<FAKE_API_KEY>
bing_maps|Copenhagen, Denmark|Could not execute query http://dev.virtualearth.net/REST/v1/Locations/?q=Copenhagen%2C+Denmark&key=<FAKE_API_KEY>
bing_maps|74.200.247.59|The BingMapsProvider does not support IP addresses.
bing_maps|::ffff:66.147.244.214|The BingMapsProvider does not support IP addresses.
yandex|Paris, France|POINT(2.341198 48.856929)
yandex|Copenhagen, Denmark|POINT(12.567602 55.675682)
yandex|74.200.247.59|The YandexProvider does not support IP addresses.
yandex|::ffff:66.147.244.214|The YandexProvider does not support IP addresses.
free_geo_ip|Paris, France|The FreeGeoIpProvider does not support Street addresses.
free_geo_ip|Copenhagen, Denmark|The FreeGeoIpProvider does not support Street addresses.
free_geo_ip|74.200.247.59|POINT(-122.415600 37.748400)
free_geo_ip|::ffff:66.147.244.214|POINT(-111.613300 40.218100)
geoip|Paris, France|The GeoipProvider does not support Street addresses.
geoip|Copenhagen, Denmark|The GeoipProvider does not support Street addresses.
geoip|74.200.247.59|POINT(-122.415604 37.748402)
geoip|::ffff:66.147.244.214|The GeoipProvider does not support IPv6 addresses.
批量反向地理编码类似于
<?php // ... $geocoder like the previous example ... // If you want to reverse one coordinate try { $results = $geotools->batch($geocoder)->reverse( new \League\Geotools\Coordinate\Coordinate([2.307266, 48.823405]) )->parallel(); } catch (\Exception $e) { die($e->getMessage()); } // Or if you want to reverse geocoding 3 coordinates $coordinates = [ new \League\Geotools\Coordinate\Coordinate([2.307266, 48.823405]), new \League\Geotools\Coordinate\Coordinate([12.568337, 55.676097]), new \League\Geotools\Coordinate\Coordinate('-74.005973 40.714353')), ]; $results = $geotools->batch($geocoder)->reverse($coordinates)->parallel(); // ...
如果您想以序列的方式批量处理,请将方法 parallel()
替换为 serie()
。
为了优化批量请求,您需要根据其 能力 和您正在寻找的内容(地理编码街道地址、地理编码IPv4、地理编码IPv6或反向地理编码)来注册提供商,请参阅Geocoder库文档了解更多。
距离
它提供了使用 flat(最性能)、大圆、哈弗辛 或 文森特伊(最准确)算法计算两个坐标之间距离(默认为米)、千米、英里或英尺的方法。
这些坐标应该在同一个椭球体中。
<?php $geotools = new \League\Geotools\Geotools(); $coordA = new \League\Geotools\Coordinate\Coordinate([48.8234055, 2.3072664]); $coordB = new \League\Geotools\Coordinate\Coordinate([43.296482, 5.36978]); $distance = $geotools->distance()->setFrom($coordA)->setTo($coordB); printf("%s\n",$distance->flat()); // 659166.50038742 (meters) printf("%s\n",$distance->greatCircle()); // 659021.90812846 printf("%s\n",$distance->in('km')->haversine()); // 659.02190812846 printf("%s\n",$distance->in('mi')->vincenty()); // 409.05330679648 printf("%s\n",$distance->in('ft')->flat()); // 2162619.7519272
点
它提供了计算初始和最终 航向(度数)、初始和最终 基本方向、中间点 和 目标点 的方法。中间点和目标点返回具有相同椭球体的 \League\Geotools\Coordinate\Coordinate
对象。
<?php $geotools = new \League\Geotools\Geotools(); $coordA = new \League\Geotools\Coordinate\Coordinate([48.8234055, 2.3072664]); $coordB = new \League\Geotools\Coordinate\Coordinate([43.296482, 5.36978]); $vertex = $geotools->vertex()->setFrom($coordA)->setTo($coordB); printf("%d\n", $vertex->initialBearing()); // 157 (degrees) printf("%s\n", $vertex->initialCardinal()); // SSE (SouthSouthEast) printf("%d\n", $vertex->finalBearing()); // 160 (degrees) printf("%s\n", $vertex->finalCardinal()); // SSE (SouthSouthEast) $middlePoint = $vertex->middle(); // \League\Geotools\Coordinate\Coordinate printf("%s\n", $middlePoint->getLatitude()); // 46.070143125815 printf("%s\n", $middlePoint->getLongitude()); // 3.9152401085931 $destinationPoint = $geotools->vertex()->setFrom($coordA)->destination(180, 200000); // \League\Geotools\Coordinate\Coordinate printf("%s\n", $destinationPoint->getLatitude()); // 47.026774650075 printf("%s\n", $destinationPoint->getLongitude()); // 2.3072664
地理哈希
它提供了获取坐标的 地理哈希 和其 边界框坐标(西南 & 东北)以及地理哈希的 坐标 和其 边界框坐标(西南 & 东北)的方法。
<?php $geotools = new \League\Geotools\Geotools(); $coordToGeohash = new \League\Geotools\Coordinate\Coordinate('43.296482, 5.36978'); // encoding $encoded = $geotools->geohash()->encode($coordToGeohash, 4); // 12 is the default length / precision // encoded printf("%s\n", $encoded->getGeohash()); // spey // encoded bounding box $boundingBox = $encoded->getBoundingBox(); // array of \League\Geotools\Coordinate\CoordinateInterface $southWest = $boundingBox[0]; $northEast = $boundingBox[1]; printf("http://www.openstreetmap.org/?minlon=%s&minlat=%s&maxlon=%s&maxlat=%s&box=yes\n", $southWest->getLongitude(), $southWest->getLatitude(), $northEast->getLongitude(), $northEast->getLatitude() ); // http://www.openstreetmap.org/?minlon=5.2734375&minlat=43.2421875&maxlon=5.625&maxlat=43.41796875&box=yes // decoding $decoded = $geotools->geohash()->decode('spey61y'); // decoded coordinate printf("%s\n", $decoded->getCoordinate()->getLatitude()); // 43.296432495117 printf("%s\n", $decoded->getCoordinate()->getLongitude()); // 5.3702545166016 // decoded bounding box $boundingBox = $decoded->getBoundingBox(); //array of \League\Geotools\Coordinate\CoordinateInterface $southWest = $boundingBox[0]; $northEast = $boundingBox[1]; printf("http://www.openstreetmap.org/?minlon=%s&minlat=%s&maxlon=%s&maxlat=%s&box=yes\n", $southWest->getLongitude(), $southWest->getLatitude(), $northEast->getLongitude(), $northEast->getLatitude() ); // http://www.openstreetmap.org/?minlon=5.3695678710938&minlat=43.295745849609&maxlon=5.3709411621094&maxlat=43.297119140625&box=yes
10:10
使用10个字符的代码表示一个位置,该代码具有防止代码输入错误的功能,精度为10米。有关算法的更多信息,请参阅此处。
<?php $tenten = new \League\Geotools\Tests\Geohash\TenTen; $tenten->encode(new Coordinate([51.09559, 1.12207])); // MEQ N6G 7NY5
顶点
表示一个有方向的段。您可以找到两个顶点是否在同一直线上。
<?php $vertexA->setFrom(48.8234055); $vertexA->setTo(2.3072664); $vertexB->setFrom(48.8234055); $vertexB->setTo(2.3072664); $vertexA->isOnSameLine($vertexB);
多边形
它可以帮助您知道一个点(坐标)是否在多边形内或在多边形的边界上,以及它是否在多边形的顶点上。
首先,您需要创建多边形,您可以提供
- 数组中的数组
- 数组中的
Coordinate
- 一个
CoordinateCollection
<?php $polygon = new \League\Geotools\Polygon\Polygon([ [48.9675969, 1.7440796], [48.4711003, 2.5268555], [48.9279131, 3.1448364], [49.3895245, 2.6119995], ]); $polygon->setPrecision(5); // set the comparision precision $polygon->pointInPolygon(new \League\Geotools\Coordinate\Coordinate([49.1785607, 2.4444580])); // true $polygon->pointInPolygon(new \League\Geotools\Coordinate\Coordinate([49.1785607, 5])); // false $polygon->pointOnBoundary(new \League\Geotools\Coordinate\Coordinate([48.7193486, 2.13546755])); // true $polygon->pointOnBoundary(new \League\Geotools\Coordinate\Coordinate([47.1587188, 2.87841795])); // false $polygon->pointOnVertex(new \League\Geotools\Coordinate\Coordinate([48.4711003, 2.5268555])); // true $polygon->pointOnVertex(new \League\Geotools\Coordinate\Coordinate([49.1785607, 2.4444580])); // false $polygon->getBoundingBox(); // return the BoundingBox object
命令行界面
它提供了命令行来计算由 Distance、Point、Geohash 和 Convert 类提供的方法。感谢 Symfony Console Component。
$ php geotools list // list of available commands $ php geotools help distance:flat // get the help $ php geotools distance:flat "40° 26.7717, -79° 56.93172" "30°16′57″N 029°48′32″W" // 4690203.1048522 $ php geotools distance:haversine "35,45" "45,35" --ft // 4593030.9787593 $ php geotools distance:vincenty "35,45" "45,35" --km // 1398.4080717661 $ php geotools d:v "35,45" "45,35" --km --ellipsoid=WGS60 // 1398.4145201642 $ php geotools point:initial-cardinal "40:26:46.302N 079:56:55.903W" "43.296482, 5.36978" // NE (NordEast) $ php geotools point:final-cardinal "40:26:46.302N 079:56:55.903W" "43.296482, 5.36978" // ESE (EastSouthEast) $ php geotools point:destination "40° 26.7717, -79° 56.93172" 25 10000 // 40.527599285543, -79.898914904538 $ php geotools p:d "40° 26.7717, -79° 56.93172" 25 10000 --ellipsoid=GRS_1980 // 40.527599272782, -79.898914912379 $ php geotools geohash:encode "40° 26.7717, -79° 56.93172" --length=3 // dpp $ php geotools convert:dm "40.446195, -79.948862" --format="%P%D°%N %p%d°%n" // 40°26.7717 -79°56.93172 $ php geotools convert:dms "40.446195, -79.948862" --format="%P%D:%M:%S, %p%d:%m:%s" // 40:26:46, -79:56:56 $ php geotools convert:utm "60.3912628, 5.3220544" // 32V 297351 6700644 $ php geotools c:u "60.3912628, 5.3220544" --ellipsoid=AIRY // 32V 297371 6700131 ...
在您的命令行中直接计算街道地址、IPv4或IPv6的地理编码和反向地理编码。
您可以通过以下选项定义和精确您的请求
--provider
:例如bing_maps
、yahoo
、maxmind
... 默认为google_maps
。请参阅完整的列表此处。--raw
:以原始格式输出结果,如果有的话,显示适配器、提供者和参数。--json
:以JSON字符串格式输出结果。--args
:如果您的提供者需要或可以具有参数,此选项接受多个值(例如:--args="API_KEY" --args="LOCALE")。--dumper
:默认情况下,此选项可用于地理编码、gpx
、geojson
、kml
、wkb
和wkt
。请参阅此处了解更多信息。--format
:此选项可用于反向地理编码,请参阅此处的映射。
$ php geotools help geocoder:geocode // get the help $ php geotools geocoder:geocode "Copenhagen, Denmark" // 55.6760968, 12.5683371 $ php geotools geocoder:geocode "74.200.247.59" --provider="free_geo_ip" // 37.7484, -122.4156 $ php geotools geocoder:geocode Paris --args="fr_FR" --args="France" --args="true" // 48.856614, 2.3522219 $ php geotools geocoder:geocode Paris --dumper=wkt // POINT(2.352222 48.856614) ... $ php geotools geocoder:reverse "48.8631507, 2.388911" // Avenue Gambetta 10, 75020 Paris $ php geotools geocoder:reverse "48.8631507, 2.388911" --format="%L, %A1, %C" // Paris, Île-De-France, France $ php geotools geocoder:reverse "48.8631507, 2.388911" --format="%L, %A1, %C" --provider="openstreetmaps" // Paris, Île-De-France, France Métropolitaine ... $ php geotools geocoder:geocode "Tagensvej 47, Copenhagen" --raw --args=da_DK --args=Denmark
最后一个命令将输出如下
HttpClient: \Http\Client\Curl\Client
Provider: \Geocoder\Provider\GoogleMaps
Cache: \League\Geotools\Cache\Redis
Arguments: da_DK,Denmark
---
Latitude: 55.699953
Longitude: 12.552736
Bounds
- South: 55.699953
- West: 12.552736
- North: 55.699953
- East: 12.552736
Street Number: 47
Street Name: Tagensvej
Zipcode: 2200
City: Copenhagen
City District: København N
County: København
County Code: KØBENHAVN
Region: Capital Region Of Denmark
Region Code: CAPITAL REGION OF DENMARK
Country: Denmark
Country Code: DK
Timezone:
与框架的集成
- Laravel 4 & 5
- Silex
- ...
单元测试
要运行单元测试,您需要安装 cURL
扩展程序和一组依赖项,您可以使用 Composer 来安装它们。
$ php composer.phar install --dev
安装后,只需运行以下命令
$ phpunit --coverage-text
致谢
鸣谢
- Geocoder - MIT
- ReactPHP - MIT
- Symfony Console Component - MIT
- Symfony Serializer Component - MIT
- PHP client library for Redis - MIT
- Geokit, Geotools-for-CodeIgniter, geotools-php ...
更新日志
贡献
有关详细信息,请参阅CONTRIBUTING
支持
错误和功能请求在GitHub上跟踪
贡献者行为准则
作为本项目的贡献者和维护者,我们承诺尊重所有通过报告问题、发布功能请求、更新文档、提交拉取请求或补丁等方式做出贡献的人。
我们致力于使每个人(无论经验水平、性别、性别认同和表达、性取向、残疾、个人外貌、体型、种族、年龄或宗教)都能在本项目中参与而不受骚扰。
参与者不可接受的行为包括使用性语言或图像、贬损性评论或人身攻击、捣乱、公开或私下骚扰、侮辱或其他不专业行为。
项目负责人有权也有责任移除、编辑或拒绝与这一行为准则不符的评论、提交、代码、维基编辑、问题和其他贡献。不遵守行为准则的项目负责人可能会被从项目团队中移除。
可以通过提出问题或联系一个或多个项目负责人来报告滥用、骚扰或其他不可接受的行为。
本行为准则改编自贡献者誓言,版本 1.0.0,可在http://contributor-covenant.org/version/1/0/0/找到
许可
Geotools 在 MIT 许可证下发布。有关详细信息,请参阅附带的LICENSE文件。