league/geotools

PHP 7.3+ 地理相关工具库

1.2.0 2024-03-14 22:24 UTC

README

Geotools 是一个 PHP 地理相关库,基于 GeocoderReact 库构建。

Latest Version Total Downloads Quality Score

特性

  • 批量 地理编码和反向地理编码请求(系列/并行)对单个或一组提供者。 »
  • 缓存 地理编码和反向地理编码结果(PSR-6)以提高性能。 »
  • 在命令行界面(CLI)中计算地理编码和反向地理编码 + 输出器和格式化器。 »
  • 接受几乎所有类型的 WGS84 地理坐标 作为坐标。 »
  • 支持 23 个不同的椭球体,如果需要,可以轻松提供一个新的椭球体。 »
  • 转换格式化 十进制度数坐标到十进制度分或度分秒坐标。 »
  • 转换 十进制度数坐标到 通用横墨卡托 (UTM) 投影。 »
  • 使用 平面大圆哈弗辛文森蒂 算法计算两个坐标之间的距离(默认为米)、千米、英里或英尺。 »
  • 计算从起始坐标到目标坐标的初始和最终 方位角(度)。 »
  • 计算从起始坐标到目标坐标的初始和最终 方位点(方向),更多信息请参阅 维基百科»
  • 计算起点和目标坐标之间的 中点(坐标)。 »
  • 计算给定方位角和距离(米)的目标点(坐标)。 »
  • 将坐标编码为 geo hash 字符串并将其解码为坐标,更多信息请参阅 维基百科geohash.org»
  • 通过 10:10 算法对坐标进行编码。 »
  • 多边形 类提供了检查一个点(坐标)是否在多边形内部或在多边形边界上的方法。 »
  • DistancePointGeohashConvert 类提供 命令行界面(CLI)。 »
  • 框架集成:Laravel 4Silex ... »
  • ... 更多即将推出 ...

安装

Geotools 可在 Packagist 上找到。安装 Geotools 的推荐方法是使用 composer

在命令行运行以下命令

composer require league/geotools

重要:如果您使用 Geocoder 2.x 或/和 PHP 5.3,应使用 0.4 版本。

然后安装依赖项

composer install

现在您可以添加自动加载器,您将可以访问库

<?php

require 'vendor/autoload.php';

使用方法 & API

坐标 & 椭球体

默认的地理坐标系统是 WGS84,坐标以十进制度表示。

以下是可用的椭球体:AIRYAUSTRALIAN_NATIONALBESSEL_1841BESSEL_1841_NAMBIACLARKE_1866CLARKE_1880EVERESTFISCHER_1960_MERCURYFISCHER_1968GRS_1967GRS_1980HELMERT_1906HOUGHINTERNATIONALKRASSOVSKYMODIFIED_AIRYMODIFIED_EVERESTMODIFIED_FISCHER_1960SOUTH_AMERICAN_1969WGS60WGS66WGS72,和 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
// 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>
// convert in the UTM projection (standard format)
printf("%s\n", $converted->toUniversalTransverseMercator()); // 17T 589138 4477813

以下是映射

批量

它提供了一个非常方便的方法来批量地理编码和反向地理编码请求,可以是 系列并行 对一组提供者进行。归功于 GeocoderReact 库。

可以批量 一个请求(一个字符串)或一组 请求(一个数组)对一个 提供者 或一组 提供者 进行。

您可以使用提供的 缓存引擎 或使用自己的,通过设置一个缓存对象,该对象应实现 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 个结果(4 个值针对 6 个提供者)类似以下内容

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.
openstreetmap|Paris, France|POINT(2.352133 48.856506)
openstreetmap|Copenhagen, Denmark|POINT(12.570072 55.686724)
openstreetmap|74.200.247.59|Could not execute query http://nominatim.openstreetmap.org/search?q=74.200.247.59&format=xml&addressdetails=1&limit=1
openstreetmap|::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库文档了解详细信息。

距离

它提供了计算两个坐标之间距离的方法,默认为kmmift),使用flat(性能最高)、大圆haversinevincenty(最精确)算法。

这些坐标应在同一椭圆体上。

<?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

Geohash

它提供了获取坐标的地理哈希及其边界框坐标(西南 & 东北)和地理哈希的坐标及其边界框坐标(西南 & 东北)的方法。

<?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

您还可以获取关于相邻点的信息(图片)。

<?php

$geotools = new \League\Geotools\Geotools();

// decoding
$decoded = $geotools->geohash()->decode('spey61y');
// get neighbor geohash
printf("%s\n", $decoded->getNeighbor(\League\Geotools\Geohash\Geohash::DIRECTION_NORTH)); // spey64n
printf("%s\n", $decoded->getNeighbor(\League\Geotools\Geohash\Geohash::DIRECTION_SOUTH_EAST)); // spey61x
// get all neighbor geohashes
print_r($decoded->getNeighbors(true));
/**
 * Array
 * (
 *     [north] => spey64n
 *     [south] => spey61w
 *     [west] => spey61v
 *     [east] => spey61z
 *     [north_west] => spey64j
 *     [north_east] => spey64p
 *     [south_west] => spey61t
 *     [south_east] => spey61x
 * )
 */

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

CLI

它提供了命令行来计算由DistancePointGeohashConvert类提供的功能。感谢Symfony控制台组件

$ 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_mapsyahoomaxmind... 默认为google_maps。查看完整列表此处
  • --raw: 以RAW格式输出结果,显示适配器、提供者和任何参数。
  • --json: 以JSON字符串格式输出结果。
  • --args: 如果您的提供者需要或可以具有参数,此选项接受多个值(例如:--args="API_KEY" --args="LOCALE")。
  • --dumper: 此选项适用于地理编码,默认为gpxgeojsonkmlwkbwkt。更多信息此处
  • --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="openstreetmap"
// 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:

框架集成

单元测试

要运行单元测试,您需要安装cURL扩展和一组依赖项,您可以使用Composer安装它们

$ php composer.phar install --dev

安装后,只需运行以下命令

$ phpunit --coverage-text

致谢

感谢

变更日志

请查看变更日志文件

贡献

有关详细信息,请参阅CONTRIBUTING

支持

问题和功能请求在GitHub上跟踪

贡献者行为准则

作为本项目的贡献者和维护者,我们承诺尊重所有通过报告问题、发布功能请求、更新文档、提交拉取请求或补丁等方式做出贡献的人。

我们致力于让每个人都有无骚扰的参与体验,无论经验水平、性别、性别认同和表达、性取向、残疾、个人外观、体型、种族、年龄或宗教。

参与者不可接受的行为包括使用性语言或图像、侮辱性评论或人身攻击、捣乱、公开或私下骚扰、侮辱或其他不专业行为。

项目维护者有权利和责任删除、编辑或拒绝与该行为准则不一致的评论、提交、代码、维基编辑、问题和其他贡献。不遵守行为准则的项目维护者可能被从项目团队中移除。

可以通过打开问题或联系一个或多个项目维护者来报告滥用、骚扰或其他不可接受的行为。

此行为准则改编自贡献者契约,版本1.0.0,可在https://contributor-covenant.org/version/1/0/0/找到

许可证

Geotools 在MIT许可证下发布。有关详细信息,请参阅捆绑的LICENSE文件。

Bitdeli Badge