Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Changing visibility method from private to protected #24

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open

Changing visibility method from private to protected #24

wants to merge 1 commit into from

Conversation

OleksandrWebLab
Copy link

@OleksandrWebLab OleksandrWebLab commented Feb 5, 2021

Hi. I found one problem when switching between different databases.

My code:

GeometryEngineRegistry::set(new PDOEngine($pdo));

$cs = CoordinateSystem::xy(4326);

$polygon = new Polygon($cs, ...[
    new LineString($cs, ...[
        new Point($cs, 0, 0),
        new Point($cs, 0, 1),
        new Point($cs, 1, 1),
        new Point($cs, 1, 0),
        new Point($cs, 0, 0),
    ]),
]);

$area = $polygon->area();

A request similar to this is being executed:

SELECT ST_Area(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))', 4326));

MySQL returns 12308778368.75034 sq meters; PostgreSQL returns 1

But if I want to get square meters from PostgreSQL, I need to add the true parameter to the ST_Area function. But this parameter results in an error for MySQL

SELECT ST_Area(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))', 4326), true);

In this case, PgSQL returns a result very close to MySQL
MySQL: 12308778368.75034
PgSQL: 12308778361.469454

To solve this problem I decided to inherit the class and override the area method for PostgreSQL

use Brick\Geo\Engine\PDOEngine;
use Brick\Geo\Geometry;

class PostgreSQLEngine extends PDOEngine
{
    /**
     * @inheritDoc
     */
    public function area(Geometry $g): float
    {
        return $this->queryFloat('ST_Area', $g, true);
    }
}

@BenMorel
Copy link
Member

BenMorel commented Feb 8, 2021

Hi, this class wasn't designed to be extended, although I definitely agree that your use case is valid, given the non-support for PostGIS geographies at the moment.

That being said, I'd be more interested in finding a way for the library to natively support PostGIS geographies, by automatically applying ST_GeographyFromText() instead of ST_GeomFromText(), depending, for example, on the SRID in use.

If the input is a Geography, I can see in the docs for ST_Area() that the calculation is done on the spheroid by default, so you wouldn't even need to pass an extra parameter to ST_Area() as far as I understand.

Basically, if we transparently used Geographies on PostGIS for a specific SRID (4326, I don't know if there are others), we could align PostGIS' behaviour with that of MySQL. I suggested the same thing in #23 just a few days ago.

What do you think? Are there any cases when you'd want to use SRID 4326 but want the calculation results in square degrees?

@OleksandrWebLab
Copy link
Author

OleksandrWebLab commented Feb 8, 2021

Hi, thanks for the reply.

I recently started working with geography, and I wish I didn't have to think about what SRIDs are, what they are, and so on. I just want to call the function $polygon->areaSpheroid() and get the area in square meters, let the library default to SRID 4326, but I should be able to change this SRID if necessary.

I searched a bit and found this site: https://epsg.io/?q=, here is a complete list of all SRIDs that exist, and for each SRID there are many options to install. For example, here is the description for SRID 4326:

image

The SRID 4326 setup looks like this:

GEOGCS["WGS 84",
    DATUM["WGS_1984",
        SPHEROID["WGS 84",6378137,298.257223563,
            AUTHORITY["EPSG","7030"]],
        AUTHORITY["EPSG","6326"]],
    PRIMEM["Greenwich",0,
        AUTHORITY["EPSG","8901"]],
    UNIT["degree",0.0174532925199433,
        AUTHORITY["EPSG","9122"]],
    AUTHORITY["EPSG","4326"]]

where 6378137 - is the radius of the Earth

For example, I found the standard 'ERSI 104905', it describes the coordinate system of Mars:

GEOGCS["GCS_Mars_2000",
    DATUM["D_Mars_2000",
        SPHEROID["Mars_2000_IAU_IAG",3396190.0,169.8944472236118]],
    PRIMEM["Reference_Meridian",0.0],
    UNIT["Degree",0.0174532925199433]
]

Sources:
https://www.esri.com/arcgis-blog/products/3d-gis/3d-gis/to-infinity-and-beyond-arcgis-online-now-supports-extraterrestrial-mapping/
https://developers.arcgis.com/javascript/3/jshelp/gcs.html
https://docs.geotools.org/stable/javadocs/org/opengis/referencing/doc-files/WKT.html
Therefore, I want the library to remain flexible.

By the way, thanks for the library, it's very cool), I tried about 3 packages before finding yours, and I like everything about it)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants