多边形中的geoPHP点

时间:2014-03-26 00:36:21

标签: php node.js geolocation

我需要一些帮助,谷歌让我难过

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

一切正常,除了像74.224074这样的点,96.428248对于这个多边形的方法包含,覆盖,覆盖等等总是假的。但一定是真的。

请告诉我原因。我很头疼。

OR

请告诉我,如何检查lat lng是否在多边形内。我在perl和php中测试了大约3个库,制作了我自己的代码等...但是我只能从javascript中的google containsLocation获得正确的结果。但我必须在服务器端使用它,而不是在浏览器中使用它。如果有机会在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);

这将是假的

修改 我想我明白了。 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));

5 个答案:

答案 0 :(得分:5)

我是geoPHP库的维护者(https://geophp.net)。你的纬度和经度混淆了。 WKT指定先x,然后y,然后(可选)z。这是有道理的,因为我们通常按XYZ顺序执行操作。

在数学上传统的水平轴是X,垂直轴是Y.如果我们想到一个球体覆盖在一张指定了X和Y轴的图纸上,我们可以看到经度是水平轴,对应于X,纬度是垂直轴,对应于Y.因此,将其读作“经度,纬度”非常有意义。

令人遗憾的是,这种敏感的方法与水手和其他制图师在整个历史中描述地球坐标的方式背道而驰。从历史上看,它经常被描述为“纬度,经度”。

这种历史与数学惯例的冲突是你在不同系统中看到不同惯例的原因。在谷歌地图API中它的“纬度,经度”,而在OpenLayers中它是“经度,纬度”。

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

答案 1 :(得分:1)

WKT格式需要POINT(lon, lat)lon为第一。你混淆了订单。校正:

geoPHP::load("POINT($lon $lat)","wkt");

答案 2 :(得分:0)

geoPHP中的所有高级方法都要求安装GEOS。如果您无法安装它但仍希望对点和多边形使用交叉测试,那么我已经分叉了geoPHP并为此目的添加了Polygon-> pointInPolygon和MultiPolygon-> pointInPolygon方法。看一看: https://github.com/sookoll/geoPHP

$point = \geoPHP::load('POINT (x y)','wkt');
$polygon = \geoPHP::load('POLYGON ((x y...))','wkt');
$point_is_in_polygon = $polygon->pointInPolygon($point);

答案 3 :(得分:0)

我已经回答了几乎相同的问题,但是不知道如何重新发布它,所以我在这里重复一下(对不起)

如果您使用此PHP库(https://github.com/xopbatgh/sb-polygon-pointer),它可以满足您的所有需求

(但首先您需要将GEOjson坐标转换为lat / lng)

计划做:

  1. 将多边形的坐标插入数组

  2. 问该库是该多边形内包含经/纬度的任意点

$polygonBox = [
    [55.761515, 37.600375],
    [55.759428, 37.651156],
    [55.737112, 37.649566],
    [55.737649, 37.597301],
];

$sbPolygonEngine = new sbPolygonEngine($polygonBox);

$isCrosses = $sbPolygonEngine->isCrossesWith(55.746768, 37.625605);

// $isCrosses is boolean

答案 4 :(得分:0)

经过数小时的努力,我无法使用contains方法来使用geoPHP。事实证明,如this SO response所述,geos库需要手动安装(无作曲家),在浏览archive.org上的文档后,我无法使用。 >

作为替代方案,我发现mjaschen/phpgeo很容易用于进行包含点的多边形计算。只需将对象加载到对象中,然后将包含方法调用为outlined in the documentation

$polygon = new Polygon();
$polygon->addPoint(new Coordinate(12.3, 41.51));
$polygon->addPoint(new Coordinate(28.83, 38.27));
$polygon->addPoint(new Coordinate(41.84, 32.55));

$point = new Coordinate(74.224074, 96.428248)

var_dump($polygon->contains($point))
相关问题