geoPHP指向多边形

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

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

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

请告诉我为什么。 我头痛了

要么

请告诉我,如何检查经纬度在多边形内。 我testing了perl和php中的3个库,使我自己的代码等…但正确的结果,我只从谷歌containsLocation在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); 

这将是错误的

编辑:我想我明白了。 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)); 

WKT格式期望POINT(lon, lat)lon是第一个。 你混淆了这个命令。 更正:

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

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

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

令人遗憾的是,这种感官方式倒退于水手和其他制图学家在整个历史中描述地球上的坐标的方式。 历史上它经常被描述为“纬度,经度”。

历史与math公约的冲突就是为什么你在不同的系统中看到不同的约定。 在Google Maps API中,“纬度,经度”,而在OpenLayers中是“经度,纬度”。

在这种情况下,您正在使用WKT,在“经度,纬度”顺序中指定。

geoPHP中的所有高级方法都要求安装GEOS。 如果你不能安装它,但仍然想要使用点和多边形的相交testing,那么我已经分叉了geoPHP并为此添加了Polygon-> pointInPolygon和MultiPolygon-> pointInPolygon方法。 看看: https : //github.com/sookoll/geoPHP

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