test_geo_code - PHP Online
Form of PHP Sandbox
Enter Your PHP code here for testing/debugging in the Online PHP Sandbox. As in the usual PHP files, you can also add HTML, but do not forget to add the tag <?php
in the places where the PHP script should be executed.
Result of php executing
Full code of test_geo_code.php
- <?php
- class pointLocation {
- var $pointOnVertex = true; // Check if the point sits exactly on one of the vertices?
- function pointLocation() {
- }
- function pointInPolygon($point, $polygon, $pointOnVertex = true) {
- $this->pointOnVertex = $pointOnVertex;
- // Transform string coordinates into arrays with x and y values
- $point = $this->pointStringToCoordinates($point);
- $vertices = array();
- foreach ($polygon as $vertex) {
- $vertices[] = $this->pointStringToCoordinates($vertex);
- }
- // Check if the point sits exactly on a vertex
- if ($this->pointOnVertex == true and $this->pointOnVertex($point, $vertices) == true) {
- return "vertex";
- }
- // Check if the point is inside the polygon or on the boundary
- $intersections = 0;
- $vertices_count = count($vertices);
- for ($i=1; $i < $vertices_count; $i++) {
- $vertex1 = $vertices[$i-1];
- $vertex2 = $vertices[$i];
- if ($vertex1['y'] == $vertex2['y'] and $vertex1['y'] == $point['y'] and $point['x'] > min($vertex1['x'], $vertex2['x']) and $point['x'] < max($vertex1['x'], $vertex2['x'])) { // Check if point is on an horizontal polygon boundary
- return "boundary";
- }
- if ($point['y'] > min($vertex1['y'], $vertex2['y']) and $point['y'] <= max($vertex1['y'], $vertex2['y']) and $point['x'] <= max($vertex1['x'], $vertex2['x']) and $vertex1['y'] != $vertex2['y']) {
- $xinters = ($point['y'] - $vertex1['y']) * ($vertex2['x'] - $vertex1['x']) / ($vertex2['y'] - $vertex1['y']) + $vertex1['x'];
- if ($xinters == $point['x']) { // Check if point is on the polygon boundary (other than horizontal)
- return "boundary";
- }
- if ($vertex1['x'] == $vertex2['x'] || $point['x'] <= $xinters) {
- $intersections++;
- }
- }
- }
- // If the number of edges we passed through is odd, then it's in the polygon.
- if ($intersections % 2 != 0) {
- return "inside";
- } else {
- return "outside";
- }
- }
- function pointOnVertex($point, $vertices) {
- foreach($vertices as $vertex) {
- if ($point == $vertex) {
- return true;
- }
- }
- }
- function pointStringToCoordinates($pointString) {
- $coordinates = explode(" ", $pointString);
- return array("x" => $coordinates[0], "y" => $coordinates[1]);
- }
- }
- $pointLocation = new pointLocation();
- $a = [
- [
- 27.654320492097895,
- 49.804205674553145
- ],
- [
- 27.654370612214848,
- 49.80412674015787
- ],
- [
- 27.65426372239375,
- 49.80413705088512
- ],
- [
- 27.654131751380078,
- 49.8041487699507
- ],
- [
- 27.65417557714204,
- 49.80421843323501
- ],
- [
- 27.654320492097895,
- 49.804205674553145
- ]
- ];
- $polygon = array("-50 30","50 70","100 50","80 10","110 -10","110 -30","-20 -50","-30 -40","10 -10","-10 10","-30 -20","-50 30");
- // The last point's coordinates must be the same as the first one's, to "close the loop"
- echo $pointLocation->pointInPolygon('27.002909 49.412186', array_map(function($item){
- return join(' ',$item);
- },$a)) ;
File Description
- test_geo_code
- PHP Code
- 24 Jan-2020
- 3.89 Kb
You can Share it:
Latest PHP Pastes