jsor / geokit Goto Github PK
View Code? Open in Web Editor NEWGeo-Toolkit for PHP.
License: MIT License
Geo-Toolkit for PHP.
License: MIT License
I am trying to achieve something like this
https://stackoverflow.com/questions/56048358/using-php-find-nearest-point-in-polygon-from-a-given-point
Can this library help me do that? I did not find any relevant API in this library but may be I am missing something so please help, thanks in advance
believe the issue is with BoundingBox::shrink + BoundingBox::transformBoundingBox
Line 200 in 793e6f8
Line 219 in 793e6f8
example input to recreate:
$oBBox = BoundingBox::fromCoordinates([-118.45982654727163,33.858738223292775,-118.27313345274219,34.19377442763222]);
$fShrinkDistance = Distance::fromString('12km');
$oShrinkBBox = $oBBox->shrink($fShrinkDistance);
$oShrinkBox coords (note NE x is < SW x)
[$oShrinkBox] => Geokit\BoundingBox Object
(
[southWest:Geokit\BoundingBox:private] => Geokit\Position Object
(
[x:Geokit\Position:private] => -118.32986907162
[y:Geokit\Position:private] => 33.96665666694
)
[northEast:Geokit\BoundingBox:private] => Geokit\Position Object
(
[x:Geokit\Position:private] => -118.40360502789
[y:Geokit\Position:private] => 34.085855983985
)
)
the original method when passed with a positive shrink distance can result in minLon > maxLon. I added the additional check on lat just to be clear. Maybe there's something more elegant :D
below is my local fix
/**
* @see http://janmatuschek.de/LatitudeLongitudeBoundingCoordinates
*/
private static function transformBoundingBox(BoundingBox $bbox, float $distanceInMeters): BoundingBox
{
$latSW = deg2rad($bbox->southWest()->latitude());
$lngSW = deg2rad($bbox->southWest()->longitude());
$latNE = deg2rad($bbox->northEast()->latitude());
$lngNE = deg2rad($bbox->northEast()->longitude());
$angularDistance = $distanceInMeters / Earth::RADIUS;
$minLat = $latSW - $angularDistance;
$maxLat = $latNE + $angularDistance;
$fMinLat = min($minLat,$maxLat);
$fMaxLat = max($minLat,$maxLat);
$minLat = $fMinLat;
$maxLat = $fMaxLat;
$deltaLonSW = asin(sin($angularDistance) / cos($latSW));
$deltaLonNE = asin(sin($angularDistance) / cos($latNE));
$minLon = $lngSW - $deltaLonSW;
$maxLon = $lngNE + $deltaLonNE;
// asin can be neg Mark E.
$fMinLon = min($minLon,$maxLon);
$fMaxLon = max($minLon,$maxLon);
$minLon = $fMinLon;
$maxLon = $fMaxLon;
$positionSW = Position::fromXY(rad2deg($minLon), rad2deg($minLat));
$positionNE = Position::fromXY(rad2deg($maxLon), rad2deg($maxLat));
// Check if we're shrinking too much
if ($positionSW->latitude() > $positionNE->latitude()) {
$center = $bbox->center();
return BoundingBox::fromCornerPositions($center, $center);
}
return BoundingBox::fromCornerPositions($positionSW, $positionNE);
}
final result calling above vs shrink:
shrunken bbox coords -> [-118.40360502789,33.96665666694,-118.32986907162,34.085855983985];
Hi,
Just requesting a new release, I'm having to use dev-master via composer at the moment because 1.3 doesn't have methods like circle()
. A 1.4 release would make me feel better about future composer update
s.
Thanks for the awesome library!
bbox data:
[east] => -175.836411
[south] => -52.607582
[north] => -29.241097
[west] => 165.883774
Exception:
Bounding Box south-west coordinate cannot be north of the north-east coordinate
No position.php found in release v.1.3.0
Hey mate,
Thanks for this library. I was trying to use it in Laravel and have installed it via composer.
However, dumping my auto load does not pickup your library at all.
Any idea why it wouldn't?
Cheers
How about a polygon instance ? Should be great to calculate if a Coordinate is / isn't in it, like the Bound instance. Actually, the Bound instance will be a special case of the Polygon.
I seen it in league/geotools (https://github.com/thephpleague/geotools/blob/master/src/Polygon/Polygon.php), but your lib is great for domain model integration (no batch geocode, no cli ...)
What do you think of this Interface :
interface Geometry {
public static function input($input) : Geometry;
public function toGeoJson() : array;
}
We could standardize normalize method, and provide a toGeoJson() converter (good for api).
I'm trying to test if a point is inside a polygon and I'm wondering if I have found an issue or perhaps I've misread the docs. Would really appreciate your help here. I included a couple of dump and die's to show that my code appears to be correct. Thanks ahead of time.
use Geokit\Polygon;
use Geokit\Position;
$polygon = new Polygon(
new Position(125.2, 5512),
new Position(136.6, 5512),
new Position(139.7, 3880),
new Position(139.7, 3307),
new Position(129.9, 3307),
new Position(122, 4409),
);
$envelope = $polygon->close();
dd($polygon);
//Output
array:7 [
0 => Geokit\Position^ {#36
-x: 125.2
-y: 5512.0
}
1 => Geokit\Position^ {#1282
-x: 136.6
-y: 5512.0
}
2 => Geokit\Position^ {#1289
-x: 139.7
-y: 3880.0
}
3 => Geokit\Position^ {#1290
-x: 139.7
-y: 3307.0
}
4 => Geokit\Position^ {#1291
-x: 129.9
-y: 3307.0
}
5 => Geokit\Position^ {#1292
-x: 122.0
-y: 4409.0
}
6 => Geokit\Position^ {#1293
-x: 125.2
-y: 5512.0
}
]
$point = new Position(125.98652772609, 5374.0);
dd($point)
//Output
Geokit\Position^ {#1295
-x: 125.98652772609
-y: 5374.0
}
//This point should appear inside the $envelope.
//I've tested this in Excel as well
//as a Javascript geometric package to make sure.
$envelope->contains($point);
//false
Line 72 in 4252c0e
Working URL: https://wrf.ecse.rpi.edu/Research/Short_Notes/pnpoly.html
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.