我想通过生成纬度和经度在地图上平均分配N个点。我是一个基于传单的网络地图,用于显示没有地理代表的功能。
点应位于Tchad顶部的灰色矩形中(对不起Tchad)。
不幸的是,这些标记最终出错了。
我有以下代码,我确信我在某处混合纬度和经度,但找不到位置。
(PS:我认为最终的代码对任何想要完成相同任务的人都很有用 - 只需在矩形中分配点数)
这是我的功能:
function distribute_points()
{
$articles = get_posts(
array(
'numberposts' => -1,
'post_status' => 'any',
'lang' => 'en',
)
);
// consts
$colsToRowsFactor = 5;
$minLat = 23.40; // x
$minLon = 16.8; // y
$maxLat = 4.8;
$maxLon = 20.9;
$lonRange = $maxLon - $minLon;
$latRange = $maxLat - $minLat;
$count = count($articles);
$cols = ceil( sqrt($count / $colsToRowsFactor));
$maxRows = ceil($count / $cols);
$lonIncrement = $lonRange / $cols;
$latIncrement = $latRange / $maxRows;
$i = 0;
$lat = $minLat;
$lon = $minLon;
foreach ($articles as $article) {
$i++;
echo $article->ID . ' ' . $article->post_title . ' ' . $lat . ' ' . $lon . PHP_EOL; //...
$lat += $latIncrement;
if ($i % $maxRows == 0) {
$lat = $minLat;
$lon += $lonIncrement;
echo '---------' . PHP_EOL;
}
$field_obj = get_field_object(
'location',
$article->ID,
array(
'load_value' => true
)
);
$value = $this->makeGeoJson( $lat, $lon );
update_field('location', $value, $article->ID);
}
}
不太重要
/**
* @param $lat
* @param $lon
*
* @return string
*/
protected function makeGeoJson( $lat, $lon ) {
return <<<JSON
{
"zoom_level":0,
"center":{
"lat":59.83598558292964,
"lng":-154.68749999999997
},
"markers":{
"m_31":{
"type":"Feature",
"properties":{
"popupContent":""
},
"geometry":{
"type":"Point",
"coordinates":[
$lat,
$lon
]
},
"id":31
}
},
"bounds":null,
"initial_bounds":{
"_southWest":{
"lat":2.39,
"lng":-25.73
},
"_northEast":{
"lat":24.93,
"lng":16.1
}
},
"drawnItems":{"type":"FeatureCollection","features":[]}
}
JSON;
}
}
更新:在地理Json的工作中切换lat和lon,但为什么呢?我以为GeoJSON使用lat,lon order?
function distribute_points()
{
$articles = get_posts(
array(
'numberposts' => -1,
'post_status' => 'any',
'lang' => 'en',
)
);
// consts
$colsToRowsFactor = 5;
$minLat = 23.40; // x
$minLon = 16.8; // y
$maxLat = 4.8;
$maxLon = 20.9;
$lonRange = $maxLon - $minLon;
$latRange = $maxLat - $minLat;
$count = count($articles);
$cols = ceil( sqrt($count / $colsToRowsFactor));
$maxRows = ceil($count / $cols);
$lonIncrement = $lonRange / $cols;
$latIncrement = $latRange / $maxRows;
$minLat += ($latIncrement / 2);
$lat = $minLat;
$lon = $minLon;
$i = 0;
foreach ($articles as $article) {
echo $article->ID . ' ' . $article->post_title . ' ' . $lat . ' ' . $lon . PHP_EOL; //...
if ($i != 0 && $i % $maxRows == 0) {
$lat = $minLat;
$lon += $lonIncrement;
echo '---------' . PHP_EOL;
} else {
$lat += $latIncrement;
}
$value = $this->makeGeoJson( $lon, $lat ); // switched lon and lat works, but why?
update_field('location', $value, $article->ID);
$i++;
}
}
答案 0 :(得分:3)
GeoJSON似乎使用[经度,纬度,高程]顺序。这就是为什么它在您切换纬度和经度时起作用。
以下来自this网站。
position是一个按顺序排列的坐标数组:这是我们可以真正认为是“一个地方”的最小单位,因为它可以代表地球上的一个点。 GeoJSON描述了坐标的顺序:它们应按顺序排列:
[longitude, latitude, elevation]
这个订单可能令人惊讶。从历史上看,坐标的顺序通常是“纬度,经度”,许多人会认为这是普遍存在的情况。浪费了很长时间讨论哪个更好,但对于这个讨论,我将总结如下: