geoPHP点在多边形中

use*_*842 3 php geolocation node.js

我需要一些帮助,谷歌让我伤心

我得到了多边形http://geojson.io/#id=gist:anonymous/069b8a955897723ca256&map=4/58.75/48.03 它涵盖了很多内容。我得到了geoPHP库https://github.com/phayes/geoPHP, 其中包含方法,包括,覆盖,coveredBy ...

一切正常,除了对于该多边形的方法contains,coveredBy,covers等而言,74.224074、96.428248之类的点始终为false。但这一定是真的。

请告诉我为什么。我头疼

要么

请告诉我,如何检查纬度是否在多边形内。我在perl和php中测试了大约3个库,制作了自己的代码,等等。。。但是我只从Google javascript中获取了正确的结果。但是我必须在服务器端而不是浏览器中使用它。如果有机会在nodejs中使用containsLocation,那就太好了。

谢谢

A little code for geoPHP:
$a='JSON FROM LINK';
$b=geoPHP::load("POINT(74.224074 96.428248)","wkt");
$a=geoPHP::load($a, 'json');
$result=$a->contains($b);

var_dump($result);
Run Code Online (Sandbox Code Playgroud)

这将是错误的

编辑: 我想我明白了。GeoJson用错误的方式,经度,纬度来制作坐标。但是必须是纬度,经度。会尝试,然后在这里写,如果可行

回答:

使用此www.birdtheme.org/useful/v3tool.html在地图上制作多边形。以正确的方式(纬度,经度)

geoPHP的工作代码:

    include_once('geoPHP.inc');
$addr=file_get_contents('https://maps.googleapis.com/maps/api/geocode/json?address='.urlencode($_GET['address']).'&sensor=false');
foreach($addr->{results} as $addr1)
{
if(array_key_exists("geometry",$addr1)){
$lat=$addr1->{geometry}->{location}->{lat};
$lng=$addr1->{geometry}->{location}->{lng};



break;
}
}
$point1 = geoPHP::load("POINT($lat $lng)","wkt");

$ya200=geoPHP::load("POLYGON((41.51 12.3, 38.27 28.83, 32.55 41.84, 27.6 55.55, 29.54 71.37, 33.43 83.32, 36.6 94.92, 36.6 99.49, 35.17 111.45, 32.55 124.8, 35.17 130.78, 39.64 142.73, 43.58 152.58, 45.83 166.29, 56.17 163.83, 63.07 159.26, 68.66 154.69, 72.18 148.71, 75.93 140.63, 78.49 129.02, 80.3 114.26, 80.98 100.2, 81.2 87.54, 80.87 73.83, 79.62 59.41, 76.27 40.43, 71.07 28.13, 67.2 23.2, 63.55 20.04, 59.01 17.23, 54.16 15.12, 48.46 13.36,41.51 12.3))","wkt");


var_dump($ya200->contains($point1));
Run Code Online (Sandbox Code Playgroud)

pha*_*yes 6

我是geoPHP库(https://geophp.net)的维护者。您的经纬度混合了。WKT指定x首先出现,然后是y,然后是(可选)z。这很有意义,因为我们通常按XYZ顺序进行操作。

在数学上,水平轴是X,垂直轴是Y是数学上的常规做法。如果我们想到在指定了X和Y轴的方格纸上覆盖地球仪,我们可以看到经度是水平轴,对应于X,纬度是垂直轴,对应于Y。因此将其读为“经度,纬度”是很有意义的。

遗憾的是,这种明智的方法与水手和其他制图师在整个历史中描述地球坐标的方式相反。从历史上讲,它经常被描述为“纬度,经度”。

历史与数学惯例之间的这种冲突是为什么您在不同的系统中看到不同的约定的原因。在Google Maps API中,它是“经度”,而在OpenLayers中是“经度”。

在这种情况下,您使用的是WKT,它以“经度,纬度”顺序指定。


小智 2

WKT 格式期望POINT(lon, lat), 为lon第一个。你搞混了顺序。更正:

geoPHP::load("POINT($lon $lat)","wkt");
Run Code Online (Sandbox Code Playgroud)